背景
在 Unity 3D 引擎版本 2017.3.1f1 中,我正在研究由 mecanim 根运动驱动的 3D 角色。我需要将角色绕 Y 轴(向上)精确旋转 180°,然后它会向左或向右走(这是 2D 游戏)。因为它是机械,所以角度并不总是精确的,角色有时会转动 177°,有时会转动 181°。这是一个不需要的错误,导致角色在行走时沿 Z 轴移动。所以我决定使用内置的 animator.MatchTarget() 函数(https://docs.unity3d.com/ScriptReference/Animator.MatchTarget.html)校正最终角度。
问题
Animator.MatchTarget 没有重载函数只匹配旋转,所以我需要输入旋转动画剪辑的最终位置(旋转动画有根运动和位置变化)。我假设成员变量Animator.TargetPositon完成了这项工作:
// following script is attached to the character rotation Animator state
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GenericState : StateMachineBehaviour {
public float targetAngle_ = 180.0f;
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){
Quaternion targetRotation_ = Quaternion.Euler(0, targetAngle_, 0);
animator.MatchTarget(animator.targetPosition,
targetRotation_,
AvatarTarget.Root,
new MatchTargetWeightMask(Vector3.one, 1f),
0f,
1f);
}
}
但它不涉及根运动,因此角色在开始转弯动画时的确切位置结束。还有另一个变量Animator.RootPosition ( https://docs.unity3d.com/ScriptReference/Animator-rootPosition.html ),但它只保存当前字符位置。
解决方法
我能想到的唯一解决方案是在编辑器模式下读取动画数据,存储根运动偏移量,然后在运行时为每个动画应用。该解决方案过于复杂,我正在寻找一种简单的替代方法来“仅匹配旋转并从动画中的根运动读取目标位置”。
谢谢