キャラクターアニメーション
課題
以下の状況に対応する:ユーザーが作成したかサードパーティからダウンロードした不正なアニメーション付き3DキャラクターをGodotでセットアップしたい。
解決策
このレシピでは、既にキャラクターモデルとアニメーションをインポート済みであることを前提としています。まだの方は、アセットのインポート方法を参照してください。参考までに、セクション説明欄でリンクされているアートパックを使用しています。
キャラクターの準備
以下の理由でキャラクターには CharacterBody3D を選択しました。そのため、シーンはこのような外観になるはずです(メッシュリストが非常に長いため、Rigノードは折りたたみ状態にしています):
最初に目につくのは、キャラクターが武器と盾でいっぱいになっていることです! 作者は親切にも、すべての装備品が正しく取り付けられ、適切な向きになるようにしてくれています。リストをスクロールして、表示したくないアイテムを隠すことができます。
アニメーションツリー(AnimationTree)について
利用可能なアニメーションが多数ある場合、それらをすべてコードで管理するのは急速に複雑化します。プレイヤーが行っている動作に応じて、どのタイミングでどのアニメーションを再生するかを判断するには、どれほど多くのif文が必要になるか考えてみてください。アニメーションがわずかであれば問題ありませんが、数が増えるとすぐに手に負えなくなり、実用的ではなくなってしまいます。
また、キャラクターが静止している場合も考慮します。この時は"Idle"アニメーションを再生する必要があります。プレイヤーが「前進」ボタンを押すと、キャラクターは移動を開始し、同時に"Walking"アニメーションに切り替わるべきです。しかしこの急激な切り替えは不自然に見えるため、できれば2つのアニメーションをよりスムーズに移行させる「ブレンド処理」が望まれます。
これらの複雑なアニメーション問題を解決するには、AnimationTreeノードを使用が必要です。このノードはAnimationPlayerを制御するために設計されており、アニメーションの遷移やブレンド方法を管理する機能を備えています。
シーンに AnimationTree コンポーネントを追加してください。[インスペクター]で[ツリールート]を新規作成された AnimationNodeStateMachine に設定し、[Anim Player]ではキャラクターの AnimationPlayer を選択します。最後に[有効化]チェックボックスをオンにしてください。
AnimationTree が有効になっていると、 AnimationTree でアニメーションを選択できなくなることにご注意ください。変更を加えたりアニメーションをテストする必要がある場合は、作業する際にツリーの 有効 プロパティを必ずオフにしてください。
待機/歩行/走行サイクルについて
このモデルには数多くのアニメーションが同封されています。ここでは特に待機→歩行/走行の遷移、ジャンプ、攻撃モーションに焦点を当てます。他のアニメーションも必要に応じて同様の方法で扱えます。
AnimationPlayerコンポーネントで、“Idle”(待機)、“Running_A”(前進ランニング)、“Walking_Backwards”(後方歩行)、および"Running_Strafe_Left"/“Running_Strafe_Right”(横移動左右ランニング)のアニメーションを設定してください。すべてループ再生に設定することを確認してください。「Play」ボタンを押してテストできます。(▶)。いずれかがループになっていない場合は、設定した後でキャラクターを再インポートしてください(アセットのインポート方法参照)。
AnimationTreeノードを選択すると、ウィンドウ下部にパネルが開きます。
例として、空きスペースを右クリックし、「アニメーション追加 → 待機」を選択してから、同様に「1H_Melee_Attack_Chop」アニメーションも追加してください。
「ノードを接続」ボタンを選択し、開始からアイドルまでの接続線を引いてください。即座に「アイドル」アニメーションが再生されるはずです。
しかし、このままではうまくいきません。2つのアニメーション間で急速に点滅を繰り返すだけで、両方が「即時遷移」に設定されているため、スムーズな移行ができないからです。
遷移条件を変更するには、アイコンを使用して選択モードに切り替えた後、いずれかの接続をクリックしてください。インスペクターウィンドウで接続プロパティを確認できます。アイドル状態からアタック状態への遷移では、進行/モード を「有効」(“自動” ではなく)に設定したいです。つまり、指示があった場合にのみ実行されるということです。接続ライン上のアイコンの色が変化することに注意してください。
接続状態が攻撃モードからアイドルモードに切り替わる際は、切替方式を「終了時」に設定し、進行モードを「自動」にしてください。
これで、攻撃ノードの ▶ ボタンをクリックすると再生が始まり、完了するとすぐにアイドル状態に戻ります。
この設定により、異なるアニメーションの実装方法とそれらの間の遷移方法について理解できたかと思います。ただし、さらに一歩進んだ内容を扱うため、ゴミ箱アイコンを使用して2つのアニメーションを削除し、代わりに「ブレンドスペース」を設定してみます。
ブレンドスペース
以下の手順で設定を進めてください。
- 空欄に右クリックして新規
BlendSpace2Dを作成します - BlendSpaceの名前をクリックし、
IWR(idle-walk-run)に改名します Startから遷移を追加し、ブレンドスペースが自動的に再生されるようにします
鉛筆アイコンをクリックするとブレンドスペースを編集できます。
この2D空間はキャラクターの水平方向移動ベクトルを表します。静止状態の場合は座標が(0, 0)となるため、まずポイントを作成ボタンをクリックしてから、グリッド中央をクリックしてアニメーション追加 → 待機姿勢を設定してください。
上部中央に「ランニングA」アニメーションを追加し、下部中央に「ウォーキング・バックワーズ」アニメを、左右両端にストレーフィングアニメーションを配置してください。
次に、十字ボタンをクリックしてブレンド位置を設定し、グリッド上でドラッグして移動させてください。アニメーションが極値間でスムーズに遷移するのが確認できるはずです。
ブレンドスペースの実験が終わったら、パネル上部のパス項目にある「ルート」をクリックしてツリーの根に戻ります。
状態機械の設定
アニメーションツリーの中核となるのがIWRループアニメーションです。このアニメーションはキャラクターが最も多くの時間を過ごす場面で再生されます。他のあらゆるアニメーションは、この基本アニメーションから分岐する形で実装されます(先ほど攻撃動作で行ったように)。
以下の画像では、他の複数のアニメーションで同じ手法を採用しています。遷移プロパティは、前述の例と同様に設定されている点にご注目ください。
また、アニメーションの名前をクリックすることで変更することもできます。中には非常に長い名前のものもありますので。
※アニメーションが異なるのは「ジャンプ」動作のみです。ジャンプアニメーションは以下の3段階で構成されています。「開始」「着地」で、キャラクターがジャンプを始める時と終了する時にそれぞれ再生されます。また、空中にいる間はループする待機アニメーションが再生されます - 例えば長距離落下した場合などに。
以下の手順で3つのジャンプアニメーションを追加し、適切にリンクしてください。
段差から転落した場合、即座にIWRからJump_Idleに直接遷移できるようにする必要がありますが、「ジャンプ」ボタンを押した場合はまずJump_Startを経由する必要があります。
さらに、IWRからJump_Startへの遷移設定は「自動」のまま変更していません。「有効化」に差し替えるのではなく、この遷移に条件としてjumpingを追加しました。
同様に、「Jump_Idle」から「Jump_Land」への状態遷移には「grounded」(着地状態)という条件があります。
これらの条件をコードで設定し、遷移を実行になります。
最後に、注意深く観察すると、Jump_LandからIWRへのトランジションが滑らかでないことに気づくかもしれません。これは、2つのアニメーションの最終フレームと最初のフレームが完全には一致していないためです。この問題を解決するには、両者間のトランジションを選択し、小さなXfade時間を0.1に設定することで、スムーズに移行させることができます。
まとめ
3Dキャラクターのアニメーション設定が完了し、使用準備が整いました。AnimationTree を設定したことで、キャラクターのモーションコード内でアニメーションを選択し、スムーズに遷移させることが格段に容易になりました。
セクションの説明 を参照すると、3D作業のさらなる事例や、ダウンロード可能なGodotプロジェクトなどの例を確認できます。