
为您的角色创建动画控制器,就像编写脚本一样——使其足够简单,以便在开发周期中重复使用、支持和调试。
下面的所有截图来自Campo Santo制作的Firewatch中角色Henry的动画。

混合树非常适合隐藏复杂性。混合树没有状态,因为它不会回调到代码中。它根据您定义的参数在不同的剪辑之间进行混合。
这意味着您可以在混合树上进行迭代,而不必担心破坏游戏的其余部分。您可以隐藏复杂的状态网络,并防止将来出现错误,因为您无法将行为与混合树中的大多数动画绑定。

将层视为脚本中的类是有帮助的。您希望层中的所有内容都服务于相同的逻辑和行为功能。这是因为每个单独的层控制它覆盖的其他层——无论它是否影响某些骨骼,是否该层是附加的,等等。
可重用的逻辑模式在状态机和子状态机中加快了开发速度,便于调试,并且可以减少错误,同时允许多个人制作类似的内容。
以下部分介绍了用于构建层的模式。

该模式使调试变得更容易,因为您可以清楚地看到过渡状态的输出和返回到空状态。中心的每个辐射都应该重置它接触的任何状态。
辐射是使用以下模式制作子状态机的理想候选者。

通过将状态分组为“引入” – 执行/循环 – “结束”,您可以干净地将任何动画事件或状态机行为附加到引入和结束状态。就像混合树一样,您可以迭代并更改内部执行/循环状态,而不必担心破坏您的游戏。

对于可中断的动画,特别是由玩家输入驱动的动画,将您的剪辑分成两部分。首先,保持一个关键部分,其中包含所有状态变化、效果和必须始终播放到完成的伤害。其次,设计一个结束动画,使您回到闲置状态时看起来不错,并且可以被新的输入中断。
一旦您的动画表现和外观如您所愿,您需要将动画师的状态反馈到游戏的状态中。请参阅以下部分以获取一些关键点。
状态机行为是您可以附加到任何动画状态的代码片段。使用它们将行为直接绑定到动画师本身的状态。
避免在其中编写复杂的游戏代码,因为这可能会使您难以追踪状态变化的来源。如果您使用状态机行为来驱动游戏代码,请利用消息系统;与管理类进行交谈,或根据更高层次的参数触发您的代码。
Debug.Break() 是您可以使用的最有效的状态机行为之一。将其附加到您的动画设置中的任何位置,您将拥有类似于可视化脚本系统的断点。
在适当的地方使用C#代码。与其管理数百或数千个过渡,或在各处连接AnyState过渡,不如使用Animator.Play或Animator.CrossFade从代码动态创建直接过渡。如果这仍然无法满足您的控制需求,请查看Unity的Playables API,以获取更多使用代码进行动画的方法。一些示例可以在这里找到。

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