最近又遇到一个新需求,需要动态修改Animator Controller中绑定的动画片段,查API
发现Unity已经有写好的代码示例可以替换片段了。代码也很简单,需要借助AnimatorOverrideController进行修改。
using UnityEngine;
public class SwapWeapon : MonoBehaviour
{
public AnimationClip[] weaponAnimationClip;
protected Animator animator;
protected AnimatorOverrideController animatorOverrideController;
protected int weaponIndex;
public void Start()
{
animator = GetComponent<Animator>();
weaponIndex = 0;
animatorOverrideController = new AnimatorOverrideController(animator.runtimeAnimatorController);
animator.runtimeAnimatorController = animatorOverrideController;
}
public void Update()
{
if (Input.GetButtonDown("NextWeapon"))
{
weaponIndex = (weaponIndex + 1) % weaponAnimationClip.Length;
animatorOverrideController["shot"] = weaponAnimationClip[weaponIndex];
}
}
}
最后需要注意的是这里替换的shot不是Controller中的state名字,而是动画片段的名称。(也就是state中的Motion,这样如果替换的是Blend Tree也可以知道要替换哪一个动画片段,不过每次替换都相当于一次动画重新绑定的过程,所以可能会有一定的性能消耗,如果有批量替换需求,可以查阅上面的API提供的方案)