ジェイのブログ

Unity,UnrealEngine,ゲーム制作,プログラミング,日記も書きます!

Procedural Dungeon Generator

特徴
モジュラータイルによるスケーラブルなグリッドベース生成
グリッドスケール、ルームサイズ、ルームの複雑さ、パスの複雑さを調整する機能
高さの異なる複数階建ての部屋をサポート(1階部分の廊下のみ生成可能)
ルームに関連するアセットをダンジョンに投入可能
カスタムルームや装飾のコントロールのためのデータテーブルを簡単に変更できます。

このジェネレーターの基礎は、Toadnetが投稿したチュートリアル・シリーズに基づいています。タイルマップダンジョンジェネレーターをゼロから作る方法を学ぶには、彼のチャンネルをサポートすることを強くお勧めします。

 

Overview

壁、床、天井、内外角からなる500x500x500のタイルセットを使用するグリッドベースのダンジョンジェネレータです。このジェネレータは、これらのタイルを使用して、設定されたXとYのパラメータ内に長方形の部屋を作り、ランダムにタイルを取り除くことによって部屋を形成し、同じタイルセットで作られた廊下でそれらを接続するように構成されています。

 

部屋の大きさや数、シェーピングのためのタイル除去の頻度は、詳細パネルから制御することができます。この基本的な機能に加えて、このジェネレーターは、2つの異なる高さの部屋を作成することができ、また、RoomDataデータテーブルで宣言され整理されたユニークなタイルセットを持つ異なるテーマまたは特殊な部屋をそれぞれ作成することができます。
実行時に、ダンジョンにはドア、敵、そして各部屋の床面積を埋めるために手続き的に配置された複数のサイズの装飾設計図が配置されます。装飾の数、出現する部屋、スポーンするレアリティは、データテーブルの各タイルセットで設定できます。



Initial Setup

ダンジョンを設定するには、まずダンジョン設計図をレベルにドロップし、エディタツールのSpawnTilesをチェックします。デフォルトでは、ダンジョンは5つの部屋を生み、最後にボスルームがあります。

Editor Tools:

・Max Loops
新しいシードを探すとき、有効なシードが見つかるまで、部屋のレイアウトをループします。大きなダンジョンでは、有効なシードが見つからない可能性を減らすために、Max Loopsを増やします。
・New Seed
新しいシードを生成するには、[New Seed]ボックスをチェックします。
・Tilemap Scale
スタティックメッシュタイルセットのスケールを指定します。デフォルトのタイルは500x500のグリッドで構成されています。カスタムタイルセットを選択またはインポートする場合は、ベースグリッドのスケールを入力してください。これにより、ジェネレーターのグリッドスケールを選択する際に、モデルを適切にスケーリングすることができます。
・Grid Scale 
ダンジョンジェネレーターのグリッドのスケールです。500x500以外のグリッドを使用したい場合や、タイルセットのグリッドサイズと異なる場合は、このパラメータを調整してダンジョンを希望するグリッドにスケーリングしてください。すべてのメッシュと装飾は、この新しいグリッドにフィットするように適宜拡大縮小されます。
・Spawn Tiles
デフォルトでは、Spawn Tilesはtrueです。大きなダンジョンに変更を加える場合は、このボックスをオフにすると、変更のたびにダンジョンが再構築されるのを待つ必要がありません。

 

Map Settings

Generate on Runtime
ランタイムに生成する
この設定により、Constructでの生成が無効になり、プレイ開始時に新しいランダムシードが割り当てられ、レベルがロードされるたびに異なるダンジョンが生成されます。
・Seed
新旧のシードは、マップ設定で手動で設定することもできます。同じシードと設定を使用した場合は、常に同じダンジョンが生成されます。
・Room Size
部屋はXとYのグリッドを生成し、それぞれの辺は部屋サイズの最大値から最小値まであります。ボスルームは例外で、常にXとYのサイズが最大でスポーンされます。これらの設定を調整することで、他の部屋の基本サイズとサイズの幅をコントロールすることができます。
・Room Count
デフォルトでは、ボスルームを含む5つのルームがスポーンされます。部屋数を調整することで、ダンジョンの長さを自由に設定することができます。ダンジョンの長さが2部屋以上ある場合、ダンジョンの最後の部屋は常にボスルームになります。

Merging
マージは、すべての部屋の間を1つのグリッドスペースで区切ります。2つの部屋が1スペースの廊下でつながっている場合、代わりに1つの大きな部屋に統合されます。背の高い部屋と背の低い部屋を統合すると、背の低い部屋の床面の重なり合う壁がなくなり、隣の部屋との間に天井が降りてくる大きな張り出しができるようになります。この機能はノンリニアダンジョンに最適で、先に作られた部屋の隣に後から作られた部屋があると、それらが合体してダンジョンの大部分を横断するショートカットを作ることができます。

・Floor Culling

フロアカリングは、すべての部屋からグリッドスペースを削除し、よりユニークで多様な形状を可能にします。各部屋をカリングする際、ジェネレーターは最大と最小のフロアカリング変数の間で、ランダムな数のタイルを取り除きます。これらを調整することで、各部屋から削除されるタイルの量をコントロールすることができます、
また、チェックを外すと、長方形の部屋のみが生成されます。
・Branching
1つの部屋から複数の経路を分岐させることができます。これにより、1つのダンジョンで複数の長い脇道やループを作ることができます。チェックを外すと、ダンジョンは直線的に生成され、通路が偶然前の部屋を通り抜けるときだけ分岐することがあります。
廊下を無視する

・Ignore Corridors
ダンジョン生成時に、長い廊下の上に部屋が配置されることがあり、分岐やループが発生することがあります。コリドーを無視する "のチェックを外すと、ジェネレーターは既存のコリドーの周りに部屋を作るようになり、より直線的なダンジョンになります。ただし、既存の部屋に通路を作り、似たような構造を持つダンジョンを作ることは止めません。
・Truncate Corridors
大きなダンジョンでは、通路が重なったり、交差したりすることがあります。これをチェックすると、重なっている通路を1つに切り、同じ部屋に何度も戻ってくるのを避けることができます。
・Tall Rooms
データテーブルで許可されている場合、部屋はダンジョンに垂直性を追加する通常の部屋またはトールルームとして生成することができます。チェックを外すと、通常の部屋のみが生成されます。データテーブルのルームがトールルームのみ生成するようにマークされている場合、この設定は無視され、そのルームタイプのみが異なる方法で生成されます。例:ボスの部屋は背の高い部屋としてマークされており、背の高い部屋のチェックを外しても変化しません。

 

部屋の最大数

ダンジョン生成時に、各部屋のタイプは、指定されたタイプが最大部屋数に達するまでランダムに割り当てられます。デフォルトで追加されたルームタイプは、1つのダンジョンに1つずつ生成されます。新しい部屋を追加するときは、その部屋タイプの最大出現数を調整してください。ダンジョンの規模によっては、最大数が保証されず、特定のルームが1つも生成されないこともありますが、大規模なダンジョンでは、複数のルームが生成される可能性があり、ゲームプレイに大きな変化をもたらします。

 

・Remove Entrance Ceiling
0,0,0にある天井のタイルを取り除き、ダンジョンへの入り口を作ります。 この穴はシードに関係なく固定されているので、どのダンジョンでも一貫した入り口となります。

・Remove Entrance/Exit Walls
最初の部屋と最後の部屋の壁に、それぞれ入口と出口の穴ができます。これらの出入り口は、最初に空いている壁の中央に発生し、廊下や他の部屋を遮らないように、シードによって移動することがあります。

 

Custom Room Types

ベースとなるGeneratorには、DefaultとBossという2つのルームタイプが用意されています。デフォルトルームは、ショートとトールのバリエーションがあり、最初の部屋と、ダンジョン内のユニークなタイプを持たない他の部屋を構成しています。ボスルームは、常にダンジョンの最後の部屋としてスポーンし、デフォルトでは、大きなアリーナのスペースを確保するために、常に最大寸法の高い部屋になるように設定されています。

カスタムルームの追加
・新しいルームを追加するには、データフォルダ内のDT_RoomDataを開きます。
・画面上部の追加ボタンを選択し、新しいデータ行に作りたいルームの種類に名前を付けます。
カスタムメッシュを追加する
・カスタムメッシュの追加:各部屋の構成要素のアレイに希望のメッシュを追加します: 天井、床、壁、ドア枠、内角、外角の各部屋の構成要素の配列に希望のメッシュを追加します。
アレイに複数のメッシュを追加することで、ダンジョンやルームのバリエーションが増えます。
各部屋タイプで、部屋を正しく構築するためには、すべての部屋の構成要素が満たされている必要があります。各コンポーネントのカスタムメッシュがない場合は、デフォルトメッシュでコンポーネントスロットを埋めるだけです。

・デフォルトでは、部屋はGridScaleに等しい天井高を生成します。部屋をより高くしたい場合は、CanBeTallボックスをチェックし、トールメッシュコンポーネントに希望のメッシュを追加します: トールウォール、トールインナーコーナー、トールアウターコーナー
背の高い部屋は、通常のメッシュに背の高いメッシュを重ねたものなので、正しく生成するためにはすべてのメッシュコンポーネントを入力する必要があります。このため、背の高い壁に穴を開けることなく、背の低い部屋と背の高い部屋を統合することができます。

・洞窟ダンジョンの大きな洞窟の部屋のように、新しい部屋タイプを高さのある部屋としてのみ生成したい場合は、OnlyTallボックスをチェックします。


Adding Decorations

・各ルームタイプには3つのサイズの装飾があります: 大、中、小の3つのサイズの装飾があり、この順番で各部屋の床面積を埋め尽くします。
・装飾を追加するには、必要なサイズの配列にアイテムを1つ追加し、希望の設計図を選択します。
・ブループリントの右側にあるフロートを設定すると、その装飾がタイル上にスポーンする可能性をコントロールできます(1が100%)。
・装飾は、敵、インタラクション、障害物など、どんなブループリントでも可能です。

 

Final Setup

・すべての設定が完了したら、データテーブルを保存し、ダンジョン設計図を再コンパイルして、新しい部屋タイプに更新します。
・レベル内のダンジョンを選択し、詳細パネルのマップ設定セクションにあるルームマックスの設定を確認します。
・デフォルトで追加された各ルームタイプは、ダンジョンごとに1回生成されます。
新しいルームタイプを探し、ルームマックスの数値を調整して、そのルームがダンジョンでスポーンできる回数を増やします。

 

Decorations

Begin Playでは、ダンジョンにはすべての装飾とドアの設計図が配置されています。ドアは構築時に生成されたドーフフレームに産み落とされ、各部屋の床面は様々なサイズの装飾設計図で埋め尽くされます。

ドア 


ダンジョンにドアのデザインを追加するには、レベル内のダンジョンを選択し、詳細パネルにある装飾タブを見つけます。配列要素に新しいブループリントを追加して、希望のドアブループリントに設定します。複数のデザインのドアを追加してバリエーションを増やすことができますが、異なるタイプのドアはすべて同じようなドアフレームに収まっていないと正しくスポーンしません。

ライト:

ライトはドアと同じようにスポーンし、同じようにダンジョンに追加されます。
ダンジョンにウォールライトデザインを追加するには、DecorationsタブのWall Lightsアレイを探し、新しい希望のブループリントをアレイに追加します。ライトは壁に取り付けることを意図していますが、隣接するタイルの原点でスポーンします。壁にライトをスポーンするには、光源がブループリント内で X 方向に 250 のトランスフォームを持つ必要があります。

装飾品:
部屋には、敵のスポナーからトラップやパズルまで、あらゆる装飾のブループリントを配置することができます。ブループリントの配置は、グリッドを検索してスペースを確保し、部屋の空いているスペースを大から順に中、そして残りを小の装飾で埋めることで決定されます。
装飾はどのような設計図でも構いませんが、3つの大きさが許容されるグリッドサイズに収まるように、重なったり出入り口を塞いだりしないようにしなければなりません。

 

大型の装飾は、2x2タイルのフットプリントがあります

中型のデコレーションのフットプリントは2x1タイルです

小型の装飾のフットプリントは1x1タイルです。

ダンジョンのレイアウトは構築時に生成されますが、装飾とインタラクターはプレイ開始時にそれぞれSpawn Doors、Spawn Wall Lights、Spawn Decorationsの機能を使用してスポーンされます。

デコレーション ブループリントのスポーン時のセットアップが必要な場合や、ダンジョンのシードの恩恵を受けられる場合は、デコレーションのスポーン機能を開き、参照したいデコレーション サイズのシーケンス ブランチの末尾に移動します。各ブランチの最後には、実行用のシーケンス ノード、スポーンしたばかりのアクタへの参照、ダンジョンのシードのコピーがあります。
ここから目的のブループリントにキャストして、必要な関数を呼び出します。