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轴的旋转,我们也始终能保证角色朝着预期的方向前进。

    推荐阅读