Интерфейс для управления Animator Override Controller.
Animator Override Controller служит для переопределения клипов анимации из контроллера, чтобы адаптировать анимации под конкретный Avatar. Подмена Animator.runtimeAnimatorController с AnimatorOverrideController на основе того же AnimatorController во время выполнения не сбрасывает текущее состояние машины состояний.
Существует три способа использования Контроллера Переопределения Animator.
1. Создайте в Редакторе Контроллер Переопределения Animator.
2. Изменение одного анимационного клипа на кадр во время выполнения (базовый вариант использования).
В этом случае оператор индексирования AnimatorOverrideController.this[string] может быть использован, но будьте осторожны, так как каждый вызов будет вызывать перераспределение привязок клипа аниматора.
using UnityEngine;
public class SwapWeapon : MonoBehaviour
{
public AnimationClip[] weaponAnimationClip;
protected Animator animator;
protected AnimatorOverrideController animatorOverrideController;
protected int weaponIndex;
public void Start()
{
animator = GetComponent<Animator>();
weaponIndex = 0;
animatorOverrideController = new AnimatorOverrideController(animator.runtimeAnimatorController);
animator.runtimeAnimatorController = animatorOverrideController;
}
public void Update()
{
if (Input.GetButtonDown("NextWeapon"))
{
weaponIndex = (weaponIndex + 1) % weaponAnimationClip.Length;
animatorOverrideController["shot"] = weaponAnimationClip[weaponIndex];
}
}
}
3. Изменение многих анимационных клипов на кадр во время выполнения (Продвинутый случай использования).
Метод AnimatorOverrideController.ApplyOverrides хорошо подходит для этого случая, так как он уменьшает количество перераспределений привязок клипа аниматора до одного за вызов.
using UnityEngine;
using System.Collections.Generic;
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);
}
}
}