Geometry Scripting は、Unreal Engine 5 で導入された新しい実験的プラグインであり、このプラグインには Procedural Mesh アクタ (GeneratedDynamicMeshActor) の基本 Actor クラスおよびそのアクタのメッシュを生成するのに使用できるブループリント関数のライブラリが用意されています。たとえば、以下に示されている簡単なブループリントは、 Parametric Box オブジェクトになり、アクタの [Details (詳細)] パネルに公開される Width/Depth/Height ブループリント変数を使用してサイズを変更できます。

Geometry Script Library には、160 以上の大規模な関数のセットが用意されており、さまざまな種類の形状のジェネレータ、押し出しや回転、メッシュのブール値、およびマテリアルの割り当てを構成したりスタティック メッシュ アセットとの間でコピーを行ったりするユーティリティ関数が含まれています。
ツール ライブラリ
Lyra テック アーティストは、 Blueprint アクタ のプロシージャルなメッシュ生成を利用し、パラメトリックなレベルの設計要素のライブラリを Blueprint アクタとして構築しました。これらのブループリントは、Lyra プロジェクトで ツール (Blueprint Actor ツール) と呼ばれ、 「Tools」サブフォルダ の 「Content」 ディレクトリ にあります。ツールのいずれかを使用するには、そのツールをレベル内にドラッグし、アクタの [Details] パネル を使用して好みに応じてパーツを構成します。
このドキュメントでは、こうしたパラメトリック オブジェクトを「ツール」と表現するようにしました。ただし、ブループリントのユーザー インターフェースの一部では、「Generator (ジェネレータ)」や「Generated Mesh (生成されたメッシュ)」も使用されています。
たとえば、左下の画像は、デフォルトの B_Tool_AdvancedWindow ですが、アクタのオプション/パラメータ/マテリアルを変更することで他の 2 つのバリエーションが構築されます。
Lyra は、以下の表に挙げた Blueprint アクタ ツール を使用して構築されました。
Blueprint アクタ ツール | 説明 | 画像 |
---|---|---|
B_ASimpleCubeTool B_GeneratedTube B_GeneratedTube_Advanced B_Tool_AdvancedWindow | 外側が四角のコーナーになっていて開口部が丸いメッシュを作成するのに役立ちます。また、3D ギズモを使用し、開口部をドラッグして移動できます。これには、ミラーおよびカスタムのブール値の切り取り平面オプションが含まれます。 | ![]() |
B_Tool_CornerExtrude B_Tool_CornerExtrude1 | 均一な幅および均一なコーナーの半径を使用し、コーナー メッシュを作成します。 | ![]() |
B_Tool_Panel_BGM | [Corner Radius (コーナー半径)] コントロールを使用し、メッシュを作成します。これはブール値 (add/subtract/intersection) のインセット メッシュであり、均一な幅と一意のマテリアル ID を持っています。メッシュの寸法は、ドラッグ可能な 3D ギズモを使用して制御されます。また、ミラーおよびカスタムのブール値の切り取り平面オプションが含まれます。 | ![]() |
B_Tool_RampMakerControl_BGM | ユーザー定義のツールであり、スプラインに沿った [Width (幅)]、[Height (高さ)]、および [Depth (奥行)] のコントロールを備えた単純な長方形のボックスです。スプライン ポイントは、ゲーム ビュー モード (G キーで切り替え) で表示できます。Alt キーと左マウス ボタンを使用してドラッグすると、スプライン ポイントの終端にスプライン ポイントが追加されます。このツールは、単一のメッシュをベイクします。 | ![]() |
B_Tool_Repeater | 編集可能なスプラインに沿って、ユーザー定義の寸法を持つボックスの配列を配分します。この例は、B_Tool_Stairs_BGM で確認できます。 | ![]() |
スタティック メッシュ アセットにベイクする
Parametric Tool アクタ を使用すると、レベル デザイナーはレベルのレイアウトのプロトタイプを効率的に作成し、それらを PIE (Play-in Editor) で使用して基本的なテストを実行できます。これらのブループリントの基礎に使用される Dynamic Mesh アクタ は、従来の UE StaticMesh アセットを使用しません。代わりに、効率的な編集のために設計された新しいタイプのコンポーネントである Dynamic Mesh コンポーネント を使用します。
Dynamic Mesh コンポーネントは、迅速なパラメトリック設計を提供しますが、 Lumen や Nanite などの UE のレンダリング機能をサポートしていません。また、Dynamic Mesh Component アクタはインスタンス化をサポートしていません。つまり、ツールの複製は、完全に別のメッシュとなります。元のツールのパラメータを変更しても、その複製に反映されることはありません。デザイナーに用意されている唯一の選択肢は各複製の設定を手動で更新することであるため、
これにより、複数の場所で同じ要素を使用した場合、レベルの設計時に課題が生じることがあります。したがって、Blueprint Tools アクタをスタティック メッシュ アセットにベイクする必要があるため、標準の UE レンダリング アーキテクチャおよび設計ワークフローに準拠してください。
これをサポートするため、Tool アクタには [Details] パネルに [Generation Management (生成管理)] セクションがあります。このセクションには、 [Generate New Static Mesh (新しいスタティック メッシュを生成)] と [Bake to Static Mesh (スタティック メッシュにベイク)] という 2 つのボタンが含まれています。
ツールのインスタンスのスタティック メッシュバージョンをベイクするには、 [Generate New Static Mesh] ボタンをクリックします。これにより、アクタの他の設定によって定義されたパスに新しい StaticMesh アセットが作成されます。
例として、上の画像ではアセットは「ShooterMaps/Content/Meshes/
」生成フォルダ ディレクトリに作成され、 Mesh_ のプレフィックスを持つ自動生成の名前が付けられます。
これで、このスタティック メッシュ アセットをレベル内に配置できるようになりました。[Generate (生成)] ボタンがクリックされると、Tool アクタは [Target Static Mesh (ターゲット スタティック メッシュ)] フィールドにどのアセットが作成および格納されたかを継続的にトラッキングします。その後、ユーザーは [Bake to Static Mesh] をクリックし、いつでもそのスタティック メッシュ アセットを更新できます。これにより、ツールを編集することでレベル内のインスタンスの編集が簡単になります。
このコンテキストでの「インスタンス」という用語は、スタティック メッシュ アセットを参照するレベル内のアクタを指しています。これはたとえば、「アセットのインスタンス」であり、 インスタンス化されたスタティック メッシュ コンポーネント のインスタンスではありません。
以下の gif では、このプロセスのデモンストレーションを観察できます。最初に [Generate New Static Mesh] ボタンから新しいアセットを作成することから始め、3 つの個別のインスタンスを配置し、ツールを編集および再ベイクすることでアセットを更新します。

