Unity 运行时更换Animator状态里的动画剪辑
AnimatorController是一个编辑器里的类,用来处理asset的。但是运行时改不了asset。只能通过AnimatorOverrideController来实现,不过操作也很简单。
public class TestOverrideAnimator : MonoBehaviour
{
public Animator animator;
public bool testBtn;
public AnimationClip replaceClip;
private AnimatorOverrideController overrideController;
private AnimationClip sourceClip;
void Start()
{
//新建一个AnimatorOverrideController
overrideController = new AnimatorOverrideController(animator.runtimeAnimatorController);
//获取原始的动画Clip,因为测试只有一个动画,就直接这么获取了,如果动画很多个,可以根据名字遍历查找
//编辑器里可以获得状态机的状态,但是运行时获取不到。
//也可以通过overrideController.GetOverrides()获取映射列表
sourceClip = animator.runtimeAnimatorController.animationClips[0];
//使用新的AnimatorOverrideController
animator.runtimeAnimatorController = overrideController;
}
void Update()
{
if (testBtn)
{
testBtn = false;
//传入原始Clip和新Clip的映射就行了
//映射的目标如果是null,就可以取消替换
overrideController.ApplyOverrides(new List<KeyValuePair<AnimationClip, AnimationClip>>()
{
new (sourceClip, replaceClip),
});
//播放Test状态,也可以在编辑器里手动播放
animator.Play("Test", 0, 0);
}
}
}
参考
Unity - Scripting API: AnimatorOverrideController.ApplyOverrides