查看原文
其他

5个保持动画控制器整洁的小技巧

2017-10-30 Unity官方 Unity官方平台

今天将为大家介绍5个非常实用的动画控制器的小技巧。为角色进行动画控制的过程和脚本非常相似,这需要动画控制器在整个开发周期内能够被高效率地进行重用、扩展、维护和故障排查。

 

本文中所使用的动画均来自游戏《Firewatch》的角色Henry。


图01 《Firewatch》

 

技巧1

使用混合树封装复杂的行为

混合树很适合用来隐藏复杂的行为。混合树并没有状态,它也不需要代码回调。它仅仅会根据用户定义的参数来混合两个不同的动画剪辑。

 

使用混合树的优点是在迭代混合树时,完全不用担心会把游戏的其它部分弄得一团糟。你可以封装隐藏好复杂的状态网,同时避免在接下来的开发过程中产生新的问题,因为你不能给混合树中绝大多数的动画绑定行为。


干净整洁的混合树

 

技巧2

把Layer当作脚本类

将Layer大致看做是脚本类,对于理解接下来的内容是很有帮助的。你会把所有相同的逻辑和行为函数都封装在一个层中。这是因为每一个层都会对其重载的其它层的部分进行控制,不受某个具体骨骼或层级的限制。

 

Henry左手的动画状态,每一个层的结构与功能都清晰明了

 

技巧3

模式的重用

状态与子状态机种逻辑模式的重用有助于提升开发的速度,也有助于其他人制作类似的内容,同时故障的排查也更容易,减少bug产生的数量。

 

以下类型的模式有助于Layer的构建:

  • 轮状图:该种模式的故障排查较为简单,你可以清晰地看到转换在空状态与其它状态之间游走。下面轮状图中轮轴的每个轮辐都应重置其连接的对应状态。


Henry右手的轮状图

 

  •  入口/出口共用模式:通过将状态进行组合来达到“入口”-“执行/循环”-“出口”的模式,你可以较为容易地将任意动画事件或状态机行为附加到“入口”或“出口”状态上。和混合树很相似的一点是你可以迭代并修改内部的“执行/循环”状态而无需担心会混乱游戏的其它部分。

 

从入口到出口:Henry右手拿书的所有状态

  

  • 关键节点与次要节点模式:对于可中断的动画,尤其是由用户输入驱动的动画,你需要将动画片段分割为两个部分。首先关键节点需包含所有状态的变化、效果与伤害等,就是必须完整播放的部分。其次是次要节点,即可以优雅地回到空闲动画的节点,同时可以被来自用户的新输入所中断。

 

调整后的节点模式

 

技巧4

不要在状态机行为中编写过于复杂的代码

状态机行为就是可以被附加在动画状态上的小段代码。你可以使用这些脚本为状态机附加行为。

 

尽量避免在这些代码中编写复杂的游戏代码,因为这会让你很难找到状态机中什么地方做了什么。如果你需要使用状态机行为来驱动游戏代码,请使用消息系统。将请求传递给某个管理类,或者在更高层级上关闭某些参数。

 

最后推荐状态机行为:Debug.break。这是最实用的状态机行为,你可以在动画体系中的任意地方附加该行为,它的作用就像断点一样,和可视化编程系统很相似。

 

技巧5

使用状态机行为来确保某个动画事件被正确应用

动画事件可以将动画剪辑片段中的某个瞬间与游戏的某种状态联系起来,它们可以被用来设置诸如视觉或声音效果。然而如果状态机中某个事件在被发布之前状态就被转出,则这个事件就根本不会被发布。一种解决方案是添加一个新的状态机行为,用于确保在某个瞬间事件确实地被发布出来,无论游戏中发生了什么事情。

 

使用动画状态机事件脚本

 

小结

今天为大家介绍的5个使用动画控制器的小技巧,希望能够在项目中有效的帮助刀开发者。后续Unity官方还会分享一些开发中的实用技巧在Unity官方中文社区(unitychina.cn),请保持关注!如果有你感兴趣的问题,欢迎发送给我们。


推荐阅读

Unity 2017.3 Beta版本粒子系统的改进

使用Unity在手机上实现移动Inside-out VR追踪

360 VR Player Starter kit使用教程

Unity移动游戏优化的小技巧

《Neon》项目的创作过程


近期Unity官方活动

10月16日- 31日截止,Unity Plus加强版大促销


11月11日,Unity技术路演成都站报名开启


11月,Unity教育峰会,长沙、上海、广州站报名开启


Unity Connect火热征文中,赶紧来分享你的Made with Unity作品吧!


点击“阅读原文”进入Unity官方中文社区

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存