こんにちは! James Burton です。White Paper Games でテクニカル アーティストとして働いています。この投稿記事は、弊社のリリース予定のゲーム、The Occupation で AI キャラクターのロコモーション システム作成で採用したプロセスについて説明します。このシステムは私、James Burton、弊社の AI デザイナーの Jonny Pickton、アニメーターの Robert Beard、そしてプログラマーの Martin Cosens という 4 名で作りました。このシステムを作るまで、自分たちはチームとしてキャラクター アニメーションやキャラクターそのものについても経験が全くなかったことをまず述べておきます。こうした作業の先駆者であるというつもりはありません。自分たちのプロジェクトに合ったソリューションにたどり着いただけですが、皆さんと共有する価値があるものだと思いました。私たちのやり方を改善するフィードバックやコメントがあればお知らせください。連絡先はこの記事の最後に記載します。
このロコモーション システムで実現したかった主なものは以下の通りです。
- モジュール式の非破壊エレメント (レイヤーを追加したり、取り除くことで、キャラクターが動きを停止したり、他のレイヤーに影響を及ぼすことはない)。
- プログラマーが一名しかいないため、コーディングは少なく抑える。
- 自分たちが作っているゲームには戦闘がないため、それに合わせた適切な雰囲気にする。AI は穏やかであり、観察の対象になる。ストレイフ移動 (正面を見ながらの横移動) のアニメーションは使わない。
- 可能な限り UE4 のデフォルトに従う。
- 可能な限り一定の速度と回転速度に従う。
上記を行う前に、以下のような他の方法を試みました。
フル ルートモーションのセットアップ: 見栄えはいいですが、AI が他のタスクを遂行するために必要な精度はありませんでした。
ルート モーションとカプセル駆動のハイブリッド タイプ: ターン用にルートモーションを使用し、それ以外のものすべてにカプセル駆動の動きを使用しました。ルートモーションのべロシティをブレンドしてカプセルに戻すと、時々問題が生じたので、これはやめました。
結局、完全にカプセル駆動のシステムにいくつかのテクニックを加えることで、再生中のアニメーションにカプセルの速度を合わせることができました。詳しいことは後述します。
以下は、UE4 で編集を加えていないデフォルト設定の状態です。キャラクターが一定の歩行サイクルで、シーンを移動しますが、自然な動きには見えません。
どのように修正したかを以下に示します。
Layer 1 – スポットで方向転換
まず、ベースとなるレイヤーのセットアップに焦点をあてました。こうすることで、デザイナーはキャラクターに関する作業を行い、基本レベルの忠実度を実現できました。これは、スポットでキャラクターの向きを変えてナビゲーション パスの次のターゲット ポイントを向かせることを意味します。
- アニメーションは一定の回転速度でオーサリングされます。
- アニメーションの再生速度を、キャラクターがターンする必要がある角度に応じてスケーリングしました。そのために、ターンする必要がある角度を、キャラクターの回転速度で除算しました。その結果、ターンの望ましい回転時間が得られました。次に、オリジナルのアニメーションの時間 (秒単位) を、望ましい回転時間で除算しました。これが、ターンのアニメーションの再生速度になります。
- 非常に基本的なセットアップですが、一部のゲームではシッピング可能なものができるかもしれません。
以下は、上記の結果を示す動画と、レイヤーに対してオーサリングしたアニメーションを含む GIF です。
[スポットで 45 度方向転換] [スポットで 90 度方向転換] [スポットで 180 度方向転換]
Layer 2 – Walk Starts (歩行開始)
次のレイヤーは歩行開始の動作で構成されます。キャラクターはベースとなる歩行速度にすぐになるのではなく、加速していきます。加速を扱うため、すべてをカプセル駆動にしたいと考えて、小さなツールを記述しました。非常に単純なツールです。自分のコーディング経験は非常に限られたものだったので、MEL で作成しました。作成したツールでは、各フレームでのキャラクターの速度を表し、加速を示すカーブを描きます。これはどのように機能するのでしょうか? アニメーターにアニメーションを作成させて、単純な計算で全体をサンプリングしました。
TranslateX.F2 – TranslateX.F1 は、アニメーションの現在のフレームから前のフレームを減算して、フレーム間でどれくらいの動きがあったかを計算しています。次に、それを望ましい FPS (アニメーターによって、24 fps、30 fps など様々) での 1 フレームの所要時間で除算します。
幸い、このデータをスケルトンのルート ボーンの属性に入力できるので、UE4 にインポートする際に [Import Custom Attributes (カスタム属性をインポート)] を必ずオンにします。これで、データが Animation アセットでカーブとして入ってきます。このように他から数多くの便利なセットアップをインポートできる点で、アンリアル エンジンは実に素晴らしいと思います。
続いてこのカーブを使ってキャラクターの最高速度を設定し、先に進みます。
以下は、上記の結果と、オーサリングしたアニメーションの一部の GIF です。
[歩行開始、前方向] [歩行開始 90] [歩行開始 -90]
Layer 3 – Walk Stops (歩行停止)
これは Walk Starts (歩行開始) と設定が全く同じため、非常に単純です。ただし、“Stop Animation” の再生をいつ開始するかをキャラクター側に認識させるには、UE4 で若干のプログラミングが必要でした。
プログラムで、ナビゲーション パスの最終ポイントをチェックし、最終ポイントから必要な距離で (これはアニメーション作成時にアニメータが指定しますが、短くするようしてください)、“play stop animation (停止アニメーションを再生)” イベントを発行します。
最終ポイントとみなすことができる範囲が原因で足が若干スライディングします。以下の例では目で見てわかりますが、微調整を加えれば適切に直すことができます。自分たちにとっては、キャラクターが問題なく最終ポイントに到達することが重要でした。他のアニメーションがそこから再生するからです。ですから、若干のずれがあれば、最終ポイントにスナッピングするようにして、残りの部分が問題なく機能するようにしました。
以下は上記の結果の動画と、オーサリングしたアニメーションの GIF です。
[歩行停止、前方向]
Layer 4 – 曲線パスのように見せる
これは修正が困難な課題であり、コーディングが少々必要でしたが、同時にこれがロコモーション システムの全体的な見栄えに非常に大きな違いを生み出すレイヤーとなりました。
ここでは、基本的にナビゲーション パスからキャラクターを取り出して、キャラクターがターンしながら次のポイントを向くまで、前向きのベクターで動きを操作できるようにしました。以下の図を見た方がわかりやすいと思います。
重要なことは、キャラクターのカプセルの一定の回転と速度を利用することです。これで計算が簡単になります。
以下は結果の動画です。
これに関してアニメーションをオーサリングする必要はありませんでした。十分見栄えがよかったからです。
Layer 5 – ターンの予測
キャラクターがターンを予測していたかのように見えるちょっとしたアドオンです。キャラクターが実際にターンして進行方向を変える前に、頭の向きと体の向きを少し変えるという動きで構成されると考えました。
これには少々の工夫が必要でした。単にキャラクターが移動する次のポイントを使うだけでなく、それに向かう回転を線形補間するからです。
結局、キャラクターの前方にあるナビゲーション ポイント間を補間して、AimOffset を使ってキャラクターの体と頭部を常にその方向に向かせるシステムを作りました。以下の例では、キャラクターが追いかけ続ける黄色のボールが見えます(決してボールはつかまえられませんけど)。
以下は上記の結果とブループリントのセットアップ、Aim Offset の GIF です。
[歩行から Aim Offset ]
これが The Occupation で使用しているロコモーション システムです。以下は、このセットアップの最終的な AnimGraph と動画です。この動画では、UE4 のデフォルト設定と、我々のロコモーション システムでナビゲーション パスを移動したものを比較しています。
この投稿が皆さんのお役に立てば幸いです。ご質問やコメントがあれば、 Twitter (@whitepapergames) で、または[email protected] までメールでお知らせください。