25.4K Views
April 14, 25
スライド概要
2025年3月28日に開催されたGame Creator Conferenceでの講演資料となります。
4000人のアーティストが参加したアートジャムプロジェクトの成果であるProjectTitanサンプルを参考にオープンワールド制作のワークフローやMoverの設計を学びます。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Project Titanから学ぶ オープンワールドワークフローと 次世代移動コンポーネント「Mover」の設計 Senior Software Engineer, Developer Relations Takashi Suzuki 2025 Epic Games Japan
Global Game Jam JAPAN https://ggj.igda.jp/
登録者 4,129
登録者 4,129 アクティブユーザー 594
登録者 4,129 チェンジリスト 18,839 アクティブユーザー 594
登録者 4,129 チェンジリスト 18,839 アクティブユーザー 594 ファイル数 229,44 4
Project Titan サンプル ゲームが公開されました! https://www.unrealengine.com/ja/news/the-project-titan-sample -game-is-now-available-explore-this-huge-open-world
プロジェクト概要 本日の流れ Titanから得られる 知見と見どころ Moverの設計
プロジェクト概要 本日の流れ Titanから得られる 知見と見どころ Moverの設計
Project Titan 概要 ● 10週間のオープンアートジャムプロジェクト ● 8km x 8km ● 9つのバイオームを持つランドスケープ ● カスタマイズ可能な標準マテリアル ● モバイルからハイエンドまでをターゲット ● 様々なドキュメントやチュートリアル ● 追加のツール ● ソースコントロールとCI環境 ● Discordによるオープンディスカッション ● 弊社スタッフによる毎週の批評
ありのままの状態 で公開 学習リソースとしては 不適切な部分があることを ご承知ください!
ありのままの状態 で公開 ! 学習リソースとしては 不適切な部分があることを ご承知ください
Project Titan チュートリアルビデオ ● ミニ(?)チュートリアル ○ 基本的なアセットの作り方 ○ ベースマテリアルの使い方 ○ ランドスケープレイヤーマテリアル関数追加 ○ ブロックアウト(ホワイトボクシング) ○ 環境の誇張表現 ○ PCGの利用 ○ 適切なコリジョンの生成 ○ ボリュームのあるフォリッジ ○ フォリッジのインタラクション ○ RVTの利用 ○ 最適化TIPS ○ 地域毎のレビュー動画 ○ などなど ProjectTitan Mini Tutorials https://dev.epicgames.com/community/learning/tutorials/yjLn/unrea l-engine-project-titan-mini-tutorials
Project Titan ガイドライン ● 小さく始める ● 既存のアセットや資料を活用する ● アセットの再利用性を考慮する ○ タイルやトリムシート をできるだけ利用する ○ プロジェクト内でコピーを作らない ● 協調作業を受け入れる ○ 周りのアーティストとコミュニケーションを取る ○ 他者の作成したアセットの加工は推奨される ○ 既に存在するアセットに手を加える場合 連絡をとり24時間返答が無かったら許可と判断 ● バックアップをとること ● 単独のアセットをワールドに直接配置しない ○ レベルに直接建物を立てずにプレハブ を作る ● 作業を完了してから次のエリアに移動すること
Project Titan サーバー群 ● ● ● ● クラウド上のP4サーバーとP4プロキシ HLODの自動ビルド 起動高速化用のクラウドDDC ○ トータルコストの90%ほどを占める トータルコストは $22,159
Project Titan テクスチャ ● ● ● ● 2のべき乗であること ○ 64,128,256,512,1024,2048,4096 ○ Max 4096 アルベド ○ α無し圧縮フォーマット ノーマル ○ α無し圧縮フォーマット サーフェス(リニア) ○ チャンネル毎にパック ■ R - ラフネス/マスク ■ G - メタル/マスク ■ B - AO/マスク ■ A - 高さ ○ sRGBを外す
Project Titan アセットの配置 ● ● ● ● ● ● ベースアセット ○ /Environment/_Core/*** 汎用的に使われるもの ○ /Environment/_Global/*** 環境用 ○ バイオーム名の下に配置 ○ 例)砂漠エリア用テクスチャ /Environment/Desert/Textures キャラクター ○ /Character/*** 命名規則 ○ モバイルなどで利用するチャンク化の際に問題になるので ファイル名の重複は避けユニークな名前を付ける ファイルサイズ制限は無し ○ 参加アーティストの自由度を優先するため バリデーターは用意しなかった
Project Titan マテリアル ● 基本的に予め用意されたマテリアルから マテリアルインスタンスを使って作成する ○ \Environment\_Core\Materials\M_BaseMaterial など ○ カスタムマテリアル作成は要連絡 ● 一般的なマテリアルを概ねカバーできる ○ 一般的なAlbedo/Surface/Normalなどのテクスチャの有無 ○ VTやRVT、マスクなどにも対応 ● マテリアルレイヤー やマテリアル関数 の使い方の参考に
Project Titan Naniteマテリアル ● ランタイムでのディスプレースメントや マスクマテリアルは非常に高価 ○ スタティックディスプレイスメントマッピング ○ 十分に詳細なサーフェイスが作られれば マテリアルでの法線マップが不要になるケースも Unreal Engine 5.2 アップデート ~Rendering/PCG~【GTMF 2023】 https://www.docswell.com/s/EpicGamesJapan/KDE2Q6-UE5_GTMF23_Rende ring_PCG#p33
Project Titan 成果物 ● ● ● ● ● 200000を超えるファイル 80GBのアセット 12000のメッシュ 8000のテクスチャ 5400のマテリアルインスタンス
プロジェクト概要 本日の流れ Titanから得られる 知見と見どころ Moverの設計
Project Titan ワールドパーティション ● ワールドをセルと呼ばれる矩形で分割して制作する仕組み ○ CellSize : 25600 ○ LoadingRange : 25600 ○ 2D gird ● リージョン設定 ○ 1km四方で64分割 ● 自分の担当部分だけを小さくロードする ○ Titanでは2リージョンまでロードが おすすめされていた ○ エディタの素早い起動 &レスポンス
Project Titan HLOD ● 遠景を最適化されたメッシュで描画する ○ ワールドパーティションでロードされていない エリアが見えるのはこの機能の働き ● 提供されたCIで更新される ○ ローカルではビルドしない ○ CIによる更新までは差が生じる ● HLODタイプ : Approximated mesh (近似メッシュ) ● HLODビルドに時間がかかりすぎる/終わらない/クラッシュ ○ セル内の合計頂点数が多すぎて メモリを食いつぶしていないか確認 ○ 大量に配置している小物をHLODから除外する ○ フォールバックメッシュや 最大LODの精度を落とす
Project Titan ランドスケープ ● ランドスケープはアートジャム前に開発チームによって作成 されてアートジャム中はロック ● ユニークかつ広大なランドスケープを 少人数の開発チームで作成するのは困難 ○ プロシージャル と手作業の良いところを突きたい ● 専用プラグインを開発!
Project Titan ランドスケープデザイ ナー ● ハイトマップのスタンプを置くような形 で ランドスケープを編集するプラグイン ○ ブループリント のみで構成 ● 非破壊編集 ● レベルを8x8の矩形に分割し必要な部分だけを更新 ○ リアルタイム編集 ● 8k x 8kのテクスチャを生成 ● プラグインを別プロジェクトに取り出して使うことも可能
ランドスケープデザイナー 主要アセット ● ● /LandscapeDesigner/DemoMap ○ 表示されているのはランドスケープではなく WPOを使った仮表示 であることに注意 /Maps/IgnoredMaps/LandscapeDesign ○ Titan用マップの編集レベル ● SplatManager_VIS ブループリント ○ 主要機能が集約されている ■ スタンプを収集してレンダリングを行う ○ 8x8のグリッドに分割 ○ 「Save Weight Preview」 でウェイトマップを出力 ● LS_LandmassInterface ○ ランドスケープへの転送インターフェイス ● スタンプアクター BP_LSD_~ ○ BP_LSD_HeightStamp : 次ページで解説 ○ BP_LSD_MaskMaterial : ノイズなどを加算 ○ BP_LSD_SplinePath : スプラインに沿って加工 ○ BP_LSD_Weight : ウェイトマップ編集
ランドスケープデザイナー BP_LSD_HeightStamp ● ブレンドモード ○ Lerp : ハイトマップをαとしてブレンド ○ Overlay : ハイトマップを加算 ○ Min : 最小値 ■ マイナススケールのスタンプで盆地を作る ○ Max : 最大値 ● その他のプロパティ ○ /LandscapeDesigner/Material/M_Mixを参照 ● Tags配列の2番目を参照してプライオリティ 的な動作 描画順序
手順4 ランドスケープデザイナー ランドスケープ反映手順 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. LandscapeDesignerマップを開く LandmassBrushManagerアクターを削除する (恐らくセットアップが壊れているため) ランドスケープモードに入る LandmassBrushManagerを新規に配置する ランドスケープモードを抜ける SplatManagerVISアクターを選択する 詳細 > SetupManagerボタンを押す Landscape_LS_LandmassInterface_Cアクターを選択する 詳細 > BrushManagerプロパティを設定する 再び SplatManager_VISを選択する UpdateRenderTargetとUpdateLandscapeボタンを押す 手順9
Project Titan イージーインポスター ● スタティックメッシュ選択 > Scripted Action > Generate Simple Card Imposter ● StaticMeshのLODの末尾に 交差したクアッドのメッシュを追加 ○ 生成されたマテリアルを割り当てると利用可能に ○ /Game/Environment/Foliage/Materials/Impostors/ にマテリアルやテクスチャが出力される
Project Titan プレハブの利用 ● アセットを直接レベルに置くことは非推奨なので代わりに ○ レベルインスタンス ○ パックドレベルブループリント ○ モデリングツール ○ LevelToPCG ● グレーボクシング > レベルインスタンス化 > レベルを編集 というワークフロー ● Main World Only フラグ ○ パーシスタントレベルとして編集されている時だけ 有効化されるアクター ○ 編集用ライトなどに
Project Titan PCG (プロシージャルコンテンツジェネレーション) ● 様々なPCGの作例 ○ スプラインで囲ったエリアを埋めるような樹木 ○ スプラインで柵/石畳の道/該当等々 ● 非常に便利だが 簡単に許容される負荷を突破してしまうので注意
最適化TIPS スケルタルメッシュ ● スケルタルメッシュをワールドに配置するとアニメーション の負荷が定常的に発生してしまうことがある ● BP_NPCTempMarkerというWPセルとしてロードされた後非 同期でアクターを生成して管理する仕組みを後半に導入した が、残念ながら広まらず
最適化TIPS Nanite ● ローポリゴンワークフローに慣れてしまっていると非常に保 守的なアセットが出来てしまう可能性 ○ Naniteの精度はパッケージ時にコントロールできるの で恐れずにアセットを作成する ● 長すぎるポリゴンもあまり望ましいものではありませんが アーティファクトが出なければ致命的ではありません ○ Naniteビューモードなどをつかって要確認
最適化TIPS ユニークテクスチャ ● ● ● 同じような領域が多数あるが、UVが自動展開されていてユ ニークな専用テクスチャが貼れらたモデル 大きなテクスチャ解像度を必要としがち 再利用性が無くストリーミングプールを圧迫 ==>ワールドの構築に利用される一般的なアセットであれば 汎用性を考慮するべき ● ユニークで象徴的なアセット(ヒーローアセット)などにリソー スを割くのは問題ない
最適化TIPS トリムシート ● ● ● 一つのメッシュに必要なディテールを 計画的にテクスチャに割り当てて利用する リソース的に大きなメリット 再利用性がある Felyx's Guide to Trim Sheets https://www.artstation.com/blogs/jennifermcgarry/y d4Q/jenns-guide-to-trim-sheets2
最適化TIPS タイリングテクスチャ ● Quixel @ Fab https://www.fab.com/sellers/Quixel?listing_types=m aterial 素材の質感を持ったタイリングテクスチャ ○ マテリアルレイヤー ■ モジュラー式で複数の素材をブレンドできる マテリアル レイヤーの使用 @ 公式ドキュメント https://dev.epicgames.com/documentation/ja-jp/unre al-engine/using-material-layers-in-unreal-engine
最適化TIPS マテリアルセクション ● マテリアルセクション数はメッシュあたり3つ程度を上限に
最適化TIPS PCG ● 素早くメッシュを大量に配置できるが 簡単にパフォーマンスを悪化させる可能性 ○ HLODに含むかどうか ■ 含める場合はフォールバックが 適切な頂点数になってることを確認 ○ 影 ○ マテリアルのWorldPositionOffset ○ コリジョン ○ カリング距離
最適化TIPS VSM ● ● (バーチャルシャドウマップ) 樹木などを中心にWPOを使ったメッシュが大量にあり、 VSMの更新を頻繁に呼び出す ○ WorldPositionOffsetDisableDistanceを設定 ViewMode > VSM > Cached Pages で確認
最適化TIPS ソースコントロール利用上の注意 ● 恐らく選択的にアセットをサブミットしたことによる参照のリ ンク切れが多発した ○ サンプル公開に向けたクリーンナップ作業で エラー修正がとても大変だった ● 必ずコンテンツ全体をサブミットする ○ マップチェック ○ CIでのパッケージ作成時のログなどを通知
プロジェクト概要 本日の流れ Titanから得られる 知見と見どころ Moverの設計
An Introduction to the Mover Plugin https://www.youtube.com/watch?v=P4IKS5k47Wg
Character Movement Component (CMC) ● ACharacterを対象 Mover Plugin ● アクター制限無し 5.4 / 5.5 Experimental
Character Movement Component (CMC) ● ● ACharacterを対象 CapsuleComponent操作対象 Mover Plugin ● ● 5.4 / 5.5 Experimental アクター制限無し コンポーネント制限無し
Character Movement Component (CMC) ● ● ● ACharacterを対象 CapsuleComponent操作対象 モノシリックで拡張にはC++が必要 Mover Plugin ● ● ● 5.4 / 5.5 Experimental アクター制限無し コンポーネント制限無し モジュラー式で柔軟な拡張
Character Movement Component (CMC) ● ● ● ● ACharacterを対象 CapsuleComponent操作対象 モノシリックで拡張にはC++が必要 スイープによる移動 Mover Plugin ● ● ● ● 5.4 / 5.5 Experimental アクター制限無し コンポーネント制限無し モジュラー式で柔軟な拡張 物理ベースの移動 + スイープ移動
Character Movement Component (CMC) ● ● ● ● ● ACharacterを対象 CapsuleComponent操作対象 モノシリックで拡張にはC++が必要 スイープによる移動 組み込みのネットワーク同期 Mover Plugin ● ● ● ● ● 5.4 / 5.5 Experimental アクター制限無し コンポーネント制限無し モジュラー式で柔軟な拡張 物理ベースの移動 + スイープ移動 ロールバックネットワーキング対応
Character Movement Component (CMC) ● ● ● ● ● ● ACharacterを対象 CapsuleComponent操作対象 モノシリックで拡張にはC++が必要 スイープによる移動 組み込みのネットワーク同期 「枯れた」実装 Mover Plugin ● ● ● ● ● ● 5.4 / 5.5 Experimental アクター制限無し コンポーネント制限無し モジュラー式で柔軟な拡張 物理ベースの移動 + スイープ移動 ロールバックネットワーキング対応 CMCユーザーフレンドリー
Character Movement Component (CMC) ● ● ● ● ● ● ● ACharacterを対象 CapsuleComponent操作対象 モノシリックで拡張にはC++が必要 スイープによる移動 組み込みのネットワーク同期 「枯れた」実装 まだしばらくは現役 Mover Plugin ● ● ● ● ● ● ● 5.4 / 5.5 Experimental アクター制限無し コンポーネント制限無し モジュラー式で柔軟な拡張 物理ベースの移動 + スイープ移動 ロールバックネットワーキング対応 CMCユーザーフレンドリー 移行の初期段階
Mover MoverComponent 処理のながれ MovementMode Actor ProduceInput OnGenerateMove OnSimulationTick FMoverInputCmdContext FCharacterDefaultInputs FProposedMove FSyncState
Mover ProduceInput ● アクターにInputProducerインターフェイスを追加 ○ ブループリントでも実装可能 ● 入力やAIなどからのパラメータを取り出し コンテナに格納 ○ FCharacterDefaultInputs ○ 独自の入力データ ● 移動処理のタイミングで呼び出される ○ 処理タイミングはバックエンドクラス設定 によって変化 ○ ネットワークフィジックスバックエンドで はTickが時分割される可能性 ProduceInput UCLASS(abstract, notplaceable) class TITAN_API ATitanPawn : public APawn, public IAbilitySystemInterface, public IMoverInputProducerInterface, public ITitanRaftPilotInterface, public ITitanCameraOwnerInterface {
Mover MovementMode ● 実際の移動処理を定義 ○ C++またはブループリントで実装 ● CMCのモードと同じ考え ○ モジュラー形式で追加
Mover 標準 MovementMode ● 従来のCMCにあったモードのデフォルト実装は エンジンに組み込みで提供 されます ● さらに物理で動作するモードも標準で提供
Mover MovementMode の実装 /** * Base class for all movement modes, exposing simulation update methods for both C++ and blueprint extension */ UCLASS(Abstract, Blueprintable, BlueprintType, EditInlineNew) class MOVER_API UBaseMovementMode : public UObject { GENERATED_UCLASS_BODY() …(略) ● ● メンバ関数 ○ OnGenerateMove ■ 移動情報の生成 ○ OnSimulationTick ■ 実際に移動する ■ 同期用パラメータ アクション用パラメータ ○ 例えば移動速度などのパラメータは ムーブメントモードにあっても良い protected: virtual void OnGenerateMove(const FMoverTickStartData& StartState, const FMoverTimeStep& TimeStep, FProposedMove& OutProposedMove) const; UFUNCTION(BlueprintImplementableEvent, DisplayName = "OnGenerateMove", meta = (ScriptName = "OnGenerateMove")) FProposedMove K2_OnGenerateMove(const FMoverTickStartData& StartState, const FMoverTimeStep& TimeStep) const; virtual void OnSimulationTick(const FSimulationTickParams& Params, FMoverTickEndData& OutputState); UFUNCTION(BlueprintImplementableEvent, DisplayName = "OnSimulationTick", meta = (ScriptName = "OnSimulationTick")) FMoverTickEndData K2_OnSimulationTick(const FSimulationTickParams& Params);
Mover TitanMovementMode ● スタミナの制御・判定 ● GameplayAbilityと連携してアクションを実装 ○ グライダー ○ グラップリング ● 入力判定とパラメータの変更 ○ スプリント ● モード内でのアクション遷移判定/制御 ○ 歩き⇔スプリント ○ 落下⇔グライダー
歩行 +スプリント グラップリング 落下 +グライダー セイリング 物理シミュレーションで動く鉄鍋に位置を同期している
アクター コンポーネント/ ゲームプレイアビリティ コンポーネント/ アクター ゲームプレイアビリティ ゲームロジック ゲームロジック ゲームロジック ゲームロジック 移動モード ゲームロジック CMC Mover 移動モード ゲームロジック 移動モード ゲームロジック
CMC Mover PhysWalkingMode ● ● CMCではキャラクターは物理界で動いていない ○ 物理界では無限の重さ を持つ 静的なオブジェクト ○ 剛体から押し返されることはない ■ プレイヤーは「重量」を感じにくい Mover - PhysWalkingMode ○ 物理界で移動するので剛体の重さや運動量が 考慮される ○ 重い剛体には押し負ける ○ 物理ベースの遊びが実現可能に Mover PhysWalking
Mover MovementMode の切替方法 ● SetMovementModeのような直接設定は不可能に ● FCharacterDefaultInputs::SuggestedMovementMode ○ ProduceInputからの切り替えリクエスト ● FMoverTickEndData::MovementEndState.NextModeName ○ ムーブメントモードから次の更新時のモードを指定 ● MovementModeTransition ○ ムーブメントモード毎に追加可能な評価関数 ○ モジュラー式に追加できる
Mover MovementModeTransition ● モード遷移判定クラス ○ 特定のモードから特定のモードへの遷移 ● 実装メンバ関数 ○ OnEvaluate 判定を行い遷移先を返す ○ OnTrigger モード遷移が発生した時に呼ばれる
Mover MoverComponent 処理のながれ MovementMode Actor ProduceInput OnGenerateMove OnSimulationTick FMoverInputCmdContext FCharacterDefaultInputs FProposedMove FSyncState
MovementMode OnGenerateMove MovementMode OnSimulationTick ● 入力から移動量を計算 する ● FProposedMoveを参照し移動する ● 参照するデータ ○ 入力データコンテナ ■ CharacterDefaultInput ○ SyncState ○ SimBlackBoard ■ データ保存領域 ● 参照データ ○ FProposedMove ○ 直前のフレームのSyncState ○ SimBlackBoard ○ (CharacterDefaultInput) ● 出力 ○ ● 出力 ○ FProposedMove ○ MoveCompoentを呼び出し、 コンポーネントを実際に動かす SyncState
OnGenerateMove MovementMode OnGenerateMoveと OnSimulationTick ● ● 二つの関数はそれぞれ 「移動量の算出」と「移動量の適用」を担う ○ 移動量はLayerdMove によって加工されるこ とがある 移動量 LayeredMove 移動量 移動量 LayeredMove ○ 一定期間の移動速度のオーバライドやミックス ○ ルートモーション ○ ホーミングやドッジなど OnSimulationTick LayeredMove
Mover RootMotion ● LayeredMoveによって実装 ○ Play Montage (Mover Actor) ● MotionWarping ● AnimGraphからの ルートモーションも今後対応予定 ○ FLayeredMove_RootMotionAttribute
Mover MovementModifier ● 一時的なパラメータや動作の加工 ○ 速度の操作 ○ アクターのパラメータの制御 ● 利用例 ○ しゃがみ
Mover SyncState ● 1Tick毎に生成されるアクターの完全な状態を再現する ための構造体 ○ OnSimulationTickの中で状態が保存される ● FMoverDefaultSyncState ○ 姿勢 Location+Rotation ○ 速度 Velocity ○ 入力 MoveDirectionIntent ○ MovementBaseの情報 ● サーバーからの通信に乗る USTRUCT(BlueprintType) struct MOVER_API FMoverSyncState { GENERATED_USTRUCT_BODY() public: // The mode we ended up in from the prior frame, // and which we'll start in during the next frame UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = Mover) FName MovementMode; // Additional moves influencing our proposed motion UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = Mover) FLayeredMoveGroup LayeredMoves; // Additional modifiers influencing our simulation UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = Mover) FMovementModifierGroup MovementModifiers; UPROPERTY(BlueprintReadWrite, Category = Mover) FMoverDataCollection SyncStateCollection; …
Mover ネットワーク同期
Mover ネットワーク同期 エラー検出は クライアント側 入力のみ! 入力に加えて クライアント上の 移動結果もサーバーに送信 入力に反応して 移動が即座に処理される クライアントと サーバーの移動結果を 比較してエラーを検出 入力はバッファリングされ 移動処理は その場ではトリガーされない
Mover バックエンドクラス ● ネットワーク通信時の動作を定義するクラス ○ NetworkPhysicsLiaison ■ NetworkPhysicsComponentを利用した 再シミュレーションを含む高価な同期機構 ○ NetworkPredictionLiaison(Default) ■ サーバーからの同期情報にエラーがあった場合に ステートを受け入れて再度移動処理を行う ○ StandaloneLiaison ■ ネットワーク同期を使わない ● Tick処理のタイミングにも影響を与える事に注意
Mover AnimationBP連携 ● PropertyAccessノード ○ Moverの様々なプロパティにアクセス ● Titanの拡張 : GetTagsFromSyncState ○ ゲームプレイタグを直接取得
まとめ ● ProjectTitanは4000人を超える参加者の情熱が詰まったプロジェクト ○ サンプルとしてありのまま で公開 ● チュートリアルビデオやベースマテリアルなど弊社の運営チームが作成した様々なコンテンツ ○ ランドスケープデザイナー ● 将来的にキャラクタームーブメントを置き換えるMover の素晴らしい実装例 ○ ゲームプレイアビリティのサンプルとしても有用 ○ MoverはCMCと同じ感覚で利用できるように絶賛開発中 ○ 物理ベースのゲームデザインを実現
ご清聴ありがとうございました! 2024 Epic Games Japan, Takashi Suzuki