Unity3D——在运行时修改Animator Controller状态机中的动画片段
来源:互联网 发布:怎么开启80端口 编辑:程序博客网 时间:2024/05/21 08:45
在开发中,经常会有在运行时根据对象的不同状态来修改播放动画的需求。比如做一个射击游戏,那么持手枪时、攻击使用的动画片段明显是不能与持匕首时相同的。
原先用Legacy Animation时,是可以很方便地修改的。而Mecanim基于状态机,动画片段存在于状态机中的状态里。想要实现上述需求,相较于之前也是麻烦了不少。
最容易想到的解决方案是,在Animator Controller状态机中分别建“PistalAttack
”和“DaggerAttack”的状态,根据当前角色所持的武器来决定转移到哪一个状态。
但是如果需求有变,角色除了手枪和匕首,还能装备弓箭、冲锋枪、狙击枪……那么就得在状态机里为每一种武器增加一个状态。这种方法扩展性不好。
另一种解决方案是,针对角色持有的各种武器、每一种武器都创建一个Animator Controller,在运行时替换Animator组件中的runtimeAnimatorController。
显然这也不是一种好的方式。仔细分析,会发现如果按照这种方式,所有的Animator Controller都会是同一种结构,它们完全可以被统一起来。
任何程序开发问题都可以通过添加一层抽象来解决。分析需求,无论角色装备什么武器,事实上它们都具有一个攻击状态。那么,抛开具体的武器,动画控制器只需要一个“Attack”状态与之对应即可。在角色持有不同武器时,去修改“Attack”状态中具体播放的动画片段就能解决上述问题了。
这种方式就是标题所说的在运行时修改Animator Controller状态机中的动画片段。它通过AnimatorOverrideController来实现。贴上官方文档链接:AnimatorOverrideController官方API说明
基础的示例代码如下,代码很清晰,就不再作详细解析了。
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]; } }}
需要注意的是:
所使用的AnimationClip,必须不是Legacy Animation,否则可能会报错,当然也不会正常播放动画。
animatorOverrideController["shot"] = weaponAnimationClip[weaponIndex];
代码中的字符串“shot”,不是Animator Controller中状态的名字,而是该状态下的动画片段的名字。在修改片段时,每次修改都会触发一次动画片段绑定,因此比较耗性能,慎用。
当需要批量修改动画片段时,文档中给出了高级用法,可以用来减少性能消耗。
- Unity3D——在运行时修改Animator Controller状态机中的动画片段
- 动画状态机Animator-Unity3d
- Unity3D 新版动画状态机Animator中的动画速度控制
- Unity3D之Mecanim动画系统:Animator Controller
- Unity3D中的Animator动画控制
- Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长
- unity-动画状态机Animator
- unity-动画状态机Animator
- Unity3D之Mecanim动画系统学习笔记:Animator Controller
- Unity3D 编辑器中修改动画片段属性
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- 循环动画片段和animator组件
- 动画状态机--动画片段添加事件
- HDU-4348 To the moon (主席树)
- 输入10个整数,用函数编程将其中最大数于最小数位置互换,然后输出互换后的数组。
- 上海之行——所见、所感、所想、所做
- App主界面布局的实现方式(一)
- go build 命令
- Unity3D——在运行时修改Animator Controller状态机中的动画片段
- eclipse安装checkstyle、PMD、FindBugs、VisualVM
- 修复dede织梦undefined function pasterTempletDiy报错
- 《Learning Sentiment-Specific Word Embedding for Twitter Sentiment Classificaton》阅读笔记
- 链路聚合技术
- ERROR ITMS-90022,90023,问题已解决
- 25 仿函数与函数对象(学自Boolean)
- caffe源代码阅读
- ssm(spring+springmvc+mybatis)xml版的整合