最終更新:2018 年 12 月・この記事は約 2 分で読めます。

このページで学ぶ内容:Will Armstrong からのアニメーターコントローラー (Animator Controller) に関する 5 つのテクニックをご紹介いたします。キャラクターのアニメーターコントローラーを作成することでスクリプトで作業するのと同じように、開発サイクル全体で効率よいアニメーションの再利用、拡張、そして動作を安定するようにしたり、さらにデバッグもできるようにするためのヒントを得ることができます。スクリーンショットはすべて、『Firewatch』に出てくるキャラクター Henry のアニメーションを引用しています。

ブレンドツリーで複雑さを隠す

ブレンドツリーは、複雑さを隠すのに最適です。ブレンドツリーはステートを持ちません。また、コードをコールバックしません。定義されたパラメーターに応じて、さまざまなクリップをブレンドするだけです。

この重要性は、ゲームの他の部分を壊す心配をすることなく、ブレンドツリーを反復処理できることにあります。ブレンドツリーのアニメーションの大半には動作を関連付けることができないため、複雑なステートの関係を隠し、将来のバグを防止できます。

unity-tidy-animators-locomotion-blend-tree

複雑に見えますが、プロジェクトを単純に保つうえで、この移動のブレンドツリーが役立ちました。

「レイヤー」を考えるときは「スクリプトのクラス」を考える

レイヤーを、スクリプトに含まれるクラスに似たものと考えると役立ちます。レイヤーに含まれるすべてのものは、同じ論理的機能と動作機能の両方を果たす必要があります。これは、他のレイヤーのオーバーライド内容、レイヤーが特定のボーンに影響するかどうか、そのレイヤーが追加レイヤーかどうかなどを、それぞれのレイヤーが制御しているからです。

unity-tidy-animators-states

Henry の左手のすべての状態。各レイヤーには目的と明確なヒエラルキーがあります。これにより、制御が簡単になっています。ステートを見つけるのも簡単です。

パターンを再利用する

ステートマシンとサブステートマシンで再利用可能な論理パターンを利用すると、開発時間を短縮し、複数の開発者が類似のコンテンツを作成でき、デバッグが簡単になり、全体的なバグの数を減らすことができます。

レイヤー構成に適したいくつかのパターン:

  • ハブとスポーク:このパターンを使用すると、空のステートからの遷移や空のステートへの遷移をはっきりと理解できるため、デバッグが簡単になります。ハブの各スポークは、触れているすべてのステートをリセットする必要があります。スポークは、以下のパターンを使用してサブステートマシンを作成するのにふさわしい候補です。

    unity-tidy-animators-hub-and-spoke

    Henry の右腕をアニメーション化するために使用したハブとスポークパターン

  • 共有開始/共有終了パターン:ステートを「導入」 - 「実行/ループ」 - 「終了」のパターンにグループ分けすることで、任意のアニメーションイベントまたはステートマシン動作を「導入」および「終了」ステートにきれいにアタッチできます。その後、ブレンドツリーと同じように、ゲームを壊す心配をすることなく、内部の「実行/ループ」ステートを反復処理および変更できます。

    unity-tidy-animators-entry-to-exit

    開始~終了:Henry の右手が本を持つ動作のすべてのステート。この下にはさらにサブステートによって詳細が隠されている。

  • クリティカルセクションとセトルパターン:中断可能なアニメーション(特に、プレイヤー入力駆動のアニメーション)の場合、クリップを 2 つの部分に分けます。1 つは、常に完了まで再生される必要のあるすべてのステート変更、効果、ダメージなどを含むクリティカルセクションです。もう 1 つは、待機に戻すのに自然な動作で、新しい入力によって中断可能なセトルアニメーションです。

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

    アニメーションが機能し、期待どおりの見た目になったら、アニメーターのステートをゲームのステートにフィードバックする必要があります。これを行う際に留意するとよい点がいくつかあります。

ステートマシンの動作内には複雑なコードを記述しない

ステートマシン動作は、任意のアニメーションステートにアタッチできる少量のコードです。これを使用して、動作をアニメーター自体のステートに直接関連付けます。

ステートマシン動作内に複雑なゲームプレイコードを記述しないようにしましょう。ステートの変更元の追跡が難しくなる可能性があるためです。ステートマシン動作を使用してゲームプレイコードを駆動させている場合、メッセージシステムを使用してマネージャークラスに連絡するか、より高いレベルでパラメーターからコードをトリガーします。

最後に、筆者のお気に入りのステートマシン動作 Debug.Break(); をご紹介します。これは最も便利なステートマシン動作です。これをアニメーションセットアップの任意の場所にアタッチすると、ビジュアルスクリプティングシステムと同じような、ブレークポイントを設定できます。

必要に応じて、恐れずに C# コードを使用しましょう。数百、さらには数千の遷移を用意したり、至る所に AnyState 遷移をつなげたりするのではなく、Animator.Play や Animator.CrossFade を使用してコードから遷移を直接、動的に発生させます。それでも制御が十分でない場合は、PlayablesAPI を調査すると、コードを使ったさらに多くのアニメーション化方法を知ることができます。例は、https://docs.unity3d.com/ja/current/Manual/Playables-Examples.html で確認できます。

ステートマシン動作を使用してアニメーションイベントが常に発生するようにする

アニメーションイベントは、アニメーションクリップの特定の瞬間を、ゲームの特定のステートの変化に関連付けます。アニメーションイベントを使用して、視覚エフェクトやサウンドエフェクトなどを発生させることができます。しかし、発生前にクリップから遷移してしまうと、それらのエフェクトは発生しません。これを解決するには、ゲーム内で何が発生しようがしまいが、特定のタイミングになるとイベントを必ず発生させるステートマシン動作を追加します。

unity-tidy-animators-state-machine




Unity Pro Tips購読

ご登録がまだの方、こちらからご登録ください。
Unityを業務で使用している方のために、ノウハウやベストプラクティスなどをお届けします。

この記事がいかがでしたか?

よかった いまいち