记录一下从官方第三人称模板简化出来的角色移动控制。

实现效果

最终实现的效果是,当按下w时,角色向当前相机方向移动;按ad时,向当前相机方向左右转;按s时向相机移动。

角色控制演示

环境

unity2021.3.5f1c1版本普通3d工程
插件使用到了cinemachine2.8.6,视频中的相机移动为cinemachine的自由视角相机,但不重要

进入正题


一个简单的场景

角色上挂载了Animator(用于控制移动动画),Character Controller(unity自带的角色控制器),Player Controller(自己写的控制脚本)

角色的动画状态机,当speed大于0.3时从站立状态转移到移动状态,移动状态由一个混合了走路和奔跑的混合树完成。在脚本中通过对speed赋值来控制角色移动。

然后是代码部分

   public Camera playerFollowCamera;public Animator animator;[Tooltip("How fast the character turns to face movement direction")][Range(0.0f, 0.3f)]public float RotationSmoothTime = 0.12f;

声明公开变量

   private float _rotationVelocity;private float _targetRotation = 0.0f;private CharacterController _controller;private int _aniId_speed;private int _aniId_hurt;private int _aniId_atk;private int _aniId_beHit;

私有变量,包括了角色控制器、运动参数和状态机参数的id

   // Start is called before the first frame updatevoid Start(){InitComponents();InitAnimator();}// Update is called once per framevoid Update(){PlayerMove();}

在start中获取角色控制器,并计算出状态机参数的哈希值,在update中调用移动函数

   private void InitComponents(){_controller = GetComponent<CharacterController>();}private void InitAnimator(){_aniId_speed = Animator.StringToHash("speed");_aniId_atk = Animator.StringToHash("atk");_aniId_hurt = Animator.StringToHash("hurt");_aniId_beHit = Animator.StringToHash("be hit");}

角色移动函数

   private void PlayerMove(){var ad = Input.GetAxis("Horizontal");var ws = Input.GetAxis("Vertical");if (ad == 0 && ws == 0) return;Vector3 inputDirection = new Vector3(ad, 0.0f, ws).normalized;_targetRotation = Mathf.Atan2(inputDirection.x, inputDirection.z) * Mathf.Rad2Deg + playerFollowCamera.transform.eulerAngles.y;float rotation = Mathf.SmoothDampAngle(transform.eulerAngles.y, _targetRotation, ref _rotationVelocity, RotationSmoothTime);transform.rotation = Quaternion.Euler(0.0f, rotation, 0.0f);Vector3 targetDirection = Quaternion.Euler(0.0f, _targetRotation, 0.0f) * Vector3.forward;// move the player_controller.Move(targetDirection.normalized * Time.deltaTime);animator.SetFloat(_aniId_speed, new Vector3(ad, 0, ws).magnitude);}

获取两个轴的输入,当玩家有输入时,进行旋转和移动。不进行是否有输入的判断的话,会出现相机移动角色自动跟随转变方向的效果。
然后计算出要转动的角度。使用了平滑过度,可以根据需要调整RotationSmoothTime和_rotationVelocity
再计算出欧拉角与forward做乘算,就得到了带有合适转动的位移向量。
因为角色应用了根运动,跑动的位移由动画控制,所以直接调用控制器的move即可,不需要在这里指定移动速度。
最后设置动画状态机的参数,让角色播放移动动画。

实现根据相机视角输入WASD移动和转向的功能相关推荐

  1. Cesium 相机视角控制

    基于Cesium 开发实际功能的时候,需要调整或者固定相机视角,支持用户完成操作.今天也遇到类似的需求,记录一下. 3D视图中 控制视角平移:scene.screenSpaceCameraContro ...

  2. Unity3D中,鼠标控制相机视角并且跟随玩家的几种方法(第三人称)的学习整理

    第一种,  按住鼠标的右键进行移动视角,同时滚轮调正视角大小. public Transform target; //相机追随目标public float xSpeed = 200; //X轴方向拖动 ...

  3. 将Unity虚拟相机视角画面显示在一个平面上

    一.无需代码: 1.在Project视图中新建一个 Render Texture 2.将其拖动到新建 Camera 的 Target Texture上 3.调整相机视角 4.新建一个Plane,将虚拟 ...

  4. Unity双相机Camera,将虚拟相机视角画面显示在平面Plane上

    Unity双相机Camera,将虚拟相机视角画面显示在平面Plane上 场景中通过添加Render Texture实现 通过挂脚本实现 转载链接 场景中通过添加Render Texture实现 1.场 ...

  5. vue2 使用 cesium 【第二篇-相机视角移动+添加模型】

    vue2 使用 cesium [第二篇-相机视角移动+添加模型] 搞了一阵子 cesium,小白入门,这东西很牛逼,但是感觉这东西好费劲啊!网上资料不多,每个人的用法又不一样,操作起来真的是绝绝子.之 ...

  6. Gazebo urdf kinetic RGBD camera 相机视角和点云视角不一致

    1. 错误现象: 在urdf 中使用 libgazebo_ros_openni_kinect.so插件,相机视角和depth点云视角不一致,现象示意图: 2. 错误程序: <link name= ...

  7. 思考产品架构的4个视角:业务、场景、数据/功能、实现

    我们今天以AIoT为例,来聊一聊思考产品架构的4个视角:业务.场景.数据/功能.实现 . 这篇文章的案例内容,主要来自于https://aiotframework.org/index.php?titl ...

  8. java 输入提示_Java实现输入自动提示与补全功能

    一. 场景与目标 在使用 IDE 开发软件时, IDE 会提供一种"智能提示", 根据所输入的字符列出可能的词组: 在日常Web开发中,根据用户输入进行自动提示和补全,也能很好地改 ...

  9. android矩形输入框,Android中实现在矩形框中输入文字显示剩余字数的功能

    虽然这两个功能都比较简单,但是在实际app开发中真的很常见,特别是显示字数或剩余字数这个功能 如下图: 要实现上面的功能,需要做到三点: 1.实现矩形框布局 思路就是矩形框作为整个布局的一个backg ...

最新文章

  1. 简述 clearfix 的原理
  2. python中的运算符举例_举例讲解Python中的算数运算符的用法
  3. 意想不到!WordPress安全漏洞98%来自插件
  4. resource.arsc二进制内容解析 之 Dynamic package reference
  5. flink編譯hadoop3.1.2(失败,这个问题没有意义,关闭)
  6. 数据库系统原理(第6章:数据库安全与保护)
  7. php string slice,substring()与str.slice()区别
  8. 区块链之比特币的私钥,公钥和地址是什么?
  9. MyBatis-3.4.2-源码分析12:XML解析之mapperElement(root.evalNode(mappers))
  10. Android HAL(硬件抽象层)介绍以及调用
  11. 智能文档比对小程序,支持扫描件比对、PDF比对,Word比对,合同比对、公文比对,限时免费使用
  12. 利用Python将视频文件转成语音文件
  13. 3D人体姿态估计论文汇总(CVPR/ECCV/ACCV/AAAI)
  14. 0-100数字播报语音包
  15. java 判断网络类型_javaexcel判断类型
  16. Python 详解计算 Median Absolute Deviation(绝对中位偏差)| 还可用于异常值检测
  17. JAVA毕业设计飞机航班信息查询系统演示视频2021计算机源码+lw文档+系统+调试部署+数据库
  18. macOS:给 app 添加摄像头权限
  19. Win7通过无线网卡共享本地网络,开启WiFi热点以及关闭WiFi热点
  20. JavaWeb学习第二十七天——项目实例

热门文章

  1. mysql查询名字相同数据排列出来_mysql 的sql语句来查找重复数据,并让其都显示出来?...
  2. python获取页面隐藏元素_python之selenium操作隐藏元素
  3. iOS-Core Animation 核心动画高级编程/3-图层几何学
  4. saber软件安装后怎么打开_Saber2016安装包和安装详细安装步骤
  5. 数据结构与算法 — 约瑟夫问题(Josephu)
  6. 手机服务器怎么维护,手机维护远程服务器
  7. 【管理学视频课程】关键链的本质--…
  8. 注意论文投稿风险,现投期刊会不会成为预警期刊呢?
  9. 记录一次teamview无法远程连接对方teamview的过程
  10. Mysql onlineddl vs gh-ost