您想找什么?
Hero background image
在 Unity 中构建动画控制器的技巧

像编写脚本一样为您的角色创建动画控制器 - 以便它们足够简单,可以在整个开发周期中重用、支持和调试。

以下所有截图均来自 Campo Santo 创作的 《看火人》 中亨利角色的动画。

混合树图像
在混合树中隐藏复杂性

混合树非常适合隐藏复杂性。混合树没有状态,因为它不会回调代码。它会根据您定义的参数混合不同的剪辑。

这样做的意义在于,您可以在混合树上进行迭代,而不必担心破坏游戏的其余部分。您可以隐藏复杂的状​​态网络并防止将来出现错误,因为您无法将行为与混合树中的大多数动画联系起来。

动画师状态
将图层视为脚本类

将图层视为脚本中的一个类会有所帮助。您希望同一层中的所有内容都具有相同的逻辑和行为功能。这是因为每个单独的层控制它覆盖的其他层 - 它是否影响某些骨骼,该层是否是附加的,等等。

重用模式

状态机和子状态机中可重复使用的逻辑模式可以加速开发、方便调试、减少错误,同时允许多个人制作类似的内容。

以下部分介绍了可用于构建图层的有用模式。

轮辐式动画师
中心辐射型

这种模式使调试变得更容易,因为您可以清楚地看到转换出去并回到空状态。轮毂的每个辐条都应重置其接触的任何状态。

使用以下模式,辐条是制作子状态机的可靠候选者。

进入退出动画师
共享进入/共享退出模式

通过将状态分组为“介绍” - 执行/循环 - “结束”的模式,您可以将任何动画事件或状态机行为干净地附加到介绍和结束状态。与混合树非常相似,您可以迭代并更改内部执行/循环状态,而不必担心破坏游戏。

剖面和沉降模式
临界区和稳定模式

对于可中断的动画,尤其是玩家输入驱动的动画,请将剪辑分成两部分。首先,维护一个关键部分,其中包含必须始终完成的所有状态变化、影响和损害。其次,设计一个看起来不错的稳定动画,让您回到空闲状态,并且可以通过新的输入进行打断。

一旦动画表现并按预期出现,您就需要将动画师的状态反馈到游戏状态中。请参阅以下部分,了解需要记住的一些关键点。

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

状态机行为是可以附加到任何动画状态的代码片段。使用它们将行为直接与动画师本身的状态联系起来。

避免在其中编写复杂的游戏代码,因为这样很难追踪状态变化的来源。如果您使用状态机行为来驱动游戏代码,请利用消息系统;与管理器类对话,或在更高级别的参数触发您的代码。

Debug.Break() 是您可以使用的最有效的状态机行为之一。将其附加到动画设置中的任何位置,您将拥有一个类似于可视化脚本系统的断点。

在适当的地方使用 C# 代码。您无需管理数百或数千个转换,也不必在各处连接 AnyState 转换,而是使用 Animator.Play 或 Animator.CrossFade 从代码中动态创建直接转换。如果这对您来说仍然不够,请查看 Unity 的 Playables API 以了解更多使用代码进行动画处理的方法。这里可以找到一些例子。

状态机行为
使用状态机行为确保动画事件始终触发

动画事件将动画剪辑的特定时刻与游戏中的特定状态变化联系起来。它们可用于衬托视觉和声音效果等元素。然而,如果你在剪辑被触发之前转换它,那么它将永远不会触发。解决这个问题的一种方法是添加状态机行为,确保无论游戏中发生什么(或没有发生),事件总是在达到特定时间点时触发。

更多资源
此内容是否有帮助?
是的!
还行。