Unreal Engine のプロシージャル コンテンツ生成フレームワークでの形状文法の一般的な使用例は、システムの構築です。 この例では、文法を使用してスプラインに沿っていくつかのスタティック メッシュをスポーンし、スプライン制御点が変更されたときにメッシュを変更するフェンス ジェネレータを作成します。
このサンプルは、Fab で無料で提供されているプライバシー フェンス パック (ダメージを受けたセクションも含む) を使用しています。 この例では、任意のスタティック メッシュを使用して作成することもできます。
前提条件
この操作ガイドでは、次のドキュメントで説明されている用語や概念が使用されています。
プロジェクトの設定
Unreal Engine で新規プロジェクトを作成します。
基本レベル テンプレートを使用して新規レベルを作成します。 レベルを保存します。
[Edit (編集)] > [Plugins (プラグイン)] を開いて、次のプラグインがアクティブであることを確認します:
プロシージャル コンテンツ生成フレームワーク (PCG)
プロシージャル コンテンツ生成フレームワーク (PCG) ジオメトリ スクリプトの補間
スプラインを作成する
PCG グラフは、新しいブループリント クラスに含まれている PCG コンポーネントとスプラインに接続します。 ブループリント クラスを作成するには、以下の手順を実行します:
[Content Drawer (コンテンツ ドロワー)] または [Content Browser (コンテンツ ブラウザ)] を右クリックして、[Blueprint Class (ブループリント クラス)] を選択し、新しいブループリント クラスを作成します。
新しいブループリント クラスに「FenceSpline」という名前を付けます。
[Components (コンポーネント)] タブで、ユーティリティの [Spline (スプライン)] と [PCG] コンポーネントを追加します。
ブループリント クラスを保存します。
PCG グラフ アセット
PCG グラフはフェンス ジェネレータの基盤であり、スプラインに沿ったフェンス セクションを生成するために使用される命令が含まれています。 以下の手順を実行して、新しい PCG グラフ アセットを作成します:
[Content Drawer (コンテンツ ドロワー)] または [Content Browser (コンテンツ ブラウザ)] で右クリックして、[PCG]、 [PCG Graph (PCG グラフ)] の順に選択します。
新しいアセットに「PCG_FenceGen」という名前を付けて、Enter キーを押します。
[PCG_FenceGen] をダブルクリックして、PCG グラフ エディタを開きます。
PCG 文法を作成する
文法は文字列としてグラフ パラメータに格納されます。 パラメータに値を格納すると、パラメータのオーバーライドを使用して、レベル内にあるフェンス ジェネレータの各インスタンスをカスタマイズすることができます。 その後、文法属性はスプライン データに追加され、Subdivide Spline ノードに渡されて、スプラインに沿ったポイントを割り当てられます。
[PCG Graph Editor (PCG グラフ エディタ)] のウィンドウで、スプラインデータを取得ノードをグラフに追加します。
画面上部のボタンをクリックして [Graph Settings (グラフ設定)] を開き、新しいパラメータを作成します。 新しいパラメータに「Grammar」という名前を付けて、その型を [String (文字列)] に変更します。
文法の初期値を「A*」に設定します。 これにより、最初にスタティック メッシュを配置し、スペースがある限り、スプラインの残りの部分をスタティック メッシュで埋めるようにグラフに指示します。
スプラインデータを取得ノードの出力からドラッグして属性を追加ノードを作成します。 [Details (詳細)] パネルで、[Output Target (出力ターゲット)] を [
Grammar (文法)] に変更します。文法パラメータの取得ノードを作成し、[Add Attribute (属性を追加)] の [Attributes (属性)] 入力に接続します。
[Accept Incomplete Subdivision (不完全なサブディビジョンを受け入れる)] のチェックボックスをクリックします。
[Grammar as Attribute (属性としての文法)] のチェックボックスにチェックを入れ、[Grammar Attribute (文法属性)] を [
Grammar (文法)] に設定します。
メッシュを文法に割り当てる
文法内の各シンボルには、スポーンするスタティック メッシュを割り当てる必要があります。 これは、モジュール情報 とメッシュ情報の 2 つのパラメータを使用して行います。 モジュール情報にはシンボルの配列が含まれます。 メッシュ情報にはスタティック メッシュの配列が含まれます。 この情報は、属性セットとして後から Subdivide Spline ノードに渡されます。
Subdivide Spline ノードを選択し、[Module Info as Input (モジュール情報を入力とする)] のチェックボックスをクリックします。 これにより、モジュール情報を文法シンボルに割り当てるために使用できる属性の入力が追加されます。
[Graph Settings (グラフ設定)] で新しいパラメータを作成して、「Module Info」という名前を付けます。 タイプを [PCG Subdivision Submodule (PCG サブディビジョン サブモジュール)] に変更し、タイプの横にあるドロップダウン メニューをクリックして [Array (配列)] を選択します。 これはシンボルの情報を保持します。
[+] ボタンをクリックして新しい配列要素を追加し、[Index [0]] の横の矢印をクリックしてエントリを開きます。
[Symbol (シンボル)] の値を [
A] に設定し、[Scalable (スケーラブル)] オプションの横にあるチェックボックスをオンにします。[Graph Settings (グラフ設定)] で新規パラメータを作成して「Mesh Info (メッシュ情報)」という名前を付けます。 タイプを [Static Mesh (スタティックメッシュ)] に変更し、タイプの横にあるドロップダウン メニューをクリックして [Array (配列)] を選択します。 ここにスタティック メッシュの情報が保持されます。
[+] ボタンをクリックして、[Mesh Info (メッシュ情報)] に新しい配列要素を追加します。
[Index [0]] の横にあるドロップダウン メニューを開き、[Fence_17_DE] スタティック メッシュを選択します。
抽出情報サブグラフを作成する
サブディビジョン プロセスでは、各モジュールにサイズを割り当て、ピボット ポイントを境界の中央に配置します。 これにより、後からメッシュを変更した場合や、メッシュの途中にピボットがない場合に問題が発生します。 このサブグラフは、選択したメッシュのバウンドから直接サイズ情報を抽出し、そのピボット ポイントが中心になるように調整します。
入力ノードを設定する
[Content Drawer (コンテンツ ドロワー)]または[Content Browser (コンテンツ ブラウザ)]で、新しいPCG グラフを作成して「PCG_ExtractInfo」という名前を付けます。
入力ノードをクリックし、詳細パネルで [Pins (ピン)] オプションを開きます。 [Index [0]] を開き [Label (ラベル)]を [
Mesh Info (メッシュ情報)] に変更します。[Allowed Types (許可されているタイプ)] オプションを [Point or Param (ポイントまたはパラメータ)] に変更します。
[Pin Status (ピンのステータス)] オプションを [Normal (標準)] に変更します。
ツールチップを [
List of meshes to extract info from (情報を抽出するメッシュのリスト)] に設定します。
メッシュ境界を抽出
[Graph Settings (グラフ設定)] を開き、新しいパラメータを作成します。 [Mesh Attribute Name (メッシュの属性名)] という名前を付けて、タイプを [Name (名前)] に設定します。 初期値を [
Mesh (メッシュ)] に設定します入力ノードの出力からドラッグして属性の名前を変更ノードを作成します。
詳細パネルで、[New Attribute Name (新しい属性名)] を「
Mesh (メッシュ)」に設定します。メッシュ属性名の取得ノードを作成し、属性の名前を変更ノードの [Attribute to Rename (名前を変更する属性)] 入力に接続します。
属性の名前を変更ノードからドラッグして、新しいメッシュの境界ノードを作成します。
新しいノードをクリックし、メッシュ属性の値を [
Mesh (メッシュ)] に設定します。[Attribute Rename (属性の名前を変更)] の出力からドラッグし、メッシュの境界ノードの [Attribute (属性)] 入力に接続します。 グラフによって、適切な入力を作成するためのフィルターが自動的に作成されます。
Alt キーを押したまま新しいフィルター ノードの出力をクリックして、接続を解除します。
接続されていないフィルタ ノードをドラッグして、ポイントに属性をセット ノードを作成します。 そのノードの出力を [Bounds From Mesh (メッシュの境界)] の入力に接続します。 こうすることで、グラフでポイント セットと属性データの両方のタイプをサポートできるようになります。
メッシュの境界ノードをクリックし、[Mesh Attribute (メッシュの属性)] オプションの値を [
Mesh (メッシュ)] に設定します。
ピボット ポイントを調整する
スタティック メッシュのピボット ポイントは、スプライン上に正しく表示されるように調整する必要があります。[Bounds From Mesh (メッシュの境界)] からドラッグして乗算ノードを作成します。
新しいノードをクリックし、[Input Source 1 (入力ソース 1)] の値を [
$Extents.X] に設定します。これにより、境界データから X 範囲が抽出されます。[In B (入力 B)] 入力からドラッグして属性を作成ノードを作成します [Double Value (ダブル値)] を [
2.0] に変更します。乗算ノードをもう一度クリックし、[Output Target (出力ターゲット)] の値を [
Size (サイズ)] に変更します。 2 を乗算した完全な X 値を出力し、[Size (サイズ)] という属性に格納します。乗算ノードからドラッグして属性をコピーノードを作成します。 [Multiply (乗算)] 出力を再度ドラッグし、新しいノードの [Source (ソース)] 入力に接続します。 このノードは境界データから Z 範囲を抽出し、将来のスケーリングのために必要に応じてそれを属性に保存します。
[Copy Attributes (属性をコピー)] をクリックし、[Input Source (入力ソース)] を [
$Extents.Z] に設定します。[Output Target (出力ターゲット)] を [
ExtentsZ] に設定します。[Copy Attributes (属性をコピー)] の出力からドラッグして別の乗算ノードを作成します。 このノードはメッシュのピボットを中央に移動するのに役立ちます。
[In B (入力 B)] 入力からドラッグして属性を作成ノードを作成します [Double Value (ダブル値)] を [
-1.0] に変更します。クリックして乗算ノードに戻ります。 詳細パネルで、[Input Source 1 (入力ソース 1)] の値を [
$LocalCenter] に設定します。[Output Target (出力ターゲット)] の値を [
PivotOffset] に設定します。
出力ノードを設定する
出力ノードをクリックし、グラフの最後に配置します。
詳細パネルで [Pins (ピン)] オプションを開きます。 [Index [0]] を開き、[Allowed Types (許可されているタイプ)] を [Attribute Set (属性セット)] に変更します。
[Pin Status (ピンのステータス)] オプションを [Normal (標準)] に変更します。
乗算ノードの出力からドラッグして、新しい属性セットへのポイント セット ノードを作成します。
新規ノードの出力を出力ノードの出力ピンに接続します。
完了したグラフを保存します。
PCG_FenceGen グラフ エディタ ウィンドウに戻ります。 Content Drawer (コンテンツ ドロワー)またはContent Browser (コンテンツ ブラウザ)から PCG_ExtractInfo グラフ アセットをビューポートにドラッグアンドドロップし、[Create PCG_ExtractInfo Subgraph Node (PCG_ExtractInfo サブグラフ ノードを作成)] を選択します。
モジュールおよびメッシュの情報を適用する
[PCG_FenceGen] グラフに戻り、Add Attribute (属性を追加スプライン ノード)ノードを作成し、Subdivide Spline ノードの近くに配置します。
モジュール情報を取得ノードを作成し、属性を追加ノードの [In (入力)] に接続します。
メッシュ情報を取得ノードを作成し、[Add Attribute (属性を追加)] の [Attributes (属性)] 入力につなげます。
[属性を追加] の [出力] を、PCG_ExtractInfo サブグラフ ノードの [メッシュ情報] 入力に接続します。
サブグラフ ノードの出力を Subdivide Spline ノードの [Modules Info (モジュール情報)] 入力に接続します。
Subdivide Spline ノードの出力からドラッグして。属性を照合および設定ノードを作成します。 サブグラフ ノードの出力を、[Match Data (マッチ データ)] 入力に接続します。 このノードは、Subdivide Spline からポイント データと文法を受け取り、それらのパラメータのモジュール情報とメッシュ情報をマッチングします。
属性を照合および設定ノードをクリックし、次のオプションを設定します:
[Match Attributes (マッチ属性)] の横にあるチェックボックスをクリックします。
[Input Attribute (入力属性)] と [Match Attribute (マッチ属性)] の値を [
Symbol (シンボル)] に設定します。
ピボット オフセットトランスフォームを適用する
属性を照合および設定ノードをドラッグして、乗算ノードを作成します。このノードは、PCG_ExtractInfo サブグラフのデータを使用して各メッシュのピボットをスケーリングします。
[Match and Set Attribute (属性をマッチおよび設定)] の出力からドラッグして、乗算ノードの [In B (入力 B)] 入力に接続します。
乗算ノードをクリックします。 [Input Source 1 (入力ソース 1)] の値を [
PivotOffset] にし、[Input Source 2 (入力ソース 2)] の値を [$Scale] に設定します。[Multiply (乗算)] からドラッグして、ベクター: トランスフォームの方向ノードを作成します。 このノードは、スプライン上のポイントに一致するようにピボットを回転させます。
[Multiply (乗算)] の出力からドラッグし、ベクター: トランスフォームの方向ノードの [Transform (トランスフォーム)] 入力に接続します。
新しいノードをクリックし、[Operation (演算)] を [Transform Direction (トランスフォームの方向)] に設定します。
[Input Source 1 (入力ソース 1)] の値を [
PivotOffset] にし、[Input Source 2 (入力ソース 2)] の値を [$Transform] に設定します。[ベクター: トランスフォームの方向] からドラッグして、新しい追加ノードを作成します。 このノードは、最終的なピボット オフセットをメッシュ上のピボットの位置に追加します。
[ベクター: トランスフォームの方向] の出力からドラッグし、追加ノードの [In B (入力 B)] 入力に接続します。
[Input Source 1 (入力ソース 1)] の値を [
$Position] にし、[Input Source 2 (入力ソース 2)] の値を [PivotOffset] に設定します。
スタティック メッシュをスポーンする
追加ノードの出力からドラッグして、新しいスタティック メッシュ スポナーを作成します。 このノードは、スプラインに沿ってスタティック メッシュをスポーンします。
詳細パネルで、[Mesh Selector Type (メッシュ セレクター タイプ)] を [PCGMeshSelectorByAttribute] に設定します。
[Attribute Name (属性名)] の値を [
Mesh (メッシュ)] に設定します。グラフを保存します。
レベル内の [FenceSpline] アクタをクリックします。 詳細パネルで、[PCG] コンポーネントを選択し、ドロップダウン メニューで [Graph (グラフ)] オプションを [PCG_FenceGen] に設定します。
結果
スプラインに沿ってスポーンされている、フェンスのスタティック メッシュのラインを確認します。
文法に記号を追加してモジュール情報で定義し、メッシュ情報でスタティック メッシュを割り当てることで、スタティック メッシュにさらにバリエーションを加えることができます。 これは、グラフ内で行うことも、パラメータ オーバーライドを使用してインスタンスごとに行うこともできます。
以下の例では、フェンス ラインに次の追加機能があります:
P記号を使用した投稿。G記号を使用したゲート。BLという記号を使った大規模な壊れたセクション。シンボル
BSを使用した小規模な壊れたセクション。
文法が {[A,P]:2,[BL,P]:1,[BS,P]:1}*,[G,P], {[A,P]:2,[BL,P]:1,[BS,P]:1}* に更新されました。