Unity俯视角射击:如何基于瞄准方向计算相对移动向量实现 Strafing 动画
解决Unity俯视角瞄准 Strafing 动画的相对移动向量计算问题
要将世界空间的移动向量转换为相对于瞄准方向的局部空间向量,以此驱动混合树的AimingWalkHorizontal和AimingWalkVertical参数,你可以通过以下步骤实现:
核心思路
将玩家的世界移动方向,转换到以瞄准方向为前向的局部坐标系中,这样得到的向量分量就能直接对应 Strafing 动画的水平/垂直参数。
完整代码实现
// 确保向量在XZ平面且归一化(避免缩放干扰动画参数) Vector3 movementVector = new Vector3(_movementVector.x, 0, _movementVector.y).normalized; Vector3 aimingDirection = new Vector3( MouseWorldPosition.x - PlayerController.PlayerObj.transform.position.x, 0, MouseWorldPosition.z - PlayerController.PlayerObj.transform.position.z ).normalized; // 创建以瞄准方向为前向的旋转(保持世界Y轴为上方向,适配俯视角平面移动) Quaternion aimLocalRotation = Quaternion.LookRotation(aimingDirection, Vector3.up); // 将世界空间移动向量转换为瞄准局部空间的向量 Vector3 relativeMovement = aimLocalRotation.InverseTransformDirection(movementVector); // 赋值给Animator混合树参数 PlayerController.Animator.SetFloat("AimingWalkHorizontal", relativeMovement.x); PlayerController.Animator.SetFloat("AimingWalkVertical", relativeMovement.z);
参数对应说明
- 当玩家向右 Strafing(相对于瞄准方向的右侧移动),
relativeMovement.x会输出1,relativeMovement.z输出0,完全匹配你设置的混合树触发条件。 relativeMovement.x正负对应左右 Strafing 方向,relativeMovement.z正负对应相对于瞄准方向的前后移动。- 若需要让动画速度随移动快慢变化,可移除
normalized保留向量原始长度,此时参数值的大小会直接影响动画播放速率。
内容的提问来源于stack exchange,提问作者Vít Vohrálek
相关产品推荐
相关产品推荐

