在开发中,经常会有在运行时根据对象的不同状态来修改播放动画的需求。比如做一个射击游戏,那么持手枪时、攻击使用的动画片段明显是不能与持匕首时相同的。

原先用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];}}
}

需要注意的是:

  1. 所使用的AnimationClip,必须不是Legacy Animation,否则可能会报错,当然也不会正常播放动画。

  2. animatorOverrideController["shot"] = weaponAnimationClip[weaponIndex];代码中的字符串“shot”,不是Animator Controller中状态的名字,而是该状态下的动画片段的名字。

  3. 在修改片段时,每次修改都会触发一次动画片段绑定,因此比较耗性能,慎用。

  4. 当需要批量修改动画片段时,文档中给出了高级用法,可以用来减少性能消耗。

Unity——在运行时修改Animator Controller状态机中的动画片段相关推荐

  1. ASP.NET Core 网站运行时修改设置如何自动生效

    点击蓝字 关注我 在ASP.NET Core中,如果修改了appsettings.json中的设置,那么默认情况下就得重启网站才能生效.有没有办法在修改设置后自动刷新并应用呢? 背景 首先,我们看看默 ...

  2. [Unity脚本运行时更新]C#7.2新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第7篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  3. [Unity脚本运行时更新]C#7新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第5篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  4. [Unity脚本运行时更新]C#4新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第2篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  5. Unity项目运行时动态更新光照贴图 | LightMap

    Unity项目运行时动态更新烘培的光照贴图 动态更新烘培的光照贴图 场景的物件没有发生变化(也就是说没有运行时加载在场景上的Prefab) 场景的烘培贴图已经更新,但是有些物件prefab想运行时加载 ...

  6. java只修改变的字段_java注解之运行时修改字段的注解值操作

    今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码, 导入Excel是用easypoi做的,识别表头是用注解@Excel(name = "xxx")通过这个na ...

  7. [Unity脚本运行时更新]C#7.3新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第8篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  8. [Unity脚本运行时更新]C#7.1新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第6篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  9. [Unity脚本运行时更新]C#6新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第4篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

最新文章

  1. Java IO 4 : RandomAccessFile
  2. Java基础知识回顾
  3. Novas Verdi、Debussy ,Synopsys VCS,Candence NC-Verilog,Mentor Graphics工具介绍
  4. 将应用程序11M内存占用,降至500K [转]
  5. 用Greasemonkey脚本收藏网站会员信息到本地
  6. 安装Windows digits问题列表
  7. 深度学习stride_深度强化学习成名作——DQN
  8. 头条限流是什么原因_抖音为什么会被限流?被限流了如何补救?
  9. 第三章 MongoDb Java应用 3.1
  10. html 3重嵌套选项卡,这对HTML标签嵌套在SEO优化上,其实99%的人都不知道!
  11. 13. Memcache 安装,启动,基本命令,URL
  12. 依赖注入应该慎用,测试可用测试框架帮忙
  13. Keil C51 Code Banking
  14. excel 将两列数据合并,以逗号分隔
  15. php 微信代扣开发步骤,【微信支付】微信代扣开发者文档
  16. 博弈DP:PIPI的炸弹
  17. mapbox-gl中的web墨卡托转换
  18. 谈一谈|Word文档图片的提取
  19. vue把几张图片logo。二维码。背景合成一个海报并下载,使用canvas
  20. 计量经济学及stata应用思维导图_陈怡丨 例谈“思维导图”在小学英语读写课中的应用...

热门文章

  1. 惠普136w墨粉量低_墨粉量低怎么办
  2. php安卓浏览器调用相机拍照,浏览器调用相机进行拍照
  3. P5017 [NOIP2018 普及组] 摆渡车 题解
  4. 前端开发之如何让gif 图只播放一次
  5. 使用iPhone和iPad的10个小窍门
  6. 事件处理函数——bindtap
  7. L1-3 洛希极限 (10分)
  8. 【杂谈】家居布置图书
  9. 入手评测锐龙r7 6800u和r7 6800h区别 r76800u和r76800h对比
  10. 最课程阶段大作业06:U度节能平台控制系统