97.6K Views
February 26, 18
スライド概要
訂正:67, 69ページ目 MasterPostComponentを使う場合、厳密にはコピー元・先のスケルトンが同一でなくても、「ボーン名が同じ」ならTransformがコピーされます。つまり、headボーンを持つ体用スケルトンのアニメーション結果を、headボーンだけを持つ頭のみメッシュ・スケルトンに適用することが可能です。(エンジニア向け USkinnedMeshComponent::UpdateMasterBoneMap()をご確認ください)
訂正:68ページ目「コピー後の追加制御が不可能」→ 「コピー後の追加制御が可能」
2018年2月26日に行われた「Unreal Engine Meetup Nagoya #6 in 名古屋城」で登壇した際に使用した資料です。
https://www.meetup.com/ja-JP/UnrealNagoya/events/245020665/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
猫でも分かる UE4のAnimation Blueprintの運用について - Unreal Engine Meetup Nagoya #6 in 名古屋城 Epic Games Japan 岡田和也 #ue4studynagoya
※ 以降のスライドでは Animation Blueprint を Anim BPと省略します 文字数多いので… #ue4nagoya
自己紹介 Epic Games Japan サポートエンジニア 岡田和也 ( おかず @pafuhana1213 ) #ue4nagoya
本日のお品書き • Anim BPって? • Anim BPの運用でよく問題になること • アニメーションとロジックの共有について • Anim BPの肥大化の回避について #ue4nagoya
Anim BPって? #ue4nagoya
Anim BPとは Skeletal Meshのアニメーションを 制御するための特殊なBlueprint • Event Graph, AnimGraphの2要素で構成 特定の Skeleton に紐づく • Skeletal Mesh ジャナイヨ! #ue4nagoya
Event Graph Anim Graphで使用するパラメータを管理・制御 • 通常のBPと同じインターフェイス #ue4nagoya
Anim Graph 現在フレームにおけるSkeletalMeshの 最終ポーズを評価 • • • • • • Animation Sequence State Machine Blend Skeletal Control IK などなど… ( C++でノードの自作も可能! ) #ue4nagoya
BPとの連携例 Aボタンを押したよ! #ue4nagoya 入力に応じたモーション再生 Aボタンはジャンプだから Jumpノードを呼び出すよ! 地面から離れたから ジャンプ開始モーションを 再生するよ! ヒャッフー!
ThirdPersonテンプレートのAnimBP #ue4nagoya
BPとの連携例 #ue4nagoya IKによる足の位置調整
Animation BPを活用することで 状況に応じた 様々な表現・挙動を実現可能! #ue4nagoya
しかし、運用方法に注意しないと 後々大変なことに… #ue4nagoya
本日のお品書き • Anim BPって? • Anim BPの運用でよく問題になること • アニメーションとロジックの共有について • Anim BPの肥大化の回避について #ue4nagoya
運用失敗した際のワーストケース ① #ue4nagoya
膨大な数のAnimBP (とアニメーションアセット ) リソースの共有が全くできていないケース • AnimBPなどのアニメーション系アセットが キャラクタ毎に専用のものが存在 #ue4nagoya
リソースの共有ができていない場合… リソースやロジックの 追加・変更・確認 コストが膨大に • もしキャラクタの数が100体だったら…? ゲーム実行中も様々な箇所に悪影響 • メモリ使用量、ロード時間など • 中身は全く同じなのに別物として管理されてしまう #ue4nagoya
この問題に陥りやすいフローの例 異なるスケルトンに対しての アニメーションリターゲットを使用しているケース 変 換 用 リ グ #ue4nagoya
異なるスケルトンに対しての アニメーションリターゲット の問題点 アニメーション系アセットの 流用 はできますが、 共有 はできない • その時点でのAnimBPで実装した ロジック、各モーションはコピーできる • しかし別々のアセットになるので、 以降の作業では、先述の問題が発生!!! #ue4nagoya
便利な機能ですが、 用法・容量を守って 正しくお使い下さい! #ue4nagoya
運用失敗した際のワーストケース ② #ue4nagoya
スパゲッティ化したステートマシン #ue4nagoya
#ue4nagoya
スパゲッティステートマシンのデメリット 各作業がつらすぎる #ue4nagoya
Anim BPを運用する上での注意点 • アニメーション系アセットの共有度合い • Anim BPの複雑度 #ue4nagoya
Anim BPを運用する上での注意点 • アニメーション系アセットの共有度合い • Anim BPの複雑度 • キャラクタ数に応じて事故率が向上! • 変更・追加に弱いシステムに! #ue4nagoya 最終クオリティに 大きく影響する…!
これらの問題を回避するために • UE4におけるアニメーションの共有方法を理解した上で 各ロジック・リソースを作成する • Anim BPに関する各機能を活用し 複雑度合いが低く、変更に強いAnim BPの実装を意識する #ue4nagoya
検証・設計のFixは 必ず量産前までに! #ue4nagoya
本日のお品書き • Anim BPって? • Anim BPの運用でよく問題になること • アニメーションとロジックの共有について • Anim BPの肥大化の回避について #ue4nagoya
アニメーション・Anim BP共有のメリット 汎用的なモーション・ロジックを使いまわすことが可能 • 例:モブキャラの待機・歩き・走りモーション • 例:Anim BPのState Machine 追加・変更コストの削減 • 作業内容が共有先にも行き渡る #ue4nagoya
アニメーション・Anim BPを共有するには? 共有元・先の Skeletal Mesh が 同じ Skeleton を持つ必要がある 同じSkeletonを持たせるためには? • 流用元・先のSkeletal Mesh ( の元リソース ) が持つボーン階層が Skeleton共有可能条件を満たす必要がある #ue4nagoya
・・・? #ue4nagoya
Skeletal Mesh が持つ ボーン階層 #ue4nagoya Skeleton アセット Skeletal Mesh アセット
FBXインポート時の挙動 紐付け #ue4nagoya
Skeletonアセットとボーン階層 Q.「Skeletal Mesh が持つボーン階層」と Skeletonアセットは同一のもの? A. NO! #ue4nagoya ≠
Skeletonアセットとボーン階層 Skeletonアセットは 複数 の 類似 ボーン階層を保持するリスト #ue4nagoya
FBXインポート時に既存Skeletonを指定すると Skeletonの類似ボーン階層リスト に 「FBXのボーン階層と同じものが含まれるか? 」または 「リストに追加できるか?」のチェックが走る #ue4nagoya
FBXインポート時のチェックを通過すると インポートによる追加されたSkeletal Meshが 既存Skeletonに関連付けされる • 既存Skeleton に関連付けられたアニメーションを使用可能に! #ue4nagoya
1ページ前に戻る Skeletonの類似ボーン階層リスト に 「FBXのボーン階層と同じものが含まれるか? 」または 「リストに追加できるか?」のチェックが走る 後述の共有可能パターンを 満たす必要がある! #ue4nagoya
7 5 4 6 1 2 0 3 このSkeletonに 新たなボーン階層を追加するケースを想定 #ue4nagoya
共有可能パターン① ボーン階層が完全に一致 • 階層構造・各ボーンの名前が一致。位置は無関係 5 7 7 4 4 6 5 1 2 0 #ue4nagoya 7 6 1 3 2 0 4 5 6 1 2 3 7 0 5 A 6 1 3 2 0 3
イメージ 体型が異なっていても、ボーン階層が同じなら共有可能 #ue4nagoya
共有可能パターン② ボーン階層が、共有元のボーン階層 + α • ただし、ボーン間への追加はNG 7 5 4 8 6 5 1 2 0 #ue4nagoya 7 7 4 4 8 1 3 2 0 5 6 1 9 3 6 2 0 3
イメージ アタッチメントの追加 #ue4nagoya 身体構造の拡張
共有可能パターン③ • ボーン階層が、共有元のボーン階層 - α • ただし、間にあるボーンの削除はNG 5 7 7 7 4 4 4 6 1 2 0 #ue4nagoya 5 5 6 1 3 0 3 2 0 3
イメージ 不要なボーンの削除 #ue4nagoya
共有 OK / NG の基準 比較する2つのボーン階層の内のどちらかが 相手側のボーン階層と同一のものを持っているか否か 7 5 4 8 6 5 1 2 0 7 4 6 1 3 #ue4nagoya 2 0 9 3
共有 OK / NG の基準 比較する2つのボーン階層の内のどちらかが 相手側のボーン階層と同一のものを持っているか否か 8 5 7 4 6 1 2 0 9 3 #ue4nagoya
共有 OK / NG の基準 比較する2つのボーン階層の内のどちらかが 相手側のボーン階層と同一のものを持っているか否か 8 5 7 7 4 4 1 2 0 5 6 1 9 3 #ue4nagoya 6 2 0 3 説明のためボーンの位置を同じにしていますが 位置は一致していなくても問題ありません あくまで、階層構造の比較です
ルールを満たさなかった場合 エラーメッセージが表示され Skeletonの再生成を促される #ue4nagoya
これらの挙動・ルールを理解した上で エンジニアとアーティストさんが ボーン階層のルールを相談すること! #ue4nagoya
Skeletonの共有後の管理・調整について 時間がないので… UNREAL FEST EAST 2017における バイキングさんの講演内容をご確認ください! 「バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~」 SlideShare #ue4nagoya YouTube
バイキングさんの講演で 触れてなかった部分について #ue4nagoya
ツリーに表示するボーンのフィルタリング Skeletonが管理するボーン階層の数が増えると ツリーに表示されるボーン数が膨大に… #ue4nagoya
ツリーに表示するボーンのフィルタリング Show Mesh Bones 設定を活用! 作業対象のSkeletal Meshが持つ ボーン階層と一致するボーンだけ ツリーに表示するように! #ue4nagoya
どこまで1つのSkeletonに含めるか? 2足、4足、多脚など、用途・挙動が異なるボーン階層を 1つのSkeletonで管理すべきなのか? • 全部入りSkeletonにすべきか否か? #ue4nagoya
全部入りSkeletonのメリット / デメリット メリット • Anim BPで実装したロジックを共有可能 デメリット • アニメーションを流用可能だが、対象が限定される • 2足歩行アニメーションをクモのような多脚キャラで使う? • リターゲットの調整コストや ボーン階層変更時の対応コストの問題 • 詳細はバイキングさんの講演にて #ue4nagoya
カテゴリ毎にSkeletonを用意する手 用途・挙動に応じたカテゴリを決定し、 カテゴリ毎にSkeletonを用意 • 2足用Skeleton, 4足用Skeleton, … #ue4nagoya
カテゴリ別Skeletonのメリット / デメリット メリット • カテゴリ内なら、アニメーション・ロジックの共有が可能 • 全部入りSkeletonのデメリットを削減 デメリット • カテゴリ間でロジックの共有ができない • 場合によっては、ほぼ同じロジックをカテゴリの数だけ実装することに ( Skeletonに依存しない自作AnimGraph・ノードをC++で作るという手も…) #ue4nagoya
プロジェクトの仕様によって 最適解は変わってきます! 十分に検討・検証した上で どういう形で進めるか決めましょう! #ue4nagoya
アニメーションの共有関係で 少し余談 #ue4nagoya
Master Pose vs Copy Pose From Mesh #ue4nagoya
Master Pose / Copy Pose From Mesh 指定のSkeletal Mesh Component から ポーズをコピー可能 • Anim BPによる処理結果を流用可能 #ue4nagoya
ユースケース:カスタマイズ可能なキャラ カスタマイズ可能な箇所毎にSkeletal Mesh Componentを用意 • Skeletal Meshの部分的な差し替えが可能に #ue4nagoya
モーションのコピーが必要な理由 各Skeletal Mesh Componentのアニメーション結果を 一致させる必要がある • 全く同じ内容のアニメーション更新処理を Componentの数だけ実行するのは無駄 ×3 #ue4nagoya
モーションのコピーが必要な理由 全く同じ結果になるのなら 1つのアニメーション更新処理結果を コピーした方が無駄な処理を省ける! コピー #ue4nagoya
Master Poseのメリット / デメリット メリット • 現状最も負荷が低い • ポーズコピー用のAnim BPが不要 デメリット • コピー後の追加制御が不可能 • NG:一部だけコピー元から変えたい コピー後に物理適用したい • コピー元のボーン階層と一致しない部分は コピーが行われず破綻する #ue4nagoya
Copy Pose From Meshのメリット / デメリット メリット • コピー後の追加制御が不可能 • 制限:コピー元が物理を使っている場合、コピー先では物理が使えない • 別Skeletonであってもコピーが可能 • コピー元のボーン階層と一致しない部分には リファレンスポーズが適用 ( Master Poseと比べると、破綻はしづらい) デメリット • Master Poseに比べると負荷が高い • ポーズコピー用のAnim BPが必要 #ue4nagoya
Master PoseとCopy Poseの使い分け Master Poseのデメリットが問題にならない場合は Master Poseの利用を強く推奨 • 「コピー後の追加制御が不要」 かつ 「同じSkeletonを使用」 問題はそれ以外のケースでどうするか? #ue4nagoya
Copy Poseを使うか使わないか ベースとなるSkeletal Mesh Componentの Anim BPにおける処理結果が必要なのかどうか? • 不要なら、別Skeletal MeshをベースにAttachする手も 例: ベースのジャンプ力に応じて 羽の動きを変えたい #ue4nagoya
Copy Poseを使うか使わないか リリース後もコンテンツを追加する運営型の場合は、 今後を見据えてCopy Poseを採用するという可能性も • 処理のオーバーヘッドよりも、 追加コンテンツの幅を優先する形 • リリース後の共有Skeletonの変更は 対応コストが心配 #ue4nagoya
微妙に長かった余談、おわり #ue4nagoya
ここまでのまとめ アニメーション・Anim BPによるロジックを 共有・流用できるようになりました! • Skeletonの共有, Master Pose, Copy Pose From Mesh • 同内容のアニメーションアセットの乱立・管理を回避 #ue4nagoya
共有することで発生する問題 1つのAnim BPが複数のSkeletal Meshで使用されるため、 設計に注意しないと、簡単に肥大化してしまう… • キャラクタ毎の特殊対応 • ロジックの汎用化への対応 #ue4nagoya
本日のお品書き • Anim BPって? • Anim BPの運用でよく問題になること • アニメーションとロジックの共有について • Anim BPの肥大化の回避について #ue4nagoya
肥大化を回避する上での課題 • スパゲッティ State Machineの回避 • 汎用性はある程度維持しつつ、 キャラクタ毎の特殊対応を実現 #ue4nagoya
スパゲッティ State Machineを回避するには 1つのState Machineで 全てをカバーしようとしない! #ue4nagoya
回避するために検討すべき手法 • Slot機能の利用 • アニメーション系アセットピンの公開・変数化 • State Machineの分割 • Anim BPの分割 #ue4nagoya
Slot機能の利用 #ue4nagoya
イベントタイプのモーションの場合 攻撃・ダメージ・死亡などのモーションを State Machineで管理するのはとても大変… • どんな状態からでも遷移可能、という仕様の場合が多い #ue4nagoya
Stateの数が増えれば増えるほど 追加・管理コストが大変なことに… #ue4nagoya
AnimGraphのSlotノードを使おう! • 普段はSourceに接続された内容をそのまま出力 • Slot付きのアニメーションが呼ばれた場合は そのアニメーションを出力 • Sourceの内容は無視 #ue4nagoya
Slot付きのアニメーションの呼び方 • Animation Montage • Play Slot Animation (as Dynamic Montage) • シーケンサのAnimationトラック • 右クリックメニューから設定 #ue4nagoya
レイヤーアニメーションのチュートリアル 体の一部にのみ、Slot付きアニメーションを適用・ブレンド #ue4nagoya
アニメーション系アセットピンの 公開・変数化 #ue4nagoya
AnimGraphの一部ノードは アニメーションアセットの指定を公開可能 #ue4nagoya
どういう時に便利なの? State Machineによる遷移条件はそのままで 再生されるアニメーションだけ変えたい時 • この方法を知らないと、全く同じ内容のState Machineが増えてしまう 同じwalkステートでも 状態によって内容を変更 #ue4nagoya
State Machineの分割 #ue4nagoya
1つのState Machine内で組むべきなのか? とあるState Machineの例 立っている状態と しゃがんでいる状態が混在 • 今後拡張していく際 作業コストが膨れ上がらないか? #ue4nagoya
大きなカテゴリで分割するという手 State Machineを分割することで 管理コストや挙動変更時の作業コストを削減 • 別State Machineへの移行時は Blend ノード や Slot付きアニメーションを再生 #ue4nagoya
Anim BPの分割 #ue4nagoya
Sub Anim Instance 別のAnim BPにおけるAnimGraph, EventGraphの処理を実行 • 同じSkeletonを使用しているという条件あり #ue4nagoya
Sub Anim Instanceのメリット • 実装したものを再利用可能に • コンポーネント的な管理が可能に • 別アセットになるので、同時並行作業が可能に #ue4nagoya
スケルトンの共有を使っている場合は Sub Anim Instanceのメリットは とても効果的に働きます! 積極的に使っていきましょう! #ue4nagoya
肥大化を回避する上での課題 • スパゲッティ State Machineの回避 • 汎用性はある程度維持しつつ、 キャラクタ毎の特殊対応を実現 #ue4nagoya
よくあるユースケース • Anim BPで実装した内容を流用しつつ、 再生するアニメーションを変えたい ・ 処理を追加したい • 流用元Anim BPの変更は自動的に反映されて欲しい • ほぼ同内容のAnim BPが 完全別アセットとして増えるのを防止したい #ue4nagoya
AnimMontage + Slotによる差別化 キャラクタ毎に実行するSlot付きアニメーションを 変えることで、Anim BPに手を加えずにキャラ間の差を出す方法 #ue4nagoya
Anim BPのオーバーライド • Anim Graphで指定したアニメーションを別アセットに変更可能 • Event Graphへの処理追加が可能 ・ ・ ・ #ue4nagoya
#ue4nagoya
Anim BPのオーバーライドの注意点 アニメーションアセットを変数化した場合は オーバーライド候補に挙がりません • Class Defaultから変数の初期値を変えましょう! #ue4nagoya
Post Process Anim BP Skeletal Mesh Componentに設定した Anim BP( AnimInstance ) の処理が完了した後に呼ばれるAnim BP #ue4nagoya
Post Process Anim BPの用途 基本的な挙動は汎用的なAnim BPで制御しつつ キャラ毎に異なる調整が必要になる処理を行う • IK, 物理, ボーンの直接的な制御 #ue4nagoya
4.19 ニュース! • Post Process Anim BPを使用するか否かを • Skeletal Mesh Component単位で出来るようになります! #ue4nagoya
本日のまとめ Anim BP ・アニメーション系アセットの運用に 注意しないと、様々な問題が発生します • リソースの管理コストの増加 • 各実装の追加・変更コストの増加 #ue4nagoya
本日のまとめ • Skeletonを共有することで アニメーション・ロジックの共有が可能に • Skeletonを共有するためには 幾つかの条件を満たす必要がある #ue4nagoya
本日のまとめ • 様々な機能・テクニックを使うことで Anim BPの肥大化を回避することが可能 • プロジェクトの規模・仕様・ワークフローによって 最適解は変わるので、量産前に必ず検証を! #ue4nagoya
Paragonにおける アニメーション管理・制御の講演 • Bringing a Hero from Paragon to Life with UE4 • https://archives.nucl.ai/recording/bringing-a-hero-from-paragon-to-life-withue4/ #ue4nagoya
ご清聴 ありがとうございました! 本講演に関する質問はこちらからどうぞ! E-mail : [email protected] Twitter : @pafuhana1213 #ue4nagoya