[Generate New Static Mesh] と [Bake To Static Mesh] の機能は、Geometry Scripting を使用してブループリントに実装されています。この関数は、 BakedGeneratedDynamicMeshActor という名前の Generated Dynamic Mesh アクタ のブループリント サブクラス内にあります。
「/Content/Tools/BakedGeneratedMeshSystem
」ディレクトリ フォルダ内のこの Dynamic Mesh アクタに移動できます。すべての Tool Blueprint アクタはこの基本クラスのサブクラスです。
非破壊的なレベルの設計
上のセクションで説明した Bake to Static Mesh の機能はパラメトリック メッシュ ツールを使用した 非破壊的なレベルの設計 を行うための効率的な方法を提供します。レベル デザイナーは、ツールを使用してレベル要素を構成し、次にそれをアセットにベイクしてレベル内のインスタンスに配置します。ベイク済みアセットは Nanite と Lumen、効率的なインスタンス化レンダリング、および UE のその他すべてのスタティック メッシュ機能をサポートします。
このシステムには欠点が 1 つあり、Tool アクタがレベル内に存在する必要があります。これは、スタティック メッシュ アセット/インスタンスの一種の「テンプレート」のようなものとなっています。ツールが削除されると、その設定は失われます。これを行うための 1 つの方法はツールを非表示に設定することですが、その場合は編集の際に明示的にこれを表示し、その後、もう一度非表示にする必要があります。もう 1 つの方法は、ツールをレベル内の「邪魔にならない場所」に配置することです。Lyra でこれを行うには、ツールを実際のレベルよりも下に配置します。
そのため、たとえば L_Expanse マップを開くと、メイン レベルの下に明らかにランダムに配置されたオブジェクトが多数見つかります。これらは、レベル アセットを生成および編集するために使用されたツールです。一貫性のない編成に見える理由については、次のセクションで説明します。
ツールとアセットをスワップする
上記で説明したアセット ベイキングのシステムにより、非破壊的なレベル設計によるパラメトリックな Tool アクタを利用できるようになりますが、これにはまだいくつかの課題が存在します。特に、レベル内に配置される特定のアセットの作成に使用するツールを見つけるのは困難です。また、配置済みのアセットに対し、別の場所にあるツールの編集や再ベイクを繰り返して微調整を行うのは効率的でありません。
より良いワークフローの実現に役立てるため、ブループリント全体で、配置済みのスタティック メッシュ アセット (Static Mesh アクタ) と Tool アクタをスワップするシステムが構築されました。このシステムは Actor Action Utility ブループリントを使用します。このブループリントは、エディタ内の右クリックのコンテキスト メニューに表示される、ブループリントの処理を作成する機能を提供します。
追加情報については、「スクリプト アクション」を参照してください。
「/Content/Tools/BakedGeneratedMeshSystem/EditorActions/
」フォルダ内に、2 つのアクション ユーティリティがあります。
1 つ目の SwapGeneratedActor_ToSM は、Tool アクタをベイク済みスタティック メッシュ アセットで置き換えるために使用します。このエディタ アクションは、アイテム [Swap to Static Mesh (スタティック メッシュにスワップ)] を BakedGeneratedDynamicMeshActor サブクラスのコンテキスト メニューに追加します。実行されると、次の処理が行われます。
-
アクタ内にベイク済みアセットがすでに構成されているかをチェックする。ベイク済みアセットがまだアセットに存在しない場合、Generate New Static Mesh および Bake to Static Mesh の処理を Tool アクタに実行します。
-
新しい ベイク済みスタティック メッシュ アクタ を作成し、ベイク済みアセットを割り当てる。
-
新しいアクタの トランスフォーム を現在のツールのトランスフォームと同じになるように設定する。
-
名前 、 データ レイヤー 、および アウトライナ の位置を、Tool アクタからスタティック メッシュ アクタにコピーする。
-
Tool アクタをレベルよりも下に再配置する。
-
アウトライナの Tool アクタの名前にプレフィックスを追加する。
この名前は、Lyra で ZZSTORED_ となるよう設定されます。
2 番目のエディタのアクション SwapGeneratedActor_FromSM が使用され、配置済みのスタティック メッシュ インスタンス (ベイク済みスタティック メッシュ アクタ) から元の Tool アクタにスワップします。これにより、ベイク済みスタティック メッシュ アクタのコンテキスト メニューに Swap to Generated Mesh アクションが追加されます。このアクションを実行すると、StaticMesh アクタは削除され、Tool アクタのトランスフォームは削除された StaticMesh アクタの位置を取るように更新されます。
パラメトリックな変更を加え、ベイク済みアセットを更新し、 Swap to Static Mesh アクションを実行してスタティック メッシュに戻すこともできます。

ソース キーおよび生成されたメッシュのコールド ストレージ
レベル デザイナーは、上記のツール、ベイキング機能、およびスワップ アクションを使用してレベルを作成および編集します。ここで、ブループリント全体でのスワップの実装方法について、技術的な詳細を確認することができます。
前述のとおり、 Baked Generated Dynamic Mesh アクタ は、現在のベイク済みアセットを [Target Static Mesh] フィールドでトラッキングし続けます。アセットが生成されると、新しい [Source Generator Key (ソース ジェネレータ キー)] 文字列もランダムに生成されます。この文字列はアクタの [Details] パネルに表示されます。
これらのフィールドは、[Generate New Static Mesh] ボタンの使用に加え、手動で初期化できます。
Swap to Static Mesh アクションによって作成されたスタティック メッシュ アクタは、Baked Static Mesh Actor という名前の基本 StaticMeshActor のブループリント サブクラスです。このサブクラスには、 Source Generator Key の追加のフィールドがあります。新しいベイク済みのスタティック メッシュ アクタがアクションによって作成されると、その Source Generator Key は、基となるツールと同じ文字列に設定されます。
この Source Generator Key の文字列は、スワッピング システムの基礎となります。ベイク済みスタティック メッシュ アクタが与えられた場合、そのキーを使用し、どのツールから派生したかを調べることができます。さらに、ツールからキーが与えられた場合、すべてのベイク済みスタティック メッシュ アクタのインスタンスを見つけることができます。
検索するための 1 つの方法は、すべてのアクタにイテレーションを行うことです。この情報を一元化し、さまざまなユーティリティ関数 (検索用など) のための場所を提供するため、システムには別のブループリント オブジェクトが追加されています。GeneratedMeshColdStorage がそのブループリントであり、これは Editor Utility アクタです。
スワッピング システムが機能するには、これらのアクタの 1 つをレベル内に配置する必要があります。アクタにジオメトリはなく、ゲームには何も影響を与えません。アクタは、以下に示す Stored Actors リスト内で既知の Tool アクタの配列を管理します。
Generated Mesh Cold Storage オブジェクトには、 Store Actor と Extract Actor という 2 つのパブリック ブループリント関数があります。これらは、Tool アクタを格納または復元するための Swap to (スワップ先にスワップ) または Swap from (スワップ元からスワップ) アクションによって使用されます。
ツール/アセット スワッピング システム用の新しいレベルのセットアップ
上記のベイキング/スワッピング システムを使用し、新しいレベルをセットアップするための手順を以下に示します。
-
コンテンツ ブラウザから、 Tools/BakedGeneratedMeshSystem/GeneratedMeshColdStorage アセットのインスタンスをレベルにドラッグします。
-
Tools/B_Tool_AdvancedWindow アセットのインスタンスをレベルにドラッグします。
-
この新しいアクタ (B_Tool_AdvancedWindow) を選択します。
-
[Actor Details (アクタの詳細)] パネルの [Generation Management] セクションまで下にスクロールし、 [Generate New Static Mesh] をクリックします。
-
レベル内のアクタを右クリックし、アクタのコンテキスト メニューの [Scripted Actor Actions (スクリプト化アクタ アクション)] サブメニューから [Swap to Static Mesh] を選択します。これによって、Tool アクタがスタティック メッシュ アクタに置き換わります。
-
レベル内で Alt キーを押したまま 3D ギズモをドラッグし、選択したスタティック メッシュ アクタの複製を作成します。
-
2 つのスタティック メッシュ アクタのいずれかを選択し、右クリックし、アクタのコンテキスト メニューで Scripted Actor Actions サブメニューから [Swap to Generated Mesh] を選択します。これによって、スタティック メッシュ アクタが Tool アクタに置き換わります。
-
[Actor Details] パネルの [Wall (ウォール)] セクションまで上にスクロールし、 [Wall Width (ウォールの幅)] を大きくします。これは、Tool アクタのみに影響します。
-
[Actor Details] パネルの [Generation Management] セクションまで下にスクロールし、 [Bake to Static Mesh] をクリックします。スタティック メッシュ アクタが、Tool アクタと同じ外観になるよう更新されます。
-
レベル内のアクタを右クリックし、アクタのコンテキスト メニューの [Scripted Actor Actions (スクリプト化アクタ アクション)] サブメニューから [Swap to Static Mesh] を選択します。これによって、Tool アクタがスタティック メッシュ アクタに再度置き換わります。
スワッピング システムの一般的な問題
上記のアセット/ツール スワッピング システムは、 Lyra L_Expanse レベルに含まれています。ほとんどのレベル要素は、レベル内に存在するツールをベースとしており、ツールと配置済みアセットをスワップすることで、非破壊的なレベル設計を使用して実験することができます。
Lyra の開発に取り組む中で、使用の際に頻繁に発生する複数のエラーが確認されたため、これらについて認識しておくと役立ちます。
-
アクタをスワップするのではなく、生成されたスタティック メッシュ アセットを手動で配置すると、結果のアクタはベイク済みのスタティック メッシュ アクタではなくスタティック メッシュ アクタになります。この状況において、アクタには [Source Key] フィールドがないため、元の Tool とのリンクが存在しません。また、[Swap to Static Mesh] コンテキスト メニューのアクションも利用できません。
-
[Swap to Static Mesh] アクションは、最初の呼び出し時を除いて、ツールをアセットに自動的にベイクしません。[Bake (ベイク)] ボタンを明示的に押す必要があります。それ以外の場合、ツールとベイク済みアセットが同期されないことがあります。再度スワップし、ベイクすることで、これは修正できます。
-
ツールがアセットにベイクされ、アセットがレベル内で使用されるようになったら、そのツールに対して [Generate New Static Mesh] ボタンを再度使用しないようにしてください。これを実行すると、新しい Source Key が生成され、既存のいずれかのアセット インスタンスの Source Key が、既存のどのツールも参照しないものになってしまいます (再度スワップすることができなくなります)。
-
バリエーションを作成するためにレベル内でツールを複製した場合は、両方のコピーが同じ Source Key と同じターゲット スタティック メッシュ アセットを持っている必要があります。このケースでは、[Generate New Static Mesh] を実行し、この競合を解決する 必要があります 。
-
生成されたスタティック メッシュ アセットには Source Key のスコープがなく、スタティック メッシュ アクタにのみスコープがあります。そのため、レベル内のアセットを使用するすべてのアクタが削除された場合、その元のツールへのリンクが失われます (ツールはレベル内にまだ存在しますが、見つけるのが難しくなります)。アセットを完全に削除するには、ツールを最初に削除し、次に配置したアクタを削除し、その後でアセットを削除する必要があります。
-
ツールが削除されると、その設定は失われ、元に戻すことができません。これは配置済みのインスタンスに影響しませんが、削除済みのツールを復元し、さらにインスタンスを更新する方法はありません。
-
[Source Key] フィールドは文字列であり、[Details] パネルで手動で編集できます。これを行うと、アセットのインスタンスとツールの間のリンクが失われます。しかしこれは、手動でその文字列を更新し、ツールとインスタンスの文字列が同じになるように壊れたリンクを修正できることを意味します。
Lyra サンプルの今後のイテレーションでは、これらの制限事項を改善する予定です。
追記
割り当てられたマテリアル:ツールのインスタンスとアセットのインスタンスをスワップすると、ワールドのトランスフォームがコピーされることに加え、割り当てられたマテリアルもコピーされます。これによって、レベル内のアセットの異なるインスタンスが異なるマテリアルの割り当てを持つようになると同時に、ツールへのスワップ/ツールからのスワップ機能は維持され、(「スワップ イン」が実行された場合) ツールは正しいマテリアルを反映します。ただし、ツールに直接行われたマテリアルの割り当ては失われます。
アクタの設定: アセット/インスタンスのスワッピングでは、可能な場合にデータ レイヤー、アウトライナの位置、およびアクタの名前が維持されます。Tool アクタをレベルの下に移動することに加え、表示/非表示も試みます。しかし、Unreal Editor ではこの表示/非表示状態が保存されないため、レベルがリロードされるとリセットされます (このため、アクタはレベルの下に表示されます)。
このコピーは、アクタのプロパティをコピーする低レベルのエンジン API から実行されます。そのため、その他多くのアクタの設定がコピーされたり戻ったりします。ただし、どちらのオブジェクトにも存在しないアクタのプロパティをコピーすることはできません。そのようなケースに対処するには、設定を明示的に Copy To/Copy From アクションで処理する必要があります。
クック/ゲーム ビルド:UE 5.0 では、ツールに使用される Generated Dynamic Mesh アクタの基本クラスはエディタ専用です。これはつまり、配置済みの Tool アクタは PIE で表示されますが、ビルド済みのクックされたゲームには含まれないことを意味します。