版本: Unity 6 (6000.0)
语言英语
  • C#

AnimatorOverrideController

UnityEngine 中的类

/

继承自:RuntimeAnimatorController

/

实现于:UnityEngine.AnimationModule

建议修改

成功!

感谢您帮助我们提升 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们确实阅读了用户提出的每项建议,并在适用时进行更新。

关闭

提交失败

由于某种原因,您的建议修改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提升 Unity 文档的质量。

关闭

取消

描述

控制动画覆盖控制器的接口。

动画覆盖控制器用于覆盖来自控制器的动画片段,以针对给定化身专门化动画。在运行时,用基于相同AnimatorControllerAnimatorOverrideController替换Animator.runtimeAnimatorController不会重置状态机的当前状态。

有三种方法可以使用动画覆盖控制器。
1. 在编辑器中创建动画覆盖控制器。
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); } } }

属性

overridesCount返回覆盖的计数。
runtimeAnimatorController动画覆盖控制器覆盖的运行时动画控制器。
this[string]如果设置了覆盖动画片段,则返回覆盖动画片段,否则返回名为 name 的原始动画片段。

构造函数

AnimatorOverrideController创建一个空的动画覆盖控制器。

公共方法

ApplyOverrides在该动画覆盖控制器上应用覆盖列表。
GetOverrides获取当前在此动画覆盖控制器中定义的动画片段覆盖列表。

继承成员

属性

hideFlags对象是否应该隐藏,与场景一起保存或用户可修改?
name对象的名称。
animationClips检索控制器使用的所有动画片段。

公共方法

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

静态方法

Destroy删除一个游戏对象、组件或资产。
DestroyImmediate立即销毁对象 obj。强烈建议使用 Destroy 代替。
DontDestroyOnLoad加载新场景时不要销毁目标对象。
FindAnyObjectByType检索任何类型为 type 的活动加载对象。
FindFirstObjectByType检索类型为 type 的第一个活动加载对象。
FindObjectsByType检索类型为 type 的所有加载对象的列表。
Instantiate克隆对象 original 并返回克隆。
InstantiateAsync捕获原始对象(必须与某个游戏对象相关联)的快照,并返回 AsyncInstantiateOperation。

运算符

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