Unity 3D:如何获取物体相对自身旋转的运动方向向量?
俯视角角色控制器动画方向匹配解决方案
核心问题是你用了世界空间的移动方向驱动动画,但动画需要的是相对于角色模型自身朝向的本地空间方向。直接做空间转换就能解决,具体实现如下:
关键代码实现
在计算完moveDirectionNormalized之后,添加这段代码把世界方向转成模型本地方向,再传给Animator参数:
// 将世界空间的移动方向转换为角色模型本地空间的方向 Vector3 localMoveDir = MeshCharacter.InverseTransformDirection(moveDirectionNormalized); // 忽略垂直方向(俯视角不需要Y轴),只保留平面上的方向 localMoveDir.y = 0f; // 确保向量归一化,避免参数值超出-1~1范围 if(localMoveDir.magnitude > 0.01f) localMoveDir = localMoveDir.normalized; else localMoveDir = Vector3.zero; // 给Animator的2D混合树参数赋值:X对应左右,Z对应前后(匹配你要的MoveDirectionX/Y) _animator.SetFloat("MoveDirectionX", localMoveDir.x); _animator.SetFloat("MoveDirectionY", localMoveDir.z);
代码解释
InverseTransformDirection:Unity内置方法,专门用来把世界空间向量转换成当前Transform(这里是MeshCharacter)本地空间的向量。比如角色模型面朝敌人时,向后移动的世界方向会被转换成本地空间的(0,0,-1),对应你要的(0,-1)(把Z值传给MoveDirectionY即可)。- 过滤Y轴:俯视角下角色移动在XZ平面,Y是垂直方向,直接设为0避免干扰。
- 归一化处理:确保参数值严格在-1~1之间,和动画混合树的配置匹配,防止动画过渡异常。
代码放置位置
把这段代码放在移动逻辑(_characterPlayer.Move(...))执行完、模型转向逻辑之后,用来更新Animator参数即可。
内容的提问来源于stack exchange,提问作者UniDev
相关产品推荐
相关产品推荐

