Game Animation Sampleをもとにしゃがみ・しゃがみ歩きを実装することで、UE5.4で正式リリースされた新しいアニメーション管理システムである「モーションマッチング」とその使い方を理解しましょう。
公式の「最初の1時間」よりもっと簡単に概要と使い方を学べます。
しゃがみ実装
キャラ本体のしゃがみ 前説
まずはキャラクターのブループリントを編集します。CBP_SandboxCharacterです。
コンテンツのBlueprintsの下にいます。
一旦普段は非表示になっているキャラクター本体を表示させてみましょう。
「Capsule Component」の「Hidden in Game」のチェックをはずします。
この状態でゲームを開始すると、こんなふうにカプセルも表示されましたね
プレイヤーが操作しているカプセルのほうで、それが地面を動いているのにあうようにマネキンさんに走るアニメを付けているということです
キャラ本体のしゃがみ 実装
本題のしゃがみ機能は、キャラクタークラスにあらかじめ用意されています(Crouch/Un Crouch)
イベントグラフ左列の下のほうに
「EnhancedInputAction IA_Crouch」 しゃがみボタンが押された時のイベント処理があります
いまはこの実行ピンが接続されていませんが繋いじゃいましょう
「Cキー」がそれ用の入力に設定されています
これで
- しゃがんでいたらしゃがみ解除 → つまり立ち姿勢
- しゃがんでいなければしゃがみ → しゃがみ姿勢
が実行されます
では早速ゲーム中の様子をみてみましょう。
Cキーを押すとしゃがみ、再度押すと立ちました。(。´・ω・)ん?
キャラクターの操作としてはカプセル自体が対象なので、カプセルの背が縮むことが「しゃがみ」です
しゃがんだとき用のアニメーションが設定されていないので、棒立ちのマネキンさんが表示されていますね
ゲームを終了すると、しゃがみ用のアニメーションが設定されていないことを怒られています
しゃがみ状態で使うアニメーションのデータベースを用意して、メッシュにもしゃがんでもらいましょう
キャラクターの見た目のしゃがみ:前説
隣にあるアニメーションのブループリントを開きます
AnimGraphの中身がサードパーソンテンプレートとはまったく違いますね。
最初にあるのが噂のモーションマッチングのノードです
Motion Matchingノードが参照するOn Update関数に「Evaluate Chooser」というノードがあり
ここで「いまカプセルがどんな状態だからこのアニメーションを使う」という選択が行われます
この検索条件でフィルタしていって最終的な選択をする方式のことを「クエリ」ベースと呼ばれています
このノードの詳細欄から、チューザーテーブルへの参照が設定してあり、このファイルは
Characters/UEFN_Mannequin/Animetions/MotionMatchingDataにあります。ではこれを開いてみてみましょう
左端に結果(条件成立時に選ばれるもの)の列があり、それ以降はフィルターの記号が付いた条件列です。
条件列
- 数値型:最小値と最大値の2つの数値入力欄でその中間の値も含めて範囲内なら成立判定
- Boolean:TrueかFalseかの選択欄で一致すれば成立
- 列挙型:列挙子の選択欄で同じなら成立
ここで、LODが0から0(つまり0)だったらDenseという精細なテーブルが選ばれて、LODが1だったらSparse粗いやつが選ばれて、どっちでもなかったら詳細なほうが選ばれます。
このように、検索条件とその結果使われるものが定義されているのがチューザー(選択)テーブルです
ゲームエンジン以外でも一般に真理値表とよばれるものですね。
この選ばれた結果もまたチューザーテーブルになっていて、今度は検索条件の列がたくさんある表がでてきました
- 移動モードは地面にいるか浮いているか
- 姿勢は立っているかしゃがんでいるか
- 移動状態はアイドルか動いているか
- ゲイトは歩行様式: 歩き・走り・ダッシュ(スプリント)
それらの組み合わせてどのアニメーションを使うかが決まります
結果にはアイドル・歩き・走り・空中が用意されてますね
ここにしゃがみを追加してあげればよさそうです
その前に横並びの中がどうなっているかみましょう
歩きの中はさらにたくさん列があるテーブルが出てきました
歩きはじめや向きを変えたときなどのアニメーションが細かく用意されているということです
この中身がとうとう末端で「Pose Seach Database ポーズサーチデータベース」というファイルです
この中身はアニメーションがリストアップされているもので、
アニメを選ぶと再生されます。複数選ぶと重ねて再生もできます
PSDが選ばれるまでに絞り込まれた条件に加えて、さらにカプセルがどっち向きに進もうとしているかでPSD内のどのアニメーションを再生するのかが決まります。
ちなみにルートモーションが必須だそうです。これはどっちに進もうとしているかの情報を、アニメーション側も持っていないとPSD内の選択ができないからでしょう
あとは下部に細かい設定欄がありますが、最初はあまりいじるものじゃないかなと思います
詳しくはモーションマッチングのチュートリアルで勉強してください
仕組みがわかったところでしゃがみを追加しましょう
キャラクターの見た目のしゃがみ:実装
チューザーテーブルの加工
「行を追加」から「ネスティングされているチューザー」を選びます
これで空中状態の下に枠ができたので、「なし」の枠から「新規のチューザー」を作り
しゃがみ用なので「Crouch」とでも名付けましょう
これが選ばれる条件を設定します
- 「On Ground」地面にいるとき はそのままでいいですね
- 「Stand」立ちを「Crouch」しゃがみに変えて
- あとの条件は「何でもいい」ので「任意」(英語だと「Any」)に変えます
これで条件設定はOKです。
「編集」で中に進み、「行を追加」でしゃがみ用のデータベースを設定しましょう
「アセット」→「なし」から一番上の「ポーズ検索データベース」を作成しましょう
ファイル名はPose Seach Databaseで「PSD_〇〇」とつける習慣みたいですね
スキーマ選択の画面がでますがデフォルトのやつでいいと思います
※他のは用途が違いそうなので
これで保存したらチューザーテーブルは完了です。
しゃがみの中をさらに細かく分けたい場合は条件の列を追加します
条件には紐づけられているアニメーションブループリントを経由してキャラクタの情報を参照することができます
今回はやりません
(やりたいときは)歩きや走りの設定をみてマネしてください
粗いほうにも同じ手順を繰り替えしますが、選択されるPSDファイルはさっき作ったファイルを参照すればOKです。
最後にPSDの中身の用意ですね
PSDファイルの作成
Idleのフォルダにある、しゃがみアイドルアニメーションを使いましょう
ドラッグアンドドロップでテーブルに追加します
これ1件だけでもデータベースとして機能します
無事しゃがめましたね
ちなみに1件だけしかアニメがないので移動してもこのアニメが選ばれてその姿勢のまま滑ります(;^ω^)
キャラクターの設定を歩けなくするのもありですが、
ここにしゃがみ歩きのアニメーションを追加して、しゃがんだまま歩ける仕様とします
Crouch WIPのフォルダにしゃがみのアニメがたくさん入っています
これらを全部入れてもいいんでしょうが、とりあえずループだけあればいいかなと思いますので「loop」で絞り込んで、
まとめて選択して放り込みましょう
ゲーム中もしゃがみ歩きできるようになりましたね。
このときよーくみるとおかしい部分もありますが、反対足をすり抜けちゃうのを修正するには、
ピボットなどの移動方向を転換する条件で事前に足がクロスしない動きを用意したデータベースを使う
みたいな感じです
あとはしゃがみ状態で回転だけして欲しかったですが、ターンのアニメーションが入っていなかったのでやりたい場合は別途準備する必要があります
ちなみにLyraゲームサンプルにしゃがみターンのアニメーションがありますが、それだとルートの回転が不適切でどっちみち加工が必要らしいです。これが5.4に間に合わなかった理由かも。。。
データベースのノーマライゼーション
あと、モーションマッチングできたのでついつい忘れがちですが、ノーマライゼーションというDB間の強さ調整みたいなものがあり、
あたらしく追加したデータベースはここに登録するそうです
公式にもあまり説明がありませんが、手順にはあるしやっておいたほうがよさそうです
ここのプラスで枠を増やして
作ったしゃがみデータベースを設定するだけなはずです
細かく条件分けしたら全部登録しましょう
割愛しますがDense/Sparse両方やります
キャラ本体のしゃがみ改良:しゃがみからジャンプできない問題
本題と少しそれる小ネタですが、しゃがみ状態から直接ジャンプできません。
そういう仕様なのですが、私はジャンプさせたいので、その改造も紹介します。
キャラクターのBPでジャンプの処理を改造します。しゃがんでいたらしゃがみ解除する処理はすぐ下にありますね
コピペで使いましょう
しゃがみの解除が実際に動くのは1フレームあとなので、Delay Until Next Tickで1フレーム待ってからジャンプの処理に進むようにしています。
あとしゃがんでないときジャンプしなくなっちゃうので、反対側も忘れずにつなぎましょう
これでジャンプボタン押されたときにしゃがんでいたら解除してからジャンプの処理を行う形になり、しゃがんだ状態から一発でジャンプできる操作性にできます。
座学コーナー:モーションマッチング周辺の詳細解説
後半は座学コーナーです
もっとちゃんと理解したい人に向けてモーションマッチング周辺のアニメーションBPの中身をもう少し詳しく説明していきます
まずイベントグラフでは、キャラクターから情報をもらう処理が少しだけありますね
大事な情報取得はまとめられています。あと「Generate Trajectory」はどう動いたかこれからどう動くかの軌道情報で、これがモーションマッチングに欠かせない情報です。
AnimGraph アニムグラフのほうをもっと詳しく見ていきましょう。
ものすごい大量の英語に圧倒されますが、翻訳しておいたのでそう怖くないですね
最初のモーションマッチングがメイン処理でこれまでのステートマシンの代役ですね
ステートマシンとチューザーテーブルはどっちが優れているというものではないと思います。好みだったり、場合によっては両方使うハイブリッド作戦もあるかもしれません。
更新関数でどのアニメーションを表示するかを決めています
このチューザーテーブルが肝です
そしてテーブルを参照していることは前半でもみました。
ここでアニメーションBPの参照をテーブルに渡しているのもポイントです。ここでイベントグラフでキャラクターから取得した情報も含めてアニメーションの選択に必要な情報を渡してあげれば、それをチューザーテーブル内で参照することでもっと複雑な条件分岐ができます。
ちなみにこの情報はこのアニメーションブループリント固有になるので、なんとなく操作キャラクター自体を置き換えようとするとチューザーテーブルが何も情報得られなくて動きません
コピーしたキャラクターでやりたい場合はチューザーテーブル内のキャラクタークラス設定もセットで変えてあげる必要があります
ではアニムグラフにもどりましょう
チューザーテーブルで選ばれたアニメーションがここから出てきます
その次は加算処理です。このブレンドスペースというのは、複数のアニメを混ぜて間を作ってくれるもので、それをもとのアニメにさらに追加します。
これで走っているアニメに首を回すアニメを合体して、走りながら首は横向きというアニメーションができるということです。
ここのブレンドスペースは体の傾き制御です。
コントロール押しながらマウスを動かすとキャラクターの傾き具合が変わります。
走っているときに方向転換するときなどに曲がる方向に傾けることで外側に投げ出されないみたいな自然なアニメーションになると。
これは白い点の3か所だけにアニメーションが設定してあって、その間は計算で作ってくれています
そして全身のポーズをこれに置き換えるのではなく、体の傾き具合だけをもとのアニメに加えることで
走りながら傾いたりできるように混ぜるのがその次の加算ノード「Apply Mesh Space Additive」です
次も同じように加算する処理ですが、今度は顔の向きを変えるエイム処理です
さきほどは左右の1軸でしたが、顔の向きは縦横の2軸に対応しています
これも白い点の位置のアニメーションが設定されていますが、首の構造とかを考慮して15個用意されていますね
この首回すのはエイム状態のフラグが有効な時だけなので、エイム時は首が動くけど、解除すると動かなくなります
この「Additive Identity Pose」が首を曲げないまっすぐポーズで、フラグが無効な時は何も加算しないのですが、加算しないときにも0足すみたいなものらしいです。
次のスロットノードはパルクール動作など、特定のタイミングでモンタージュ再生するためのやつです
これもスロットを複数定義できたり、骨の単位でブレンドして、走りながら上半身だけパンチしたり・銃発射のモーションといったことができます(後日使います。銃を撃つ動画で説明済みです)
その次は、カプセル自体を動かすモーションマッチングのアニメーションと、スロットからのアニメーションモンタージュを混ぜると起きる問題調整用ですが、黄色いコメントは触るな危険って感じです(;^ω^)
次は段差で足を地面につけたりするIKのやつです
最後が最初のモーションマッチングとセットになっている、直前の行動履歴を保存するものです
次のポーズを計算するときに、さっきまでこうだったという情報も使っているということですね
まぁ設定をいじる必要はなさそうです
つづく
というわけで本記事では
「モーションマッチング」の説明とそれを使った「しゃがみ」を実装しました
次は1人称視点を説明しようと思います。
コメント