本文由博主(YinaPan)原创,转载请注明出处: http://www.cnblogs.com/xsln/p/Animator_Override_Controller.html

一、Animator Override Controller简介:
  动画覆盖器是一类asset,它允许你扩张已经存在的动画控制器,用特定的animations,但是需要保留原始的结构、参数和逻辑;

这就允许你创建同一个基础状态机的多个变种,这些变种使用不同的animations。

  例如:你有一系列的npc生活在游戏中,他们有自己的独特走、idle、坐等animations,创建一个基础动画控制器,包含所有种类npc的逻辑,

你就可以创建一个override为每一种NPC,然后用他们各自的animation去填充;

二、制作方法:

图标:带+号为Override Controller

Animator Override Controller学习及性能测试-LMLPHP

1、Create选择Animator Override Controller

Animator Override Controller学习及性能测试-LMLPHP

2、修改名字为M2_P01

Animator Override Controller学习及性能测试-LMLPHP

3、将原来的AnimtorController拖到Controller内,即制作完成!

Animator Override Controller学习及性能测试-LMLPHP

三、使用及this[]的性能测试

 using UnityEngine;
using System.Collections; public class AnimatorOveridePerformance : MonoBehaviour {
public bool m_test = true;
Animator m_animator = null;
AnimatorOverrideController m_Old = null;
AnimatorOverrideController m_New = null; // Use this for initialization
void Start () {
m_animator = GetComponent<Animator>();
m_Old = new AnimatorOverrideController();
m_New = Resources.Load<AnimatorOverrideController>("Packages/ArtWorks/Player/M2/M2_P04/M2_P04");
Debug.LogError(m_New);
m_Old = (AnimatorOverrideController)m_animator.runtimeAnimatorController;
if (null != m_New) {
Debug.LogError(m_Old["P01Attack01"]);
Debug.LogError(m_Old["P01Attack02"]);
m_Old["P01Attack01"] = m_New["P04Attack01"];
m_Old["P01Attack02"] = m_New["P04Attack02"];
Debug.LogError(m_Old["P01Attack01"]);
Debug.LogError(m_Old["P01Attack02"]);
}
} void Update() {
Profiler.BeginSample("Update");
if (m_test && m_New) {
Profiler.BeginSample("this[]");
m_Old["P01Attack01"] = m_New["P04Attack01"];
m_Old["P01Attack02"] = m_New["P04Attack02"];
Profiler.EndSample();
}
Profiler.EndSample();
} }
测试结果:
     单次取和设置消耗约为0.5~1ms左右;
05-11 03:40