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博客

浙公网安备 33010602011771号