概要
これらは、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を追加し、scriptsディレクトリからterrain_atlas_pattern_placerをNode2Dにアタッチします。- 対象となる TileMap レイヤーと配置用
Node2Dは 1:1 の関係にあり、必要なペア数を追加できます。 - レイヤー数に下限や上限はありませんが、通常は少なくとも2つの
TileMapLayer+terrain_atlas_pattern_placerのペアが必要です。1つは外壁(Terrainタイルの配置用)、もう1つは内壁用です。
(サンプルプロジェクトでは、これらはTerrainTileLayer / TerrainTilePlacerおよびInteriorBaseLayer / InteriorBasePlacerです。)
- 対象となる TileMap レイヤーと配置用
-
TileMapLayerに地形TileSetを割り当て、Terrains と Patterns を登録します。- このシステムは、各 TileMapLayer に割り当てられた TileSet から Terrains とパターンを読み取ります。
TileSet は TileMapLayer 側で設定してください。 - Terrains に関する説明は以下を参照してください:
https://docs.godotengine.org/ja/4.x/tutorials/2d/using_tilesets.html#creating-terrain-sets-autotiling
- このシステムは、各 TileMapLayer に割り当てられた TileSet から Terrains とパターンを読み取ります。
-
TerrainAtlasPatternPlacerスクリプトがアタッチされたノードで、以下の項目を設定します。
TerrainAtlasPatternPlacer の主な設定
layout_node: 前のセクションで追加したroom_rayout_generatorノードへのパス。target_layer_path: この配置ノードが操作するTileMapLayerへのパス。target_kind: このレイヤーで処理するセルの種類(WALLS/FLOORS)
WALLS: 外壁 / 非歩行可能な地形(通常は Terrainタイル)
FLOORS: 内壁placement_type: Terrainでペイントするか、Patternsをスタンプするか(TERRAIN/PATTERN)。clear_before_place: 配置前にレイヤーをクリアするかどうか。register_used_cells_to_layout: 使用済みセルをレイアウトのused_cells_maskに登録するかどうか。
このオプションを有効にすると、後でより大きいexecution_orderを持つレイヤー/パターンでonly_place_on_unoccupiedを使用した場合、既に使用済みのセルの上に配置されるのを防ぐことができます。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. パターンの詳細設定(エディタ拡張インスペクタ)
TileMapLayer を TerrainAtlasPatternPlacer にリンクすると、インスペクタに TileSet 内のすべてのパターンをリストする追加パネルが追加されます。
各パターンについて、以下の項目を設定できます。
-
pattern_required_cells: 必須の接触セル
(パターンの内部で、端に触れている必要があるセル)
pattern_adjacent_dirsと組み合わせて使用されます。
サムネイル下のセルをチェックすることで設定できます。 -
pattern_weights: スポーンウェイト。 -
pattern_min_counts,pattern_max_counts: 配置数の最小/最大値(デフォルトは無制限)。 -
pattern_adjacent_dirs: 隣接方向
(上/下/左/右のうち、必須セルが隣接する必要がある方向)例:
上部の2つのセルをpattern_required_cellsに設定し、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: 床の検出に使用されるTileMapLayer。move_after_generation: 再生成後にターゲットを空きセルに移動するかどうか。zoom_camera_path: レイアウトに合わせてlimitを調整する必要があるカメラ。
ゲーム開始後、指定されたアクションキーを押すと:
- シードが変更されます。
- レイアウトが再生成されます。
- オプションでプレイヤーを移動し、カメラを調整します。
複数のレイヤーを使用した多層装飾
複数の TerrainAtlasPatternPlacer ノードが同じレイアウトノードを共有し、execution_order を使用して実行順序を制御することで、以下のような多層装飾を作成できます:
- 第1層: 外壁(基本の壁/床タイル)
- 第2層: 内壁(柱、窓、梁などのパターン)
- 第3層: オブジェクト(家具、瓦礫、装飾品)
各レイヤーで、以下を切り替えることができます:
register_used_cells_to_layoutonly_place_on_unoccupied
また、パターンごとの上書き設定を使用して、以下を行うことができます:
- 「基本を破壊せずにその上に重ねる」
- 「基本の一部のみを上書きする」
ヒントと注意事項
-
TileMap レイヤーのサイズと TileSet のサイズは統一する必要があります。
-
ゲームオブジェクトをランダムに配置したい場合:
TileSet にシーンコレクションを追加し、TileMap にオブジェクトを配置してから、配置用にパターンに焼き戻すことができます。
(これらの設定は、サンプルプロジェクトのGameObjectLayerおよびInteriorBaseLayerで確認できます。)
各スクリプトの詳細
room_rayout_generator.gd
使用概要
Node2D にアタッチされるレイアウト専用ジェネレーターです。
TileMap には書き込みません。
生成結果は以下のプロパティに保存されます:
grid:intの2次元配列
CELL_WALL = 0,CELL_FLOOR = 1,CELL_DOOR = 2rooms:Array[Rect2i](部屋の矩形)centers:Array[Vector2i](部屋の中心)room_id_grid: 各セルの部屋ID(部屋を識別する)。corridor_id_grid: 各セルの廊下ID。used_cells_mask: 外部(配置ノードから)に登録された「使用済みセル」のマスク。
レイアウト生成用のパブリックAPI
generate_now()
レイアウトを同期的に生成し、完了時にgeneration_finished(success: bool)をemitします。generate_async() -> Signal
レイアウトを非同期的に生成します。_is_generatingをチェックしてビジー状態かどうかを確認し、awaitを使用して処理を実行し、最終的に同じgeneration_finishedシグナルで結果を返します。
シグナル
layout_updated(grid, rooms, centers)
グリッドおよび部屋情報が更新された際にemitされます。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
乱数生成に使用される RNG インスタンス。seedおよび_seed_internalからシードされます。var _is_generating: bool
非同期的な生成が進行中かどうかを示すフラグ。generate_async中はtrueになり、完了時にfalseになります。var grid: Array
2次元配列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]のブール値の2次元配列で、「このセルが 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
セル単位の部屋の最小/最大幅。セッターはroom_w_min <= room_w_maxを維持します。@export var room_h_min: int = 4/room_h_max: int = 12
セル単位の部屋の最小/最大高さ。セッターによって整合性が保たれます。
廊下のパラメータ
@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
レイアウト生成用の公開シード。セッターは_seed_internalを更新し、エディタでeditor_live_updateがtrueの場合、すぐに再生成します。@export var max_retry: int = 25
部屋または廊下の生成が失敗した場合のリトライ最大回数。毎回シードを変更します。@export var async_yield_rows: int = 6
非同期的な生成では、await process_frameなどの yield(一時停止)前に処理される行数を制御します。
値が大きいほど1バッチあたりの掘削量が増えますが、メインスレッドをより長くブロックします。
ログおよびエディタ固有の設定
@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()が1回呼び出され、フラグはすぐにfalseにリセットされます。
terrain_atlas_pattern_placer.gd (TerrainAtlasPatternPlacer)
使用概要
class_name TerrainAtlasPatternPlacer を持つ Node2D スクリプトです。
その役割は:
「RoomLayoutGenerator の grid を参照し、指定された TileMapLayer に Terrain をペイントするか Patterns をスタンプすること。」
主な前提条件:
layout_nodeは、gridを持ち、layout_updated/generation_finishedをemitするroom_rayout_generator.gdなどのノードを参照します。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を使用して、パターンごとにこの動作を上書きできます。- 複数の配置ノードが同じレイアウトを共有する場合、
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 ペイントまたはパターンスタンプのモード。
レイアウト参照と対象レイヤー
@export var layout_node: NodePath
レイアウト生成ノード(RoomLayoutGeneratorなど)へのパス。
セッター_set_layout_nodeは参照を_layout_refにキャッシュします。var _layout_ref: Node
実際のレイアウトノード参照。var _grid: Array
現在のレイアウトgridの内部キャッシュ。@export var target_layer_path: NodePath
対象となるTileMapLayerへのパス。var _target_layer: TileMapLayer
実際の TileMap レイヤーへの参照。
実行制御とリンク
@export var clear_before_place: bool = true
配置前にTileMapLayer.clear()を呼び出すかどうか。@export var register_used_cells_to_layout: bool = true
配置に使用されたセルのリストをlayout_node.register_used_cells(cells)に渡すかどうか。@export var only_place_on_unoccupied: bool = false
trueの場合、レイアウト内およびTileMapLayer内の両方で空きであるセルのみが対象となります。
これはlayout.get_free_cells(kind)と TileMap セルチェックを組み合わせたものです。@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を共有する複数の配置ノード間の実行順序。
値が小さい方が先に実行されます。値が等しい場合、順序は昇順の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 モードとパターンモードのどちらを選択するか。@export var terrain_set_index: int = 0
使用する Terrain セットのインデックス。@export var terrain_index: int = 0
セット内の Terrain のインデックス。
パターン関連の設定
@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 は、これを Godot エディタの
「Terrain Pattern Tools」プラグインとして登録します。
plugin.cfg の内容:
name="Terrain Pattern Tools"description="TerrainAtlasPatternPlacer 用のカスタムインスペクタ(パターンウェイト / 隣接方向)。"script="plugin.gd"
plugin.gd は EditorPlugin を継承し、_enter_tree() 内で:
Script.new()を介してterrain_pattern_placer_inspector.gdを作成します。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 を作成し、set_cell() を使用して pattern をスタンプし、_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で指定されたノードを、空きセルの1つに移動します。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セルのピクセルサイズ。
グリッド座標をワールド座標に変換するために使用されます。@export var zoom_camera_path: NodePath
再生成後にlimit_left/right/top/bottomが調整されるCamera2D/ZoomCamera2Dへのパス。




