一、根运动
Animancer的根运动系统与原生的工作原理完全相同,但我们可以通过继承Transition类型或实现ITransition接口,来将额外的数据与动画绑定,从而更方便地控制根运动。
在下面这个示例中,我们通过自定义的Transition类实现动画根运动的灵活控制。
首先创建一个脚本RootMotion,并编写如下代码
// 自定义Transition类,将是否启用根运动封装
[Serializable]
public class MotionTransition:ClipTransition
{
[SerializeField,Tooltip("是否启用根运动")]
private bool applyRootMotion;
// 在Play()时调用
public override void Apply(AnimancerState state)
{
base.Apply(state);
state.Root.Component.Animator.applyRootMotion = applyRootMotion;
}
}
public class RootMotion : MonoBehaviour
{
[SerializeField]
private MotionTransition[] animations;
[SerializeField]
private AnimancerComponent animancer;
private void OnEnable()
{
// 启用时播放第一段动画
Play(0);
}
/// <summary>
/// 播放指定动画
/// </summary>
/// <param name="index"></param>
public void Play(int index)
{
animancer.Play(animations[index]);
}
}
接下来给角色挂载这个脚本并指定两个动画,一个动画启用根运动,另一个不启用

再通过UI动态控制角色播放的动画。看下效果

当然,在Animancer中我们也可以通过OnAnimatorMove方法来控制根运动
[SerializeField] private Rigidbody rigid;
private void OnAnimatorMove()
{
rigid.MovePosition(rigid.position+animancer.Animator.deltaPosition);
rigid.MoveRotation(rigid.rotation*animancer.Animator.deltaRotation);
}
二、线性混合
通过Animancer,我们可以很方便地控制动画状态机进行播放。通过ControllerTransition可以接收一个动画状态机,并通过Animancer进行播放
public class LinearBlendTreeLocomotion :

最低0.47元/天 解锁文章
1917

被折叠的 条评论
为什么被折叠?



