Unity3d|【Unity3D Debug】“CharacterController.Move()在处理角色移动时,角色不论怎么转向其移动方向始终不变”的解决方案
【Unity3D Debug】CharacterController.Move在处理角色移动时,角色不论怎么转向其移动方向始终不变的解决方案
这是笔者在处理FPS角色的移动逻辑时遇到的问题。
举个例子,我现在想通过角色控制器(Character Controller)组件,让角色朝着moveDir
的方向移动(其中moveDir
的方向是相对于角色的transform.forward
而言的),代码如下所示:
void Update(){
//...
float speed = 5f;
// 移动速度
Vector3 v = moveDir;
// moveDir为归一化方向向量(Vector3)
cc.Move(v * speed * Time.deltaTime);
//...
}
这段代码看似正常,但如果给角色加入绕y轴的旋转后会发现,角色始终是朝着固定的一个方向运动。比如按下W键向前走,但是不论你如何转向,它都始终朝着Vector3.forward方向运动,这显然是有问题的。
究其原因,
CharacterController.Move(Vector3 motion)
方法传入的Vector3向量会被视为世界坐标系下的移动向量,而非局部坐标系。moveDir
是相对于角色正面朝向的方向向量,即角色坐标系下的局部方向。因此,一种解决方案是将
moveDir
从局部坐标系转变为世界坐标系下的对应向量,借助函数transform.TransformDirection
,作修改后的代码如下所示。void Update(){
//...
float speed = 5f;
// 移动速度
Vector3 v = transform.TransformDirection(moveDir);
// moveDir为归一化方向向量(Vector3)
cc.Move(v * speed * Time.deltaTime);
//...
}
【Unity3d|【Unity3D Debug】“CharacterController.Move()在处理角色移动时,角色不论怎么转向其移动方向始终不变”的解决方案】这样,纵使存在绕Y轴的旋转,我们也始终能保证角色朝着预期的方向前进。
推荐阅读
- 笔记|Unity角色控制器CharacterController移动代码
- Unity3D|Unity3D 角色控制器 Character Controller
- unity3d|Unity3D实现3D立体游戏原理及过程
- Unity3d|Unity Gameplay工具集(Unity Gameplay Tool Set)
- Unity3D|Unity3D ML-Agent-0.8.1 学习一(基础教程)
- unity|Unity3D GUI控件
- Unity3D|【Unity3D】GUI控件
- U3D|Unity接入穿山甲广告SDK教程
- blender 导出动画在unity 中添加