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

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

174249vo287q8mo90qz8i3.jpg
图01 《Firewatch》

技巧1-使用混合树封装复杂的行为

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

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

174308m4mh06svls7gr7hs.jpg
干净整洁的混合树

技巧2-把Layer当作脚本类

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

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

技巧3-模式的重用

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

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


174639maehrrke5coayy5a.jpg
Henry右手的轮状图

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


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

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


174724pv3vxf0uihh4c4he.jpg
调整后的节点模式

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

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

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

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

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

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

174748irazpo9n2p22los3.jpg
使用动画状态机事件脚本

小结

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

锐亚教育 锐亚科技 unity unity教程