20K Views
October 28, 19
スライド概要
本スライドは2019年9月20日に行われた勉強会「 UE4を用いたTPS制作事例 〜Earth Defense Force: Iron Rainの場合〜」の講演資料となります。ユークス様、このような貴重な情報を一般に公開していただきまことにありがとうございます!
※講演資料内にGif動画などが埋め込まれてる可能性がございます。以下のリンクからオリジナルのスライドをご参照していただくことをおすすめいたします。
https://epicgames.box.com/s/15cx9zllwl2b7xssqmz9zabl5z0kw620
ダウンロードのためのパスワードは ""EDFIREpic""です。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UE4を用いたTPS制作事例 EDF:IR アニメーション作成事例紹介 株式会社ユークス ©2019 YUKE'S ©2019 D3 PUBLISHER
はじめに ・4.19.2がリリースバージョンです ・本日お話する内容が、先日リリースされた4.23でも同じ動作をするかは 保証できませんのでご了承ください ・参考情報程度ですが、開発期間中に4.20.2までは動作確認しました ・原則としてエンジンは改造していません。必要最低限のバグ修正やCLの 取り込み、一部エディタの機能調整のみ施しました ©2019 YUKE'S ©2019 D3 PUBLISHER
UE4起動初日の話 1/2 • 今までのプロジェクトでは「組み込みはプログラマー任せ」だったところが個人的 な反省点だった。そのため、いい機会なので自分でこれらを組み込んでみよう! というところから作業を開始した • まず、アニメーション関連の情報を集めてみた。すると、クラスブループリントと ABPを組むことができればキャラクターを動かせる、ということがわかった ©2019 YUKE'S ©2019 D3 PUBLISHER
UE4起動初日の話 2/2 • とは言え、当時の私のスキルは… UE4の経験 : なし プログラミングの経験 : なし 情報の知識 : センター試験レベル アニメーションの経験 : ゲーム中のアニメーション作成が主 という状態で、勉強と制作を同時並行で進めていくことになった ©2019 YUKE'S ©2019 D3 PUBLISHER
導入から完成までの流れ 1/2 • 何はともあれチュートリアルで勉強開始 動画<Introduction to Third Person Blueprint game>を利用 https://wiki.unrealengine.com/Introduction_to_Third_Person_Blueprint_Game_Playlist • 仮モデルを使ってプレイヤーのABP第1弾を作成 • プログラマーと協力しつつ実際のゲームで動かしてみる ©2019 YUKE'S ©2019 D3 PUBLISHER
導入から完成までの流れ 2/2 • 第1弾の検証結果をもとに第2弾を作成 • 本製作開始に合わせ第2弾を整理・拡張した第3弾を作成 • 各敵キャラクターやビークル等のABPを作成 • 以後、各ABPを必要に応じて拡張 ©2019 YUKE'S ©2019 D3 PUBLISHER
今作で使用したABPの種類 • プレイヤー用 • 敵用(ステートマシン制御) • 超大型の敵用(モンタージュ制御) • ビークル用 • 武器用 }考え方はプレイヤーと同じなので、今回は省略 ©2019 YUKE'S ©2019 D3 PUBLISHER
本日の内容 • プレイヤーのア二メーション作成とABPの構築について • 敵のタイプに応じたABPの構築について • 最後に ©2019 YUKE'S ©2019 D3 PUBLISHER
プレイヤーのア二メーション作成と ABPの構築について ©2019 YUKE'S ©2019 D3 PUBLISHER
要件 • さまざまなPAギア・武器のアニメーションを可能な限りローコストで 実装すること • アクションの追加等の拡張が可能な構造にしておくこと • プログラマー、アニメーターが連携してブループリントの作業ができる 状態にしておくこと ©2019 YUKE'S ©2019 D3 PUBLISHER
最終的に出来上がったABP 1/3 続く ©2019 YUKE'S ©2019 D3 PUBLISHER
最終的に出来上がったABP 2/3 続き ©2019 YUKE'S ©2019 D3 PUBLISHER
最終的に出来上がったABP 3/3 • ざっくりと流れを書くと以下の様になっている 基礎 ブレンド PAギアの アニメーション アニメーション アニメーション IK等の補正 PAギアの機構の コントロール ©2019 YUKE'S ©2019 D3 PUBLISHER
プレイヤーのスケルトン • プレイヤーが選択できるPAギアは4つ トルーパー ジェットリフター ヘビーストライカー プロールライダー • 毎回ABPを作るのは手間なので全ての 骨が入ったスケルトンを用意した ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第1弾 概要 1/2 • チュートリアルをベースにステートを追加して歩き、走り、ジャンプ、回避 が出来る程度まで作成した • ステート遷移は定番(?)の<TimeRemaining(ratio)>を多用した • 上半身ブレンドの検証も兼ねて、アサルトライフルとロケットランチャーの 2つの構えを組み込んだ ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第1弾 概要 2/2 複雑な予感… ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 1/8 • 歩き、走りはブレンドスペースを利用した ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 2/8 • 移動の種類は歩き、走りの2種(スプリントはアクション扱い) • 移動の方向は前歩きの前、左右、右後ろの4種と後ろ歩きの後ろ、左右 の3種の計7種 • 移動速度による歩幅の大小が2種 ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 3/8 • 前歩き系 前 F_0 右 F_90 右後ろ F_135 左 F_-90 ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 4/8 • 後ろ歩き系 以上計7種 後ろ B_180 右 B_90 左 B_-90 ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 5/8 • ブレンドスペースは最初、前歩きと後ろ歩きの2種類を切り替える形式で 実装した ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 6/8 • これでも概ね問題は無かったが、スティックを斜めにガチャガチャと動かした ときに腰に不要な回転が発生した 矢印の方向にレバガチャすると 一瞬腰が正面を向いてしまう… ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 7/8 • これを改善するため「Xの形」にブレンドスペースを分け、 <Target Weight Interpolation Speed Per Sec>を調整した ( 実は、複雑な検証も無く思いつきでXの形にして み た ら 案 外 上 手 く い っ た だ け、 だ っ た り し ま す … ) ©2019 YUKE'S ©2019 D3 PUBLISHER
移動関連のアセットの作成と組み込み 8/8 • これにより、ブレンド切り替え時の腰の動きを改善できた ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 1/7 • <ボーン毎のレイヤードブレンド>を使用し、上半身に別のアニメーションを 流す方法 • 今回のゲームでは武器の構えが8種類あるため基本の移動アニメーションの 作成コスト削減において特に効果があった ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 2/7 • <Blend Poses 0>に背骨から上の 階層のアニメーションが流れる様に 設定した • 上半身と下半身のアニメーションは、 <Sync Group>で同期させた ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 3/7 • 上半身ブレンドによる移動アニメーションの作成コスト削減の 具体例は次の通り 移動アニメーションで必要なデータを全て作成した場合 性別:2 PAギア:4 武器の種類:8 歩き/走り:2 歩幅:2 方向:7 2×4×8×2×2×7 = 1792 ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 4/7 • コスト削減のためと割り切って、歩幅が変わっても上半身の アニメーションを共通にしてしまうと <基本(アサルトライフル)> 性別:2 PAギア:4 武器の種類:1 歩き/走り:2 歩幅:2 方向:7 2×4×1×2×2×7 = 224 ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 5/7 <武器バリエーション> 性別:2 PAギア:4 武器の種類:7 歩き/走り:2 歩幅: 1 方向:7 2×4×7×2×1×7=784 <基本>+<武器バリエーション> 224+784 = 1008 ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 6/7 • 1792 から 1008 へと 784 のアセット削減が可能になった • 更に、ヘビーストライカーは重武装なので動きに差が出にくい、ということで アニメーションを男女共通にし、最終的に実装した移動に関するアセット数は 882となった ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドの利用と組み込み 7/7 • 今回は歩幅のバリエーションの省略しか行っていないが 、アセットは 掛け算式に増えてしまうので、どこか1箇所の数字が半分になるだけでも 作成コストを大きく減らすことができた • また、後に足のアニメーションを微調整する際も武器のバリエーションの データは修正の必要がなく、調整コストも下げることができた ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドとブレンドスペースの相性 1/3 • 後に武器の切り替えとブレンド スペースの相性が悪いことが 解った 武器切り替えを行うと、切り替え 以前の値が残っており、 アニメーションに不要な補間が 入ってしまっていた ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドとブレンドスペースの相性 2/3 • これはブレンドスペース内で設定できる項目の1つ、 <Target Weight Interpolation Speed Per Sec>の値が小さい (補間がゆっくりになる)場合に発生する問題だと解った • そのため、値を0にしてブレンドスペース内では補間せず、予め補間した値を 取得する方法を提案した • しかしその場合、-180/180の点を跨ぐ際の補間計算が複雑になるとの 意見がプログラマーから寄せられた ©2019 YUKE'S ©2019 D3 PUBLISHER
上半身ブレンドとブレンドスペースの相性 3/3 • 結果、スティックのX軸とY軸の入力量でブレンドすることで対応した <Target Weight Interpolation Speed Per Sec> は0に設定 ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第1弾の結果 1/2 • ブレンドスペースを利用した移動関連の組み込みはこれで行けそうだと いう実感が持てた • 上半身ブレンドも思ったより簡単で、利用すべきという結論に至った ただ、上半身ブレンドとブレンドスペースの相性の問題が後々に顕在化した ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第1弾の結果 2/2 • ステートの繋ぎが複雑になってきてこのままではダメージの実装あたりで カオスになることが目に見えてきた • <TimeRemaining(ratio)>などでステート遷移させることは簡単だった しかし、クラスブループリントの入力によるステート遷移と、ABP側で 設定した結果のステート遷移両方がある結果、「今の遷移はどこで何が 起こって発生したのか」ということがわかりにくくなってしまうことを実感した ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第2弾 概要 1/4 • ステートの複雑化をなんとかする • ステートの遷移もより管理しやすくしておきたい • PAギアの制御を組み込む ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第2弾 概要 2/4 ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第2弾 概要 3/4 ステートマシン<Move>内 ステートマシン<Basic_Action>内 ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第2弾 概要 4/4 ©2019 YUKE'S ©2019 D3 PUBLISHER
ステート複雑化の回避 1/3 • Enumによるブレンドを利用し <基本の移動> <ジャンプなどのアクション> <PAギアごとのアクション> <ダメージ> という様にカテゴリを分けて ステートマシンを作成した ©2019 YUKE'S ©2019 D3 PUBLISHER
ステート複雑化の回避 2/3 • 各ステートマシンの中身は右の様 になっている まず<Entry>ステートを作成、 そこから枝分かれするように接続 している 本来のEntryからの複数のトランジ ション作成、コンジットへの接続が できないため、この形になった ©2019 YUKE'S ©2019 D3 PUBLISHER
ステート複雑化の回避 3/3 • あれ、なら全部Entryから枝分かれさせればいいのでは?? と思ったが、結果繋がりの わからないぐちゃぐちゃな ステート構成になる予感 がしたのでやめた ©2019 YUKE'S ©2019 D3 PUBLISHER
ステート遷移の管理 1/2 • ステートマシンの遷移もEnumを利用して行うようにした • クラスブループリント側(プロト期間終了後はC++側)で プレイヤーの状態を制御し、ABPはその結果を受け取るのみにして 遷移を管理した ©2019 YUKE'S ©2019 D3 PUBLISHER
ステート遷移の管理 2/2 • この方法だと、アニメーターがABPの遷移条件を作成する際、 Enum == [目的の状態] と文字を読みながら設定するだけになり、 作成が簡単になるというメリットもあった • ※ただ仮実装時はABP側で状態遷移させることもあった ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの機構の制御 1/5 • PAギア(トルーパー)の機構を動かしたい ただ、モーションビルダーでベイクした 動きをインポートすると、今後デザイン 変更があった場合に全てベイクと出力 をやり直しになってしまうので面倒… ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの機構の制御 2/5 • UE4にモーションビルダーのコンスト レイントの様な <スケルタル制御> というノードがあったので試してみた ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの機構の制御 3/5 • PAギアの構造は複雑だったが、 <ボーン駆動型コントローラー> <回転率を適用> <注視点> <FARBIK> の4種類で概ね実現できた ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの機構の制御 4/5 • ボーン駆動型コントローラー >肩パーツの回転 • 回転率を適用 >肩パーツの回転 • 注視点 >背面のシリンダー • FARBIK >チューブ ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの機構の制御 5/5 • ちなみに、 <Get Socket Transform> でボーンの動きの値を取得し、 それを色々計算した上で<ボーンをトランスフォーム(修正)する>ノードに 流し込むという方法もある (個人的には、今作成するならこちらを選びます) ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第2弾の結果 1/2 • 名称で選択できるEnumによるブレンドはアニメーターにもとっつきやすく、 ステートマシンとステートの複雑化の解消に効果があった • クラスブループリント/C++側で状態を制御し、ABPは情報の受け取りのみと したことで、ABPのトランジションの設定が簡単になり、他のスタッフへの 作業依頼も簡単になった ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第2弾の結果 2/2 • スケルタル制御はアニメーターでもなんとかなる • この第2弾で、ABPの構成の方向性が決定した ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第3弾 概要 1/3 • 基本は第2弾の組み方のまま、整理しつつ機能を追加 • 反動や上下左右を向くための加算アニメーションの整理 • ベイクで制御するPAギア側のアニメーションの組み込みと、UE4の スケルタルコントロールで動かす部分の整理 ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第3弾(=最終形) 概要 2/3 続く ©2019 YUKE'S ©2019 D3 PUBLISHER
ABP第3弾(=最終形) 概要 3/3 続き ©2019 YUKE'S ©2019 D3 PUBLISHER
上下左右への体の向き変更 • セオリーどおりエイムオフセットを使用している ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの動きの組み込みの整理 1/2 • アニメーションをベイクして動 かす部分 (例:空中飛行時のジェットリ フターのウィングの動き)は、 ボーン毎のレイヤードブレンド を利用して、体の動きと切り 分けて実装した ©2019 YUKE'S ©2019 D3 PUBLISHER
PAギアの動きの組み込みの整理 2/2 • スケルタルコントロールの部分に ついては、 <Sub Anim Instance>を 使用してABPを分割して整理 した ©2019 YUKE'S ©2019 D3 PUBLISHER
Sub Anim Instance 補足 • <Sub Anim Instance>を使用することで、複雑なABPの一部を切り離し、 必要に応じて呼び出すことができるようになる • また、移動、アクション等をサブのABPとして分割しておけば、複数のスタッフが 同時に編集することができるようにもなる ©2019 YUKE'S ©2019 D3 PUBLISHER
敵のタイプに応じた ABPの構築について ©2019 YUKE'S ©2019 D3 PUBLISHER
敵のABPの作成 1/2 • プレイヤーのABP作成、拡張と平行して敵のABPも作成した • 小型の敵に関しては、ノウハウ蓄積の意味も込めてあえてプレイヤーとは違う <入れ子構造>でステートマシンを組んでみた ©2019 YUKE'S ©2019 D3 PUBLISHER
敵のABPの作成 2/2 • ステートマシンの中にステート マシンを作成していく構成 通常時▼地上▼移動▼歩き という様な階層構造にしてみ た ©2019 YUKE'S ©2019 D3 PUBLISHER
敵のABPの結果 • PCのフォルダ整理のような感覚で構築できる • 最終的に階層が深くなりすぎてどこに何があるのかがわかりにくくなる 階層が深くなりすぎたものは1番上に引っ張り 出して、キャッシュして組み込むことに… ©2019 YUKE'S ©2019 D3 PUBLISHER
キャッシュ補足 1/2 • アニメーションの情報をキャッシュして使いまわせる機能 Saveで検索してキャッシュを作成 Useで検索してキャッシュを使用 ©2019 YUKE'S ©2019 D3 PUBLISHER
キャッシュ補足 2/2 • これを利用して、1番上の階層にステートを作成し、深い階層の部分には キャッシュしたポーズを使用することで、編集時のアクセスの手間を軽減した キャッシュを使っているステートの階層が深くても、編集すべき ステートマシンが階層の1番上にあるとアクセスが楽 ©2019 YUKE'S ©2019 D3 PUBLISHER
ルートモーションが絡む攻撃 1/3 • 当時はアニメーションモンタージュ のノウハウが不足しており、何と かして他のアニメーションアセット と同様にステートマシンに組み込 む形で実装しようとした ©2019 YUKE'S ©2019 D3 PUBLISHER
ルートモーションが絡む攻撃 2/3 • モーションビルダーで移動値 のグラフを作成、それをアニ メーションカーブとしてイン ポートし、その値を基に移動 させた ©2019 YUKE'S ©2019 D3 PUBLISHER
ルートモーションが絡む攻撃 3/3 • 今回の用途では問題なく実装できた • ただし、「カーブの名前が同じ場合、値が必ずブレンドされる」 点に注意 この名前が同じ場合、アニメーションの ブレンド率に合わせてカーブの値もブレ ンドされてしまう ©2019 YUKE'S ©2019 D3 PUBLISHER
超大型の敵のABPの作成 1/2 • 超大型の敵の場合は移動時の 足の滑りが問題になるため、 アニメーションモンタージュを 使用してルートモーションで 移動を制御する必要があった ©2019 YUKE'S ©2019 D3 PUBLISHER
超大型の敵のABPの作成 2/2 • C++側で再生するモンタージュを選択してくれるため、ABPはスロットを 置いておくだけのシンプルなものになる ©2019 YUKE'S ©2019 D3 PUBLISHER
モンタージュ制御での問題点 1/3 • モンタージュ同士をブレンドスペースの様にブレンドしたい 例えば、移動距離が違う複数のアニメーションをブレンドして、様々な距離 に対応できるようなデータにしたい状況があった ©2019 YUKE'S ©2019 D3 PUBLISHER
モンタージュ制御での問題点 2/3 • スロットを複数作りそれらをアルファ値によってブレンドすれば一応可能である ことが解ったが、ブレンド対象が増えた場合、処理が複雑になるということで この方法は使用しなかった ©2019 YUKE'S ©2019 D3 PUBLISHER
モンタージュ制御での問題点 3/3 • セクション移行時にポーズの補間をしたい セクションが移行したときにポーズに補間がかからず、補間を設定する方法 がわからなかった ©2019 YUKE'S ©2019 D3 PUBLISHER
最後に ©2019 YUKE'S ©2019 D3 PUBLISHER
反省点 • 後々付け足しで複雑になってしまうことは避けたいしかし最初から 全ての仕様が決まっているわけでもないので難しい… • Sub Anim Instanceを利用することでABPを整理でき、 また多人数での同時作業もできそうなのでもっと利用したい • アニメーションモンタージュをもっと有効利用できていれば、 ステートマシンはさらにシンプルにできたかもしれない ©2019 YUKE'S ©2019 D3 PUBLISHER
UE4・ABPの感想 • プログラム経験なしのアニメーターでもとっつきやすい (論理演算や変数の型だけでも知っていると更に良さそう) • アニメーターが(仮の)組み込みを行ってみたことで、アニメーション作成時 にも組み込みの工程をより意識して作業を進めることができるようになった • 自分で作って組み込んだデータがすぐ画面で動くので単純に楽しかった ©2019 YUKE'S ©2019 D3 PUBLISHER
2019/09/20 質疑応答録(順不同)1/2 Q: エンジン改造は行っていたか A: ABPに関しては一切行っていない Q: 敵のABPの共通化はどのように行ったのか? A: ある程度出来てからコピー&ペーストをした ©2019 YUKE'S ©2019 D3 PUBLISHER
2019/09/20 質疑応答録(順不同)2/2 Q: 足のIKで、例えば足の付け根など破綻しやすい箇所はどう対応したのか? A: 破綻しやすいのは主に走っているときで、かつ走っているときはIK補正を行わ なくても気にならないレベルだったため、IKはアイドリング中のみ有効にした Q: ブレンドスペースをXで作ったというところを補足して欲しい A: 問題になるのは角度が0度の地点を通ってブレンドスペースが切り替わるとき なので、0度のアニメーションが再生されないように工夫した結果Xになった ©2019 YUKE'S ©2019 D3 PUBLISHER
ご清聴ありがとうございました! ©2019 YUKE'S ©2019 D3 PUBLISHER