AnimatorOverrideController

class in UnityEngine

/

Inherits from:RuntimeAnimatorController

Switch to Manual

Description

用于控制动画器重写控制器的接口。

动画器重写控制器的用途是重写某个控制器的动画剪辑,从而为给定化身定制动画。 在运行时基于相同的 AnimatorController 交换 Animator.runtimeAnimatorControllerAnimatorOverrideController 不会重置状态机的当前状态。

There are three ways to use the Animator Override Controller.
1. Create an Animator Override Controller in the Editor.
2. Change one Animation Clip per frame at runtime (Basic use case).
In this case the indexer operator AnimatorOverrideController.this[string] could be used, but be careful as each call will trigger a reallocation of the animator's clip bindings.

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. Changing many Animation Clips per frame at runtime (Advanced use case).
The AnimatorOverrideController.ApplyOverrides method is well suited for this case as it reduce the number of animator's clips bindings reallocation to only one per call.

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); } } }

Variables

overridesCount返回重写数。
runtimeAnimatorController动画器重写控制器重写的运行时动画控制器。
this[string]返回重写动画剪辑(如果已设置)或原有动画剪辑命名的名称。

Constructors

AnimatorOverrideController创建一个空的动画器重写控制器。

Public Functions

ApplyOverrides对该动画器重写控制器应用重写列表。
GetOverrides获取该动画器重写控制器中当前定义的动画剪辑重写的列表。

Inherited members

Variables

hideFlagsShould the object be hidden, saved with the Scene or modifiable by the user?
name对象的名称。
animationClips检索控制器使用的所有 AnimationClip。

Public Functions

GetInstanceID返回对象的实例 ID。
ToString返回 GameObject 的名称。

Static Functions

Destroy删除 GameObject、组件或资源。
DestroyImmediate立即销毁对象 /obj/。强烈建议您改用 Destroy。
DontDestroyOnLoadDo not destroy the target Object when loading a new Scene.
FindObjectOfType返回第一个类型为 type 的已加载的激活对象。
FindObjectsOfType返回所有类型为 type 的已加载的激活对象的列表。
Instantiate克隆 original 对象并返回克隆对象。

Operators

bool该对象是否存在?
operator !=比较两个对象是否引用不同的对象。
operator ==比较两个对象引用,判断它们是否引用同一个对象。