实现根据相机视角输入WASD移动和转向的功能
记录一下从官方第三人称模板简化出来的角色移动控制。
实现效果
最终实现的效果是,当按下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移动和转向的功能相关推荐
- Cesium 相机视角控制
基于Cesium 开发实际功能的时候,需要调整或者固定相机视角,支持用户完成操作.今天也遇到类似的需求,记录一下. 3D视图中 控制视角平移:scene.screenSpaceCameraContro ...
- Unity3D中,鼠标控制相机视角并且跟随玩家的几种方法(第三人称)的学习整理
第一种, 按住鼠标的右键进行移动视角,同时滚轮调正视角大小. public Transform target; //相机追随目标public float xSpeed = 200; //X轴方向拖动 ...
- 将Unity虚拟相机视角画面显示在一个平面上
一.无需代码: 1.在Project视图中新建一个 Render Texture 2.将其拖动到新建 Camera 的 Target Texture上 3.调整相机视角 4.新建一个Plane,将虚拟 ...
- Unity双相机Camera,将虚拟相机视角画面显示在平面Plane上
Unity双相机Camera,将虚拟相机视角画面显示在平面Plane上 场景中通过添加Render Texture实现 通过挂脚本实现 转载链接 场景中通过添加Render Texture实现 1.场 ...
- vue2 使用 cesium 【第二篇-相机视角移动+添加模型】
vue2 使用 cesium [第二篇-相机视角移动+添加模型] 搞了一阵子 cesium,小白入门,这东西很牛逼,但是感觉这东西好费劲啊!网上资料不多,每个人的用法又不一样,操作起来真的是绝绝子.之 ...
- Gazebo urdf kinetic RGBD camera 相机视角和点云视角不一致
1. 错误现象: 在urdf 中使用 libgazebo_ros_openni_kinect.so插件,相机视角和depth点云视角不一致,现象示意图: 2. 错误程序: <link name= ...
- 思考产品架构的4个视角:业务、场景、数据/功能、实现
我们今天以AIoT为例,来聊一聊思考产品架构的4个视角:业务.场景.数据/功能.实现 . 这篇文章的案例内容,主要来自于https://aiotframework.org/index.php?titl ...
- java 输入提示_Java实现输入自动提示与补全功能
一. 场景与目标 在使用 IDE 开发软件时, IDE 会提供一种"智能提示", 根据所输入的字符列出可能的词组: 在日常Web开发中,根据用户输入进行自动提示和补全,也能很好地改 ...
- android矩形输入框,Android中实现在矩形框中输入文字显示剩余字数的功能
虽然这两个功能都比较简单,但是在实际app开发中真的很常见,特别是显示字数或剩余字数这个功能 如下图: 要实现上面的功能,需要做到三点: 1.实现矩形框布局 思路就是矩形框作为整个布局的一个backg ...
最新文章
- 简述 clearfix 的原理
- python中的运算符举例_举例讲解Python中的算数运算符的用法
- 意想不到!WordPress安全漏洞98%来自插件
- resource.arsc二进制内容解析 之 Dynamic package reference
- flink編譯hadoop3.1.2(失败,这个问题没有意义,关闭)
- 数据库系统原理(第6章:数据库安全与保护)
- php string slice,substring()与str.slice()区别
- 区块链之比特币的私钥,公钥和地址是什么?
- MyBatis-3.4.2-源码分析12:XML解析之mapperElement(root.evalNode(mappers))
- Android HAL(硬件抽象层)介绍以及调用
- 智能文档比对小程序,支持扫描件比对、PDF比对,Word比对,合同比对、公文比对,限时免费使用
- 利用Python将视频文件转成语音文件
- 3D人体姿态估计论文汇总(CVPR/ECCV/ACCV/AAAI)
- 0-100数字播报语音包
- java 判断网络类型_javaexcel判断类型
- Python 详解计算 Median Absolute Deviation(绝对中位偏差)| 还可用于异常值检测
- JAVA毕业设计飞机航班信息查询系统演示视频2021计算机源码+lw文档+系统+调试部署+数据库
- macOS:给 app 添加摄像头权限
- Win7通过无线网卡共享本地网络,开启WiFi热点以及关闭WiFi热点
- JavaWeb学习第二十七天——项目实例
热门文章
- mysql查询名字相同数据排列出来_mysql 的sql语句来查找重复数据,并让其都显示出来?...
- python获取页面隐藏元素_python之selenium操作隐藏元素
- iOS-Core Animation 核心动画高级编程/3-图层几何学
- saber软件安装后怎么打开_Saber2016安装包和安装详细安装步骤
- 数据结构与算法 — 约瑟夫问题(Josephu)
- 手机服务器怎么维护,手机维护远程服务器
- 【管理学视频课程】关键链的本质--…
- 注意论文投稿风险,现投期刊会不会成为预警期刊呢?
- 记录一次teamview无法远程连接对方teamview的过程
- Mysql onlineddl vs gh-ost