Unity中AnimatorOverrideController

该博客介绍了如何在Unity中利用AnimatorOverrideController增强AnimatorController的功能,允许在不改变原有结构的情况下,为不同实例播放不同的动画。通过示例代码展示了如何在更新循环中根据用户输入切换武器动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Animator Override Controller是用来配合Animator Controller使用的,它让Animator Controller变得更加实用,可以让不同的使用实例的在同一状态播放不同的动作,但保留原有的结构、参数和逻辑。

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Animations;
using UnityEngine;

public class Aniamtor_09_27 : 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.GetKeyDown(KeyCode.A))
        {
            weaponIndex = (weaponIndex + 1) % weaponAnimationClip.Length;
            animatorOverrideController["animator1"] = weaponAnimationClip[weaponIndex];
        }
    }
}

代码直接用的API的。

链接:UnityEngine.AnimatorOverrideController - Unity 脚本 API

 

### UNITY 中 `override` 的使用方法 在 Unity 中,`override` 关键字主要用于继承机制中的方法重写。通过子类重新定义父类的方法行为,可以实现更灵活的功能扩展。以下是关于 `override` 在 Unity 中的具体用法及其相关示例。 #### 1. 方法重写的概念 当一个类继承另一个类时,可以通过 `override` 来修改或增强基类中已有的虚方法(virtual method)。这允许开发者针对特定需求调整功能逻辑[^1]。 #### 2. 抽象类与抽象方法的应用场景 如果希望强制某些派生类提供具体实现,则可以定义抽象类以及其中的抽象方法。例如,在游戏开发中可能有一个通用的角色接口,而不同角色的行为会有所不同: ```csharp // 定义抽象类和抽象方法 public abstract class Animal { public abstract void Speak(); // 抽象方法 public void Eat() { Console.WriteLine("Eating..."); } } // 子类 Dog 实现了 Speak 方法 public class Dog : Animal { public override void Speak() // 使用 override 覆盖父类方法 { Console.WriteLine("Woof!"); } } ``` 上述代码展示了如何创建一个具有基本功能 (`Eat`) 和可定制化部分 (`Speak`) 的动物模型。 #### 3. 动画控制器覆盖 (Animator Override Controller) 对于动画管理器而言,Unity 提供了一种方式叫做 AnimatorOverrideController ,它可以用来动态更改当前使用的剪辑资源而不改变原有状态机结构[^2]。下面是一个简单的例子展示怎样利用该特性完成多组动作切换: ```csharp using UnityEngine; public class AnimationSwapper : MonoBehaviour { private Animator animator; void Start () { animator = GetComponent<Animator>(); var overrides = new List<KeyValuePair<AnimationClip, AnimationClip>> (); foreach(var clipPair in GetNewClips()) overrides.Add(clipPair); var overrideController = new AnimatorOverrideController(animator.runtimeAnimatorController); overrideController.ApplyOverrides(overrides.ToArray()); animator.runtimeAnimatorController = overrideController; } IEnumerable<KeyValuePair<AnimationClip, AnimationClip>> GetNewClips(){ yield return new KeyValuePair<AnimationClip, AnimationClip>(oldWalkAnim,newWalkAnim); } } ``` 此脚本片段说明了如何构建一个新的 AnimatorOverrideController 并应用一组新的动画映射关系到现有 controller 上。 #### 总结 无论是面向对象设计原则下的方法覆载还是实际项目里涉及到复杂资产处理如动画序列变更等情况,“override” 都扮演着重要角色。理解并熟练运用这一语法能够极大提升程序模块化的程度及维护效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值