织金县政府网站建设创意营销案例
unity-AnimatorOverrideControllerhttps://docs.unity.cn/cn/current/ScriptReference/AnimatorOverrideController.html
用于控制动画器重写控制器的接口。
动画器重写控制器的用途是重写某个控制器的动画剪辑,从而为给定化身定制动画。 在运行时基于相同的 AnimatorController 交换 Animator.runtimeAnimatorController 和 AnimatorOverrideController 不会重置状态机的当前状态。
在游戏开发时使用可以优化游戏性能
[Unity 活动]-Unity X 永劫无间「Unity大咖作客」线上分享会 — 动作动画专场【回放】_哔哩哔哩_bilibili
川哥曾在分享里过,在override这些时间里Unity会尝试把AnimatorController里所有的State合并到一个名为 Animationset 的数据结构中。这意味着所有的AnimationClip再乘上所有Clip里所用的曲线都要经过一系列的运算。因此我们的State和AnimationClip越多越复杂,这个运算的耗时也会增加,导致性能问题。
所以在原模板,就是被我们override的对象里面的AnimationClip越空越好,最好都是创建空对象然后再被override修改,因为迟早都是要被修改的,因此有东西没啥意义,除了耗性能没啥实际意义。
在写资料过程中发现了一篇大佬的文章:
Unity中Animator Override的性能问题 - 知乎 (zhihu.com)
在这个中因此要尽可能的减少动画机的复杂度,可以不断控制换AnimationClip,自己决定什么时候用,什么时候加载,并在这个过程中尽可能少的override,优化性能
如何简单使用代码如下:
PlayerAnimator:动画控制器
RuntimeAnimatorController rac;void Start(){//加载动画控制器rac = Resources.Load<RuntimeAnimatorController>("PlayerAnimator");//设置默认动画控制器GetComponent<Animator>().runtimeAnimatorController = rac;//根据路径加载动画AnimationClip clip = Resources.Load<AnimationClip>("attack01");//重写控制器AnimatorOverrideController aoc = new AnimatorOverrideController();//设置为默认控制器aoc.runtimeAnimatorController = rac;//把默认动画改为加载的动画aoc["attack00"] = clip;//清空GetComponent<Animator>().runtimeAnimatorController = null;//赋值GetComponent<Animator>().runtimeAnimatorController = aoc;//播放指定动画GetComponent<Animator>().Play("attack00");}
这个播放GetComponent<Animator>().Play("attack00");,里面的名称还是原来控制器的名称,但是此时里面的的动画已经被修改了
注:关于这里有些版本api可能有所不同