AnimatorOverrideController的2种使用方式

方式1:使用多个overrideController文件的方式

1) 创建一个通用的状态机,以及状态动画占位文件

2) 分别为不同的角色创建状态动画文件,并用overrideController进行绑定

a) Role1Override.overrideController,这边用正方形表示Role1

b) Role2Override.overrideController,这边用胶囊体表示Role2

更推荐方式1,貌似性能更好一点:Unity中Animator Override的性能问题 - 知乎 (zhihu.com) 

 

 

方式2:使用单个overrideController+代码替换的方式

1) 创建一个通用的状态机,状态动画占位文件,以及用于代码动态替换的overrideController文件

2) 替换代码

using UnityEditor.Animations;
using UnityEngine;

public class ReplaceAnim : MonoBehaviour
{
    public AnimationClip moveAnim;
    public AnimationClip rotateAnim;

    void Start()
    {
        var animator = GetComponent<Animator>();
        if (null == animator.runtimeAnimatorController)
        {
            Debug.LogError($"null");
        }
        else if (animator.runtimeAnimatorController is AnimatorController) 
        {
            /*
            var overrideCtrl = new AnimatorOverrideController(animator.runtimeAnimatorController); //代码方式创建AnimatorOverrideController
            animator.runtimeAnimatorController = overrideCtrl;
            */
            Debug.LogError($"not OverrideController");
        }
        else if (animator.runtimeAnimatorController is AnimatorOverrideController)
        {
            var overrideCtrl = (AnimatorOverrideController)animator.runtimeAnimatorController;
            overrideCtrl["Move_Placeholder"] = moveAnim;
            overrideCtrl["Rotate_Placeholder"] = rotateAnim;
        }
    }

}

3) 分别为不同的角色创建状态动画文件

a) Role1的Animator上的Controller用了通用状态机,也是没问题的,跑起来后,代码会把它替换成overrideController

 

a) Role2的Animator用了overrideController

 

GetOverrides和ApplyOverrides函数的使用

[System.Serializable]
public class MultiAnimClip
{
    public AnimationClip moveAnim;
    public AnimationClip rotateAnim;
}


public class AnimationClipOverridesList : List<KeyValuePair<AnimationClip, AnimationClip>>
{
    public AnimationClipOverridesList(int capacity) : base(capacity) { }

    public AnimationClip this[string name]
    {
        get { return this.Find(x => x.Key.name.Equals(name)).Value; }
        set
        {
            int index = this.FindIndex(x => x.Key.name.Equals(name));
            if (index != -1)
                this[index] = new KeyValuePair<AnimationClip, AnimationClip>(this[index].Key, value);
        }
    }
}

 

using System.Collections.Generic;
using UnityEditor.Animations;
using UnityEngine;

public class AnimOverrideCtrlDemo2 : MonoBehaviour
{
    public MultiAnimClip[] multiAnimClips; //用于替换的实际动画

    private AnimatorOverrideController _ctrl;

    private int _curMoveAnimClipIndex;
    private AnimationClipOverridesList _clipOverridesList;

    void Start()
    {
        var animator = GetComponent<Animator>();
        if (animator.runtimeAnimatorController is AnimatorOverrideController) //使用.overrideController文件
        {
            _ctrl = (AnimatorOverrideController)animator.runtimeAnimatorController;
        }
        else if (animator.runtimeAnimatorController is AnimatorController) //代码方式创建AnimatorOverrideController
        {
            _ctrl = new AnimatorOverrideController(animator.runtimeAnimatorController);
            animator.runtimeAnimatorController = _ctrl;
        }

        _clipOverridesList = new AnimationClipOverridesList(_ctrl.overridesCount);
        _ctrl.GetOverrides(_clipOverridesList);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1)) //next color
        {
            var clips = multiAnimClips[_curColorAnimClipIndex];
            if (null != clips)
            {
                _clipOverridesList["Move_Placeholder"] = clips.moveAnim;
                _clipOverridesList["Rotate_Placeholder"] = clips.rotateAnim;
                _ctrl.ApplyOverrides(_clipOverridesList);
            }

            _curColorAnimClipIndex++;
            if (_curColorAnimClipIndex >= multiAnimClips.Length)
                _curColorAnimClipIndex = 0;
        }
    }

}

 

参考

Unity - Scripting API: AnimatorOverrideController (unity3d.com)

unity Animator Override Controller的使用_BlueBones_fan的博客-CSDN博客_animatoroverridecontroller

Animator Override Controller学习及性能测试 - 爱折腾的西山居士 - 博客园 (cnblogs.com)

使用AnimatorControllerOverride的坑_chqj_163的博客-CSDN博客

使用AnimatorOverrideController动态更换animationclip注意事项_不会程序的美术的博客-CSDN博客

 

posted @ 2022-11-09 01:05  yanghui01  阅读(1769)  评论(0)    收藏  举报