概要
こちらは Godot のエディタ/ランタイムでダンジョンを自動生成する GDScript 群です。
特徴
-
ダンジョン全体の広さ、部屋数、部屋と通路の幅/高さの最小値/最大値を設定可能
-
シードに基づいたレイアウト生成
-
外装/内装用レイアウトデータを先行作成し、ダンジョンの基本的なタイリング・パターンを使って装飾やオブジェクトを配置
-
パターンごとの最小/最大出現数、出現頻度や接地方向を視覚的に設定可能
-
セルの占有設定、パターンのカバレッジ、上書き可否などをレイヤー/パターンごとに設定可能
レイヤーを複数設定することで多層的な装飾が可能
使い方説明
設定項目は多いですが、一度サンプルプロジェクトをダウンロードしていただくとスムーズに理解していただけます。
1. サンプルプロジェクトのダウンロード
-
リポジトリから必要ファイル一式をダウンロードします。
https://github.com/ggg-shirokishi/procedural-layout-tools -
プロジェクトのルート直下に
addons、scriptsディレクトリを配置します。
2. レイアウトジェネレータノードをシーンに追加
-
任意のシーンに
Node2Dを追加し、scripts配下のレイアウト用スクリプトroom_rayout_generatorをアタッチします。 -
インスペクタで
room_rayout_generatorの各種パラメータを設定します。- マップ全体サイズ:
width,height - 部屋数:
room_count - 部屋サイズ範囲:
room_w_min / room_w_max,room_h_min / room_h_max - 通路幅・通路幅パラメータ:
corridor_widthcorridor_width_min / maxcorridor_width_randomize_each_corridorcorridor_width_randomize_each_corridorをオンにすると、通路の幅がcorridor_width_min / maxの間でランダムになります。
- 斜め通路の許可設定:
connectivity_allow_diagonalconnectivity_allow_diagonalをオンにすると、部屋が斜めにも接続されるようになります。
- シード:
seed
- マップ全体サイズ:
-
editor_auto_generate/editor_live_updateを有効にすると、エディタ上で各種パラメータの変更が即時反映されます。
3. TileMapLayer と TerrainAtlasPatternPlacer の設定
-
シーンに
TileMapLayerとNode2D(配置スクリプト実行用) を追加し、Node2Dにscriptsディレクトリのterrain_atlas_pattern_placerをアタッチします。- 配置先のタイルマップレイヤーと配置用
Node2Dは 1:1 の関係で、必要に応じて複数追加できます。 - レイヤー数に下限・上限はありませんが、多くの場合、外装(Terrain タイル配置)用と内装用に
TileMapLayer+terrain_atlas_pattern_placerのセットが 2 組、最低限必要となります。
(サンプルプロジェクトではTerrainTileLayer / TerrainTilePlacerとInteriorBaseLayer / InteriorBasePlacer)
- 配置先のタイルマップレイヤーと配置用
-
地形用の
TileSetをTileMapLayerに設定し、Terrain / Pattern を登録します。- 本システムはタイルマップレイヤーのタイルセットから Terrain/パターンを読み込みます。
タイルマップレイヤー側でタイルセットのセットアップを行ってください。 - Terrain の解説は以下を参照してください。
https://docs.godotengine.org/ja/4.x/tutorials/2d/using_tilesets.html#creating-terrain-sets-autotiling
- 本システムはタイルマップレイヤーのタイルセットから Terrain/パターンを読み込みます。
-
TerrainAtlasPatternPlacerスクリプトをアタッチしたノードで、以下の項目を設定します。
TerrainAtlasPatternPlacer の主な設定
layout_node:先ほどのセクションで追加したroom_rayout_generatorノードへのパスtarget_layer_path:この Placer が操作するTileMapLayerへのパスtarget_kind:このレイヤーで扱うセル種別(WALLS/FLOORS)
※WALLS:外装/侵入できない地形(多くの場合 Terrain を配置)
FLOORS:内装placement_type:Terrain で塗るか Pattern で貼るか(TERRAIN/PATTERN)clear_before_place:再配置のたびにレイヤーをクリアするかregister_used_cells_to_layout:使用したセルをレイアウト側のused_cells_maskに登録するか
※このオプションを On にすると、後述のonly_place_on_unoccupiedが On かつexecution_orderが大きいレイヤー/パターンによる重ね貼りを防げます。only_place_on_unoccupied:未使用セルのみに限定するかauto_update_on_layout_signal:レイアウト更新シグナルを受けたら自動で貼り直すかpattern_coverage_ratio:パターン全体の貼り付け密度execution_order:TerrainAtlasPatternPlacerが複数ある場合の処理順
番号が小さいほど先に処理されます。only_place_on_unoccupied、register_used_cells_to_layoutと組み合わせて重ね貼りの制御に使用します。
4. パターンの詳細設定(エディタ拡張インスペクタ)
TerrainAtlasPatternPlacer にタイルマップレイヤーを紐づけると、タイルセット内のパターン一覧パネルがインスペクタに追加されます。
各パターンごとに次の項目を設定できます。
-
pattern_required_cells:必須接地セル
(パターン内部で「必ず縁に触れていてほしいセル」)
後述のpattern_adjacent_dirsと組み合わせて設定します。
※サムネイル下のセルをチェックすることで設定できます。 -
pattern_weights:出現頻度 -
pattern_min_counts,pattern_max_counts:最小/最大出現数(デフォルトでは無制限) -
pattern_adjacent_dirs:接地方向
(上下左右のどの方向に接しているセルを要求するか)例:
pattern_required_cellsを上 2 セル、pattern_adjacent_dirsを「上」に設定すると、上 2 セルが確実に接するような地形にのみ配置されるようになります。 -
pattern_register_used_cells_override:セル占有登録オーバーライド
セルを占有するかどうかをパターンごとに設定できます。- グローバル設定継承(
TerrainAtlasPatternPlacerの設定そのまま) - 強制オン
- 強制オフ
- グローバル設定継承(
-
pattern_only_place_on_unoccupied_override:未使用セルのみ配置オーバーライド- グローバル設定継承(
TerrainAtlasPatternPlacerの設定そのまま) - 強制オン
- 強制オフ
- グローバル設定継承(
だいたいこのあたりを設定したあとに run_on_editor_button を押すと、レイアウトが生成されます。
ランタイムでの再生成設定(任意)
- 実行中にキー入力でダンジョンを作り直したい場合は、
RuntimeLayoutKeyboardController相当のスクリプトをNodeにアタッチします。
主な設定
layout_node_path:レイアウトジェネレータノードinput_action_name:再生成に使う InputMap アクション名(例:regen_dungeonなど)randomize_layout_size/randomize_room_count/randomize_room_size/randomize_corridor_width:各種パラメータを実行ごとにランダム化するかmove_target_node_path:再生成後に移動させるプレイヤーなどのノードmove_target_tilemap_layer_path:床判定に使うTileMapLayermove_after_generation:再生成後にターゲットを空きセルへ移動させるかzoom_camera_path:レイアウトに合わせてlimitを調整したいカメラ
ゲーム開始後に指定アクションキーを押すと、
- シード変更
- レイアウト再生成
- 必要に応じてプレイヤー移動・カメラ調整
まで自動で行われます。
複数レイヤーによる多層装飾
同じレイアウトノードを複数の TerrainAtlasPatternPlacer で共有し、execution_order を使って処理順を制御することで、例えば次のような多層装飾が可能です。
- 1 枚目:外装(壁・床のベースタイル)
- 2 枚目:内装(柱、窓、梁などのパターン)
- 3 枚目:オブジェクト(家具・瓦礫・装飾物)
レイヤーごとに
register_used_cells_to_layoutonly_place_on_unoccupied
を切り替えたり、パターン側オーバーライドを使うことで、
- 「ベースを壊さず上に重ねる」
- 「一部だけ上書きする」
といった制御が可能になります。
Tips・注意点
-
タイルマップレイヤー、タイルセットのサイズは統一する必要があります。
-
ゲームオブジェクトをランダムに配置したい場合:
タイルセットに対してシーンコレクションを追加し、オブジェクトをタイルマップに配置したのち、パターンに取り込み直して配置することが可能です。
(サンプルプロジェクト内GameObjectLayerやInteriorBaseLayerなどで該当設定を確認できます。)
各種スクリプトの詳細
room_rayout_generator.gd
使い方の概要
Node2D にアタッチして使うレイアウト専用ジェネレータです。
TileMap には一切書き込みません。
生成結果はプロパティとして保持されます。
grid:int二次元配列
CELL_WALL = 0,CELL_FLOOR = 1,CELL_DOOR = 2rooms:Array[Rect2i](部屋矩形)centers:Array[Vector2i](部屋中心)room_id_grid: 各セルの部屋 ID(部屋ごとの識別)corridor_id_grid: 各セルの通路 IDused_cells_mask: 外部(Placer)から登録された「使用済みセル」のマスク
レイアウト生成の外部 API
generate_now()
同期でレイアウト生成を行い、終了後にgeneration_finished(success: bool)をemitします。generate_async() -> Signal
非同期で生成します。内部で_is_generatingを見て busy チェックを行い、await付きの処理を実行し、最終的には同じgeneration_finishedシグナルで結果を返します。
シグナル
layout_updated(grid, rooms, centers)
グリッドと部屋情報が更新されたときに発火します。generation_finished(success)
全体の生成が成功したかどうかを通知します。
TerrainAtlasPatternPlacer などが、生成された grid を参照し、さらに
register_used_cells() / get_free_cells() を通じて
「レイアウト上の空きセル/使用済みセル」を共有します。
エディタ上では、editor_auto_generate / editor_live_update / editor_generate_button によって、
- シーンロード時の自動生成
- インスペクタでパラメータを変更したときの自動再生成
を制御できます。
主な変数・プロパティ
出力・状態
signal layout_updated(grid: Array, rooms: Array, centers: Array)
現在のレイアウト情報を外部に通知するシグナルです。signal generation_finished(success: bool)
生成が完了したときに、成功/失敗を通知します。const CELL_WALL: int = 0
グリッド内で「壁」を表す値です。const CELL_FLOOR: int = 1
グリッド内で「床」を表す値です。const CELL_DOOR: int = 2
グリッド内で「ドア予定セル」を表す値です。var rng: RandomNumberGenerator
乱数生成用インスタンス。seedと_seed_internalからシードされます。var _is_generating: bool
非同期生成中かどうかのフラグです。generate_async中にtrueになり、完了時にfalseになります。var grid: Array
grid[y][x]の二次元配列。値は上記CELL_*のいずれかです。var rooms: Array[Rect2i]
生成に成功した部屋矩形の配列です。var centers: Array[Vector2i]
各部屋の中心セル座標の配列です。var room_id_grid: Array
room_id_grid[y][x]に、そのセルがどの部屋 ID に属するかを保持します(部屋でない場合は-1など)。var corridor_id_grid: Array
corridor_id_grid[y][x]に通路の ID を保持します(通路でない場合は-1などです)。var _next_corridor_id: int
通路 ID の採番に使う内部カウンタです。var used_cells_mask: Array
used_cells_mask[y][x] = boolな二次元配列で、「TilePlacer 側から登録された使用済みセルかどうか」を表します。
register_used_cells(cells: Array[Vector2i])でtrueにされます。
get_free_cells(kind: int)でfalseのセルだけを「空きセル」として返します。
マップサイズ・部屋パラメータ
@export var width: int = 80
レイアウトの横幅(セル数)。_set_width()で 8 未満の値を防ぎ、エディタ時は変更時に再生成します。@export var height: int = 60
レイアウトの縦幅(セル数)。_set_height()で 8 未満にならないよう調整されます。@export var cell_padding: int = 1
外周からのマージン。外枠からこのセル数分は部屋を置かないようにします。@export var room_count: int = 18
生成を試みる部屋の目標個数です。実際の生成数は衝突などによりこれより少なくなる場合があります。@export var room_w_min: int = 5/room_w_max: int = 14
部屋の幅(セル数)の最小値/最大値です。setter によりroom_w_min <= room_w_maxが保たれます。@export var room_h_min: int = 4/room_h_max: int = 12
部屋の高さ(セル数)の最小値/最大値です。こちらも setter で一貫性を保ちます。
通路パラメータ
@export var corridor_width: int = 1
通路幅の基本値です。ランダム幅を使わない場合に、この固定幅が使われます。@export var corridor_width_min: int = 0
ランダム通路幅の最小値です。@export var corridor_width_max: int = 1
ランダム通路幅の最大値です。@export var corridor_width_randomize_each_corridor: bool = true
trueのとき、通路ごと(セグメントごと)に
corridor_width_min〜corridor_width_maxの範囲から個別に幅をランダム決定します。@export var corridor_use_diagonal_path: bool = false
trueのとき、部屋中心同士を結ぶ通路掘りで斜めパスを許可します(斜めにジグザグ移動する経路になります)。@export var connectivity_allow_diagonal: bool = false
trueのとき、連結性チェック(全ての部屋がつながっているか確認)で斜め(8 方向)も「つながっている」とみなします。
乱数・リトライ・非同期
var _seed_internal: int = 123456
実際に RNG に渡す内部シードです。@export var seed: int = 123456
レイアウト生成用の公開シードです。setter で_seed_internalを更新し、エディタでeditor_live_updateがtrueの場合はその場で再生成します。@export var max_retry: int = 25
部屋の生成や通路の接続に失敗した場合に、シードを変えながらやり直す最大試行回数です。@export var async_yield_rows: int = 6
非同期生成時に、何行ごとにawait process_frameなどで処理を分割するかを表します。
大きいほど一度に多く掘りますが、メインスレッドを長くブロックします。
ログ・エディタ用
@export var log_enabled: bool = true
trueのとき、_log()を通じてログ出力を行います。@export var log_verbosity: int = 1
ログの詳細度です。値が大きいほど細かくログを出します。@export var editor_auto_generate: bool = true
シーンロード時などに、自動でレイアウトを生成するフラグです。@export var editor_live_update: bool = true
エディタ上でパラメータを変更したときに、その場で自動再生成するかどうかです。@export var editor_generate_button: bool = false
インスペクタ上の「一度だけ生成」トリガー用フラグです。
trueにセットされた瞬間だけ_generate_editor_safe()が呼ばれ、すぐにfalseに戻されます。
terrain_atlas_pattern_placer.gd(TerrainAtlasPatternPlacer)
使い方の概要
class_name TerrainAtlasPatternPlacer 付きの Node2D 用スクリプトです。
役割は
「RoomLayoutGenerator の grid を参照し、指定の TileMapLayer に Terrain または Pattern を貼ること」です。
主な前提:
layout_nodeにはroom_rayout_generator.gdなど、gridを持ちlayout_updated/generation_finishedをemitするノードを参照させます。target_layer_pathには、貼り付け対象のTileMapLayerを指定します。
貼り付け対象セル種別:
target_kind = WALLSのときCELL_WALLセルtarget_kind = FLOORSのときCELL_FLOOR + CELL_DOORセル
貼り付け方法:
placement_type = TERRAINのとき
set_cells_terrain_connect()を使って Terrain を塗ります。placement_type = PATTERNのとき
TileSetのTileMapPatternを使って貼り付けます。
その他の挙動:
auto_update_on_layout_signalがtrueの場合、layout_nodeのlayout_updated/generation_finishedを受けて自動的に再配置します。register_used_cells_to_layoutにより、配置で使用したセルをlayout_node.register_used_cells(cells)へ登録し、used_cells_maskに反映させるかどうかを決めます。only_place_on_unoccupiedにより、「レイアウト上も TileMapLayer 上も未使用のセルのみ」に制限できます。
さらにpattern_*_overrideでパターンごとにこの動作を上書きできます。- 複数の Placer が同じレイアウトを共有する場合、
execution_orderによって実行順序を制御できます(小さい値から順に実行されます)。
シグナル
signal placement_finished(success: bool)
配置処理が完了したときにemitされます。
主な変数・プロパティ
基本・種別
signal placement_finished(success: bool)
配置が完了したかどうかを通知します。const CELL_WALL: int = 0/CELL_FLOOR: int = 1/CELL_DOOR: int = 2
レイアウトグリッドの値定義です。RoomLayoutGenerator側と対応しています。enum TargetKind { WALLS, FLOORS }
どのセル種別を対象にするかを指定します。enum PlacementType { TERRAIN, PATTERN }
Terrain 塗りか Pattern 貼りかのモードです。
レイアウト参照・対象レイヤ
@export var layout_node: NodePath
レイアウト生成ノード(RoomLayoutGeneratorなど)へのパスです。
setter_set_layout_nodeにより、内部で_layout_refにキャッシュされます。var _layout_ref: Node
実際のレイアウトノード参照です。var _grid: Array
現在使用中のレイアウトgridをキャッシュするための内部配列です。@export var target_layer_path: NodePath
配置対象のTileMapLayerへのパスです。var _target_layer: TileMapLayer
実際のタイル配置先レイヤへの参照です。
実行制御・連動
@export var clear_before_place: bool = true
trueのとき、貼り付け開始前にTileMapLayer.clear()を実行します。@export var register_used_cells_to_layout: bool = true
trueのとき、配置で使用したセル一覧をlayout_node.register_used_cells(cells)に渡します。@export var only_place_on_unoccupied: bool = false
trueのとき、「レイアウト上で未使用かつ TileMapLayer 上も空のセル」のみを配置対象にします。
レイアウト側のget_free_cells(kind)と TileMapLayer のセルチェックを組み合わせて判定します。@export var run_on_editor_button: bool = false
エディタ上のボタントリガー用フラグです。trueにセットされた瞬間に_set_run_on_editor_button()が呼ばれ、layout.generate_now()の実行- その後の
place_now()相当の処理
をまとめて行い、完了後にフラグはfalseに戻ります。
@export var auto_update_on_layout_signal: bool = true
trueのとき、layout_nodeのlayout_updated/generation_finishedシグナルと自動連動します。@export var auto_update_in_editor_only: bool = true
trueのとき、エディタ実行時だけ自動更新し、ゲーム実行中は自動更新を行いません。@export var auto_update_debounce_frames: int = 1
自動更新時に、バッチ更新までどれだけフレームを貯めるかです。
0の場合でも、最低 1 フレームは待つようになっています。@export var log_enabled: bool = true
ログ出力を行うかどうかです。@export var log_verbosity: int = 1
ログの詳細度です。@export var execution_order: int = 0
同じlayout_nodeを参照する複数の Placer 間での実行順序を指定します。
値が小さいものから順に実行され、同じ値の場合はinstance_id昇順になります。var _pending_auto_update_local: boolvar _last_used_cells: Array[Vector2i]var _last_pattern_force_register: bool
バッチ更新の保留状態と、直近の配置情報を保持する内部用変数です。
貼り付けモード・Terrain
@export var target_kind: TargetKind = TargetKind.WALLS
レイアウト上でどのセル種別を対象にするかを指定します(壁か床)。@export var placement_type: PlacementType = PlacementType.TERRAIN
Terrain モードか Pattern モードかを選びます。@export var terrain_set_index: int = 0
使用する Terrain セットのインデックスです。@export var terrain_index: int = 0
上記セット内で使用する Terrain のインデックスです。
Pattern 関連設定
@export var pattern_indices: PackedInt32Array = PackedInt32Array()
使用するTileMapPatternのインデックス一覧です。空の場合は利用可能な全パターンを対象とします。@export var pattern_avoid_overlap: bool = true
trueのとき、パターン同士が互いに重ならないように配置します。@export var pattern_coverage_ratio: float = 0.1
対象セル全体に対して、どの程度の割合をパターンで覆うことを目標にするか(0.0〜1.0)です。@export var pattern_weights: Dictionary = {}
パターンごとの出現重みです。- キー:
pattern_index - 値:
float(重み)
- キー:
@export var pattern_adjacent_dirs: Dictionary = {}
パターンごとの接地方向ビットマスクです。- キー:
pattern_index - 値:
intビットマスク- ビット値:
1 = U(上),2 = R,4 = D,8 = L
- ビット値:
- キー:
@export var pattern_required_cells: Dictionary = {}
パターンごとの「必須接地セル」定義です。- キー:
pattern_index - 値:
Array[Vector2i](パターン内部セル座標の配列)
- キー:
@export var pattern_min_counts: Dictionary = {}
パターンごとの最低配置回数です。@export var pattern_max_counts: Dictionary = {}
パターンごとの最大配置回数です。-1または未設定の場合は「上限なし」です。@export var pattern_register_used_cells_override: Dictionary = {}
register_used_cells_to_layoutのパターン別オーバーライドです。- 値:
0 = Inherit(グローバル設定を継承) - 値:
1 = Force On(必ず使用セルとして登録) - 値:
2 = Force Off(必ず使用セル登録から除外)
- 値:
@export var pattern_only_place_on_unoccupied_override: Dictionary = {}
only_place_on_unoccupiedのパターン別オーバーライドです。- 値:
0 = Inherit(グローバル設定を継承) - 値:
1 = Force On(このパターンだけ「未使用セルのみ」に貼る) - 値:
2 = Force Off(このパターンだけ既使用セルにも貼る)
- 値:
terrain_pattern_placer_inspector.gd + plugin.gd / plugin.cfg
使い方の概要
plugin.cfg と plugin.gd によって、
「Terrain Pattern Tools」プラグインとして Godot エディタに登録されます。
plugin.cfg の内容:
name="Terrain Pattern Tools"description="Custom inspector for TerrainAtlasPatternPlacer (pattern weights / adjacency)."script="plugin.gd"
plugin.gd は EditorPlugin を継承し、_enter_tree() で
terrain_pattern_placer_inspector.gdをScript.new()してadd_inspector_plugin(_insp)でインスペクタ拡張を登録します。
_exit_tree() では逆に remove_inspector_plugin(_insp) します。
プロジェクト設定からこのプラグインを有効化すると、
TerrainAtlasPatternPlacer をアタッチしたノードを選択したときに、
- 標準のインスペクタに加えて、パターンごとの設定 UI が追加されます。
追加される UI で編集できる内容
各 TileMapPattern ごとに:
- そのままのタイル見た目のサムネイル
- パターン内部のセル配置をマス目で表示したグリッドサムネイル
- 出現重み(
SpinBox) - 接地方向(
U/R/D/Lのチェックボックス) - 必須接地セル(パターン内のセルをクリックでトグルするボタン群)
- 最低設置数(
Min) - 最大設置数(
Max、-1で無制限) register_used_cells_to_layoutのパターン別オーバーライド(Reg)only_place_on_unoccupiedのパターン別オーバーライド(Unocc)
これらはすべて TerrainAtlasPatternPlacer 側の次のプロパティを直接書き換えます。
pattern_weightspattern_adjacent_dirspattern_required_cellspattern_min_countspattern_max_countspattern_register_used_cells_overridepattern_only_place_on_unoccupied_override
class PatternPreviewControl extends Control
パターンのプレビュー描画専用の Control クラスです。
var tileset: TileSet
プレビューに使用するTileSet。var pattern: TileMapPattern
プレビュー対象のパターン。var preview_size: Vector2
スクロールビュー内部での表示サイズ。
内部で TileMapLayer を生成し、pattern を set_cell() などで貼り付け、_draw() で見た目をそのまま表示します。
辞書アクセス系ヘルパー
_get_dict_safe(placer, "pattern_weights")などで各Dictionaryを取得し、UI 操作時に更新して
placer.set("pattern_weights", d)のように書き戻します。
runtime_rayout_controller.gd(RuntimeLayoutKeyboardController)
使い方の概要
Node にアタッチするランタイム用コントローラです。
役割:
- 指定された入力アクションが押されたときに、
- レイアウトノードの
seedをランダムに更新し、 - (オプションで)レイアウトパラメータ(幅・高さ・部屋数・部屋サイズ・通路幅)をランダム化し、
layout_node側のgenerate_now()をトリガーしてレイアウト再生成を行います。
- レイアウトノードの
- 再生成後に、以下を行うことができます。
move_target_node_pathで指定したノードを「空きセル」のいずれかへ移動。zoom_camera_pathで指定したカメラのlimit_*をレイアウトの外枠に合わせて自動調整。
前提
layout_node_pathには、room_rayout_generator.gdを付けたNode2Dを指定します。
入力監視
_process()内でInput.is_action_just_pressed(input_action_name)を監視し、
アクションが押されたら_regenerate_with_random_seed()を呼びます。
移動・カメラ
move_after_generationがtrueの場合、レイアウト更新後に_move_target_to_free_cell()で移動を行います。zoom_camera_pathが設定されていれば、_update_camera_limits()で
limit_left/right/top/bottomを再計算します。
主な変数・プロパティ
基本設定
const CELL_WALL: int = 0/const CELL_FLOOR: int = 1
レイアウトグリッドの値定義です(RoomLayoutGeneratorと同じ)。enum MoveTargetKind { MOVE_ON_FLOORS, MOVE_NEAR_WALLS }
移動先セルの選び方を表す列挙です。MOVE_ON_FLOORS: 床セル上に移動。MOVE_NEAR_WALLS: 壁の近くの床セルなどを優先するロジックで候補を選びます。
@export var layout_node_path: NodePath
レイアウトノード(RoomLayoutGenerator)のパスです。@export var input_action_name: String = "dungeon_regen"
レイアウト再生成のトリガーに使うInputMapアクション名です。@export var log_enabled: bool = true
trueのとき、内部処理のログをprint()/push_warning()等で出します。var layout_node: Node = null
実際のレイアウトノード参照です。_ready()でlayout_node_pathから取得されます。var _rng: RandomNumberGenerator = RandomNumberGenerator.new()
レイアウト再生成ごとのランダム化に用いる RNG です。
レイアウトパラメータのランダム化
@export var randomize_layout_size: bool = false
trueのとき、再生成ごとにレイアウトの幅と高さをランダムに変更します。@export var layout_width_range: Vector2i = Vector2i(80, 80)
widthのランダム範囲です。(x = min,y = max)@export var layout_height_range: Vector2i = Vector2i(60, 60)
heightのランダム範囲です。@export var randomize_room_count: bool = false
trueのとき、再生成ごとにroom_countをランダムに変更します。@export var room_count_range: Vector2i = Vector2i(18, 18)
room_countのランダム範囲です。@export var randomize_room_size: bool = false
trueのとき、再生成ごとに部屋サイズの範囲をランダムに変更します。@export var room_width_range: Vector2i = Vector2i(5, 14)
部屋幅のランダム元範囲です。内部で 2 回引いてmin/maxを決める実装になっています。@export var room_height_range: Vector2i = Vector2i(4, 12)
部屋高さのランダム元範囲です。@export var randomize_corridor_width: bool = false
trueのとき、再生成ごとに通路幅をランダムに変更します。@export var corridor_width_range: Vector2i = Vector2i(0, 3)
通路幅のランダム元範囲です。ここから 2 値を引いてmin/maxにしたり、固定幅を選ぶために使います。
移動対象・カメラ関連
@export var move_target_node_path: NodePath
レイアウト更新後に移動させる対象ノードのパスです(プレイヤーキャラなど)。@export var move_target_tilemap_layer_path: NodePath
レイアウトに対応するTileMapLayerのパスです。
ここから、どのセルが床か壁かを判断して、移動先候補セルを取得します。@export var move_target_kind: MoveTargetKind = MoveTargetKind.MOVE_ON_FLOORS
上記の列挙で、移動先セルの選び方を指定します。@export var move_after_generation: bool = true
trueのとき、レイアウト再生成後に_move_target_to_free_cell()を実行します。@export var cell_size: Vector2 = Vector2(16.0, 16.0)
レイアウトグリッド 1 セルのピクセルサイズです。
grid上の座標からワールド座標を求めるときに使用します。@export var zoom_camera_path: NodePath
再生成後にlimit_left/right/top/bottomを自動調整する
Camera2D/ZoomCamera2Dへのパスです。




