当角色使用弓、剑、枪,原本AnimatorComtroller拖拽的AnimationClip已经不适用了,所有有了AnimatorOverrideController。
AnimatorOverrideController能帮我们对AnimatorComtroller原有的动作进行重写,已达到使用不同的武器而展现不同的动作。
public class AnimationClipOverrides : List<KeyValuePair<AnimationClip, AnimationClip>>
{
public AnimationClipOverrides(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);
}
}
}
public class Weapon
{
public AnimationClip singleAttack;
public AnimationClip comboAttack;
public AnimationClip dashAttack;
public AnimationClip smashAttack;
}
public class SwapWeapon : MonoBehaviour
{
public Weapon[] weapons;
protected Animator animator;
protected AnimatorOverrideController animatorOverrideController;
protected int weaponIndex;
protected AnimationClipOverrides clipOverrides;
public void Start()
{
animator = GetComponent<Animator>();
weaponIndex = 0;
animatorOverrideController = new AnimatorOverrideController(animator.runtimeAnimatorController);
animator.runtimeAnimatorController = animatorOverrideController;
clipOverrides = new AnimationClipOverrides(animatorOverrideController.overridesCount);
animatorOverrideController.GetOverrides(clipOverrides);
}
public void Update()
{
if (Input.GetButtonDown("NextWeapon"))
{
weaponIndex = (weaponIndex + 1) % weapons.Length;
clipOverrides["SingleAttack"] = weapons[weaponIndex].singleAttack;
clipOverrides["ComboAttack"] = weapons[weaponIndex].comboAttack;
clipOverrides["DashAttack"] = weapons[weaponIndex].dashAttack;
clipOverrides["SmashAttack"] = weapons[weaponIndex].smashAttack;
animatorOverrideController.ApplyOverrides(clipOverrides);
}
}
}
上面是一个官方实例。
需要注意一下几点,也是本人踩过的坑:
clipOverrides["SingleAttack"] SingleAttack对应AnimatorComtroller的clip名字,就算没有这个key也不会报错
需要在挂载Animator物体下使用
不可以使用AnimatorComtroller里面直接创建的空动画clip重写
可以在编辑器项目面板直接创建Animation,然后挂上AnimatorComtroller,然后重写。