搜索Unity

让动画控制器保持整洁的五个技巧

Last updated: December 2018

What you will get from this page: Will Armstrong’s five awesome tips for animator controllers. You’ll get tips for building animator controllers for your characters like you would a script: so they’re efficient to reuse, extend, support and debug, all the way through the development cycle.
All of the screenshots are from animation for the character Henry in Firewatch.

在混合树中隐藏复杂性

混合树很适合隐藏复杂性。混合树没有状态;它不会回调进入代码。它只会根据定义的参数混合不同的剪辑。

这样做的意义是您可以在混合树上迭代,而无需担心中断游戏的其他部分。您可以隐藏状态的复杂Web,防止以后出现错误,因为在混合树中,您不能将行为关联到大多数动画。

unity-tidy-animators-locomotion-blend-tree

它看起来很复杂,但是这种运动混合树实际上有助于保持简单直观。

考虑"层"时,先考虑:"脚本类"

将层大致类比成脚本中的类有助于理解。您会希望层中的所有对象用于同样的逻辑和行为功能。这是因为每个层用于控制它所覆盖的其他层的对象,不管它是否影响某些骨骼,也不管该层是不是附加的,等等。

unity-tidy-animators-states

Henry的左手的所有状态。每个层都有其目的和清晰的层级。它大大简化了对状态的控制和查找。

重用模式

总体而言,状态机和子状态机中可重用的逻辑模式可以加速开发,让多名成员一起制作类似的内容,简化调试并切实减少错误。

设置层结构时有用的几个模式:

  • 中心辐射型模式:该模式可以简化调试,因为您可以清楚地看到切换出和切换回空状态的过渡。中心的每个分支都应重置它接触到状态。在使用以下模式的子状态机中很适合使用分支。

    unity-tidy-animators-hub-and-spoke

    用于制作Henry右臂动画的中心辐射型模式。

  • 共享输入/共享现有模式:通过将状态分组到“intro”-“execution / loop”-“outro”(“开始”-“执行/循环”-“结束”)模式,您可以清晰地将任何动画事件或状态机行为关联到“intro”和“outro”状态。这很像混合树,随后,您可以进行迭代和更改内部的“execution / loop”状态,而无需担心中断游戏。

    unity-tidy-animators-entry-to-exit

    入口到出口:Henry右手拿书的所有状态;更多子状态隐藏了细节。

  • 临界区段和解决模式:对于可中断的动画,特别是通过玩家输入驱动的动画,请将剪辑分成两个部分。首先是一个包含所有状态更改、特效、伤害等的临界区段,必须始终播放完成。其次是可让您顺利进入空闲状态的解决动画,可通过新输入中断。

    unity-tidy-animators-critical-section-and-settle

    当您的动画可以正常播放且效果符合预期后,您需要将动画器的状态回馈到游戏状态。下面是执行此操作时需要牢记的几个要点。

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

状态机行为就是可以关联到动画状态的几行代码。您可以使用它们将行为直接连接到动画本身的状态。

不要在状态机行为中编写复杂的游戏代码,因为这样很难跟踪状态更改源自何处。如果您使用状态机行为驱动游戏运行代码,请使用消息系统;通过与Manager类进行通信或通过较高级别的参数触发代码。

最后,我最喜欢的状态机行为是:Debug.Break();这是最有用的状态机行为;您可以将其关联到动画设置中的任何位置,并且就像在可视化脚本系统中一样,您可以设置一个断点。

不要害怕在适当的位置使用C#代码。不是使用数百或数千个转换,或者连接整个位置的AnyState转换,而是使用Animator.Play或Animator.CrossFade动态地促使从代码直接转换。如果仍然无法全面控制,您可以查看我们的PlayablesAPI以了解使用代码设置动画的更多方法。有关示例,请访问https://docs.unity3d.com/Manual/Playables-Examples.html。

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

动画事件可将动画剪辑的特定时刻关联到游戏状态的特定更改;它们可用于触发视觉和声音等效果。但是,如果您在触发之前传出剪辑,它将永远无法触发。一种解决此问题的方法是添加一个状态机行为,确保达到特定时间点时始终触发事件,而不管游戏中是否发生其他事件。

unity-tidy-animators-state-machine

更多资源

您喜欢本文吗?请告诉我们!

喜欢。继续发送 还行。有待改进