このページでは、非常に詳細でリアルな環境を作成するためのベスト プラクティスを紹介する Talisman: Environment テンプレートの説明を補足します。 Talisman は、Unreal Editor for Fortnite (UEFN) のモジュール構造と最適化のベスト プラクティスを使用して作成されています。
テンプレートは、プロジェクト ブラウザの [Feature Examples (機能例)] セクションにあります。
2024年のゲーム開発者会議で紹介された Talisman 体験をプレイするには、フォートナイトを開いて島コード 7100-3544-3074 を入力します。
プロジェクト ブラウザ内の Talisman: Environment テンプレートの場所です。
この概要では、Talisman プロジェクトの作成中に直面した最適化に関する問題と、それぞれの問題をどのように解決したのかについて説明します。
テンプレートは利用可能なすべてのプラットフォームで実行できるように設計されているため、Talisman のアセットとスタイルは、UEFN のメモリとプロジェクト サイズの制限要件に準拠する必要があります。 これに伴い、より詳細なアート スタイルで設計されたプロジェクトでは、いくつかの問題が生じます。
プロジェクト サイズ:ゲーム内の高詳細アセットは大きくなる可能性がありますが、UEFN には 400 MB のプロジェクト サイズ制限があります。
ランタイム メモリの制限:UEFN には 100,000 メモリ ユニットのストリーミング メモリ制限があり、一度に画面に表示できるアセット、カスタム ランドスケープ、仕掛けの量が制限されます。
サポートされているすべてのプラットフォームでの品質:これらの制限により、フォートナイトでサポートされているすべてのプラットフォームのすべてのプレイヤーが UEFN 体験を利用できるようになります。
UEFN は、これらの要件を満たすために、詳細レベル (LOD、Hierarchical Levels of Detail (HLODs)、World Partition、レベルのインスタンス化、データ レイヤーなど、さまざまな技術をサポートしています。
ベスト プラクティスを適用する
Talisman: Environment テンプレートは、Unreal Editor for Fortnite に AAA レベルのリアリズムをもたらす、さまざまなベストプラクティスとプロセスを紹介できるように設計されています。 このテンプレートでは、プロジェクトとストリーミング メモリを管理してパフォーマンスを最適化するために、次のベストプラクティスを使用しています。
モジュール式で軽量なカスタム コンテンツの作成。
面重み付け法線を使用したハード サーフェス ジオメトリの外観の改善。
メッシュ デカールを使用したメッシュへの詳細の追加。
最も低コストなターゲット プラットフォーム向けの体験の構築と、そこからの機能の追加。
Nanite 以外のメッシュでのドロー コールの最小化。
モジュール式で軽量なカスタム コンテンツを作成する
Talisman: Environment は、モジュラー環境の既存のメッシュを使用してそれらを再利用し、新しいアセットを作成するモジュラー モデリング手法であるキットバッシングを用いてビルドされました。 アセットを再利用することで、アーティストは使い捨てメッシュの数を最小限に抑え、プロジェクトのサイズを縮小することができました。
このアセットは 6 つの異なるスタティックメッシュで構成されています。
従来、アーティストは、独自のベイク処理された法線マップを使用して、高詳細度、高ポリゴン メッシュを低ポリゴン メッシュにマッピングし、2 つのメッシュ間のディテールを保持することで、このようなタイプの環境を作成していました。 この方法では追加のテクスチャ マップが必要になります。したがって、プロジェクトのサイズが大きくなり、実行時にコストがかかり、キットバッシング プロセス中に適切にスケーリングされない可能性があります。
メモリを節約するために、面重み付け法線を持つ中ポリゴン メッシュが使用され、細かいディテールを追加するためにメッシュ デカールが使用されました。
詳細については、「メッシュの設計と構築」を参照してください。
すべてのターゲット プラットフォーム向けのエクスペリエンスをビルドする
フォートナイトはさまざまなプラットフォームで実行できるように設計されています。 コンテンツを各デバイスでプレイヤーに最高の体験を提供できるようにするには、まずはすべてのプラットフォームを念頭に置いて設計し、開発中にハイエンド プラットフォーム向けの追加機能を追加することが重要となります。
たとえば、Nanite 仮想ジオメトリは、プラットフォームが非常に詳細なメッシュをレンダリングし、パフォーマンスを向上させるのに役立ちますが、DirectX 12 を実行する PC などの特定のハイエンド デバイスでのみ利用できます。 したがって、すべてのプラットフォームでコンテンツが適切に機能するように、コンテンツを最適化することが重要となります。
以下の図は、Epic の最高、高、中、低設定のメッシュ LOD を示しています。
UEFN 用の独自のカスタム アセットを作成する方法の詳細については、「メッシュの設計と構築」を参照してください。
非 Nanite メッシュ使用時のドロー コールを最小限に抑える
ドロー コールは、各フレームで何を描画し、どのように描画するかをグラフィックス API に指示するプロセスです。 Nanite は、必要に応じてジオメトリをシーンにストリーミングすることで、標準のドロー コールをバイパスします。 Nanite 以外のメッシュの場合、次の各要素によってシーン内でドロー コールが開始されます。
個々のメッシュすべて。
メッシュ上の各マテリアル。
すべてのライト。
あらゆるシャドウ キャスト。
Talisman: Environment テンプレートでは、Nanite メッシュと非 Nanite メッシュの両方が使用されています。 非 Nanite メッシュを使用しながらパフォーマンスを最適化するために、シーン内のドロー コールの数は次のような方法で最小限に抑えられています。
重要でないメッシュの削除。
重要でないメッシュ デカールの削除。
シャドウキャストするライトを削除し、ライト関数を使用して補完。
プロジェクトの管理とランタイム メモリの制限
ランタイム メモリ管理とプロジェクト サイズの管理は、UEFN で作成されたすべてのプロジェクトの重要なコンポーネントとなります。 Talisman: Environment は、以下の方法でこれらの課題に取り組んでいます。
プロジェクト スコープを絞り込む。
カスタム アセットの再利用。
ランタイム メモリの管理。
狭いプロジェクト スコープ
400 MB のプロジェクト サイズ制限を満たすために、MetaHuman キャラクターは Talisman: MetaHuman テンプレートに移動しました。 このテンプレートは、プロジェクト ブラウザの [Feature Examples (機能例)] セクションにあります。 UEFN の MetaHuman について詳しくは、「Talisman: MetaHuman テンプレート」を参照してください。
詳細度
Talisman の構築に使用される各メッシュでは、プロジェクトを 100,000 ストリーミング メモリ ユニットの予算内に収めるために 3 つの詳細レベル (LOD) が使用されています。
自動 LOD 設定は、スタティックメッシュ ブラウザにあります。
LOD メッシュは、UEFN の自動 LOD ツールを使用して自動生成され、特定の品質レベルに割り当てられます。 UEFN での 詳細レベルの使用方法の詳細については、「詳細度 (LOD) を設定する」を参照してください。
ランタイム メモリを管理する
Talisman: Environment テンプレートは、データ レイヤーとシーケンサーを使用して作成されたカスタム ストリーミング ソリューションを使用し、レベルを 100,000 メモリ ユニットのストリーミング バジェット内に維持します。 貨物室のようなエリアの垂直方向のサイズと廊下の長さにより、この船は World Partition のストリーミング グリッド内に収まっていません。
各データ レイヤーは、Talisman 上の異なる部屋に対応しています。
この制限を克服するために、データ レイヤーをシーケンサーと組み合わせて、プレイヤーの位置に基づいて船の領域をロードおよびアンロードできるようになりました。
ミューテーター ゾーンは、レベル シーケンスの読み込みイベントをトリガーします。
各部屋には独自の対応するデータ レイヤーがあり、レベル シーケンスでイベントをトリガーするミューテーター ゾーンが船全体に広がっています。 これらのイベントは、プレイヤーがレベルを移動するときに船のセクションをロードおよびアンロードします。 ミューテーター ゾーンは、プレイヤーからこれを隠すために、船内のエリアに戦略的に配置されています。
このソリューションはマルチプレイヤー体験と互換性がありません。 データ レイヤーとレベル シーケンスは含まれていますが、テンプレートをマルチプレイヤー対応にするために、ミューテーター ゾーンは削除されています。
カスタム UI 要素を使用する
このテンプレートは、Verse を使用してカスタム クエスト アイコン ウィジェットを表示し、プレイヤーが開始ルームのコンソールを操作したときにオーディオを再生します。
カスタム クエスト バナーは Verse スクリプトによってトリガーされます。
プレイヤーが Crew Quarters VO Button 仕掛けを使用すると、「starting_sequence_device.verse」スクリプト ファイルは次のようになります。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/Diagnostics }
音声メッセージがまだ再生されている場合は、ウェルカム オーディオをキャンセルします。
プレイヤーが Talisman を探索できるように、船のミニマップを有効にします。
カスタム quest_icon_widget UI ウィジェット ブループリントを表示します。
サウンド クリップを再生します。
Verse を使用して UEFN プロジェクトをカスタマイズする方法の詳細については、「Verse を使用したプログラミングのオンボーディング ガイド」を参照してください。
広い空間のライティング
Talisman は Lumen グローバル イルミネーションを使用して環境を照らしています。それにより、プレイヤーに船全体のシャドウと正確な間接ライティングを提供しています。
この廊下では、ここで説明したすべてのテクニックを使用しています。
Lumen は、直接ライティングで照らされていないオブジェクトにアンビエント オクルージョンとグローバル イルミネーションを提供します。 Lumen はライティング ソリューションを作成するための強力なツールですが、パフォーマンスを最大化するには環境を最適化することが重要となります。 Lumen は、いくつかの最適化を施した「Talisman: Environment」テンプレートで使用されます。
レベル全体で間接的に照らされているすべてのスタティックメッシュで、シャドウ キャスティングがオフに切り替わります。 Lumen はこれらのメッシュに優れたシャドウを提供するため、[Cast Shadows (影を生成する)] プロパティをオフにすると、視覚的な品質を犠牲にすることなくパフォーマンスが向上します。
テンプレート内のほとんどのライトでは、[Cast Shadows] がオフになっています。
シャドウ キャストも、ライト関数と、いくつかのオーバーヘッド ライトによるストライプ テクスチャの使用によって補完されます。
エミッシブ ライト パネルの Lumen ノイズと光のちらつきは、各パネルを非シャドウ キャスト スポットライトとペアにすることで軽減できます。
このスポットライトが、このライト パネルからのライトを改善しています。
各パネルのエミッシブ値が削減され、非シャドウ キャスト スポットライトが追加されます。 各スポットライトには小さな効果半径が付与されています。それが追加でシーンを照らす一方で、まるでライトがライト パネルから出ているかのように表現しています。
各ライトの最大描画距離を可能な限り短くすることで、環境ライティングがさらに最適化されました。 この設定により、レンダリングする必要のない各ライトがビューから除外されます。
Lighting Complexity ビジュアライザーは、Talisman 全体のライティングにも使用されています。
Lighting Complexity ビジュアライザーは、Alt+7 で切り替えることができます。
このビューポート ビューモードでは、レベル内のジオメトリに影響を与える非静的ライトの数をカラー シェーディングとして表示するため、ライティングのパフォーマンス コストを追跡するのに役立ちます。 また、レベル内のライトの重なりを最小限に抑えてパフォーマンス コストを低く抑えたい際にも役立ちます。
メッシュの設計と構築
キットバッシングと中ポリゴンのカスタム メッシュを使用して、Talisman 内部の詳細なデザインを作成しました。 キットバッシングは、メッシュを再利用して組み合わせ、新しいジオメトリを作成しながら、プロジェクトに必要なアセットの数を最小限に抑えるのに役立つテクニックです。
プロジェクト内の各メッシュでは、さまざまな手法を使用して、追加のジオメトリを追加せずにアセットの外観を改善しています。
面重み付け法線は、モデルの頂点法線をより大きな平らな面に揃えて、パフォーマンスを低下させることなくシェーディングを改善する手法です。
シェーディングが改善するため、頂点法線 (緑の線) は、より大きな平らな面と調整されています。
ボルト、ブランディング、ダメージなどのディテールはメッシュ デカールを使用して追加されています。 これらデカールは、カスタム UV を使用して複雑なジオメトリをサーフェスに投影し、外観を維持しながらコーナーをラップしたり、スプラインに沿って伸ばしたりすることができます。
動的マテリアル制御を用いてマテリアルを設計する
多くの場合、テクスチャとマテリアルは UEFN プロジェクトの最大の部分を占めます。 プロジェクトのサイズをさらに小さくするため、テンプレートでは、固有のテクスチャ マップの使用を回避するテクスチャとマテリアルに対して、動的なアプローチが採用されています。 この最終結果には、頂点カラーを使用してメッシュ上にアンビエント オクルージョン、曲率、マスク データを保存する手続き型ワークフローが使用されています。 保存されたデータは、マテリアルの適用とブレンドに使用されました。
頂点カラー データ
頂点カラーで各メッシュにアンビエント オクルージョン、曲率、テクスチャ マスク データをパックすることにより、各アセットに固有のテクスチャ マップを使用しないようにするのが最善です。 Talisman のメッシュは、頂点カラー間のスムーズなグラデーションを実現するために、サポート ジオメトリとメッシュ密度 (1 平方インチあたりのポリゴン数) を考慮して設計されています。 これにより、マテリアル間の移行がスムーズになります。
データは次の方法で保存されます。
| マップ | カラーチャンネル |
|---|---|
アンビエント オクルージョン | 赤 |
曲率 | 緑 |
マテリアル ID マスク | 青 |
頂点カラー ペイントの詳細については、「頂点カラー マテリアル」を参照してください。
各メッシュのマテリアル スロットは、メッシュのどの部分に特定のマテリアルを適用するかを定義するために使用されます。 マテリアル スロットの詳細については、「FBX マテリアル パイプライン」を参照してください。
この椅子には金属とゴム用のマテリアル スロットがあります。
動的マテリアル制御
Talisman のメッシュは、主に次の 5 つのマテリアル タイプを組み合わせて使用しています。
Metal
塗装した金属
プラスチック
ゴム
布
各マテリアルは、ワールド アラインメント タイリング テクスチャとユーザー定義のパラメータを使用して結果を生成する、単一のマスター マテリアルに依存しています。 これにより、アーティストは船全体で同じマテリアルを使用できるようになり、その結果、マテリアルの全体的なメモリ コストを低く抑えることができます。
Talisman: Environment のマスター マテリアルの一部です。
マスター マテリアルにはほこり、傷、その他の摩耗痕も含まれており、パラメータ駆動のマスクを使用してメッシュに適用されます。 これらのパラメータは、カスタム プリミティブ データを使用してメッシュに保存されます。
オービット カメラ仕掛けを使用する
オービット カメラ仕掛けにより、プレイヤー キャラクターを追跡する視点を得られます。それを回転させて自由に周囲を見回すこともできます。 テンプレートでは、この仕掛けを使用することで、プレイヤーが三人称視点とシミュレートされた一人称視点を切り替えられます。
プレイヤーは、オービット カメラ仕掛けを使用して 3 つの異なる視点を切り替えることができます。
これは、camera_switch_mode_device Verse スクリプトを使用して行われます。
# This file handles swapping between different cameras when an input is pressed.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/Diagnostics }
Verse コードは、プレイヤーがターゲットのクリエイティブ入力アクションをトリガーするのをリッスンします。このアクションは、デフォルトではマウスの右クリックまたはコントローラーの左トリガーにマップされています。 その後、次の操作を実行します。
現在のカメラをカメラ スタックから削除します。
カメラ配列内の次のカメラを取得します。
新しいカメラをエージェントに追加します。
必要に応じて、プレイヤー キャラクターを非表示にします。
必要に応じて、プレイヤー キャラクターの非表示を解除します。