ランダムダンジョンジェネレーター

概要

これらは、Godotエディタおよびランタイムでダンジョンを手続的に生成するためのGDScriptのセットです。

機能

  • ダンジョン全体のサイズ、部屋の数、部屋および廊下の最小/最大幅と高さを設定できます。

  • シードに基づいたレイアウト生成。

  • システムはまず外壁と内壁のレイアウトデータを作成し、その後、ダンジョンの基本タイルパターンを使用して装飾やオブジェクトを配置します。

  • 各パターンについて、出現数の最小/最大値、スポーンウェイト、隣接方向を視覚的に設定できます。

  • 各レイヤーおよびパターンについて、セルが占有済みとして扱われるかどうか、パターンのカバレッジ、および既存のタイルを上書きする許可の有無を設定できます。
    複数のレイヤーを設定することで、多層構造の装飾を構築できます。


使用方法

設定オプションは多数ありますが、サンプルプロジェクトを一度ダウンロードすることで、ワークフローをスムーズに理解できます。

1. サンプルプロジェクトをダウンロード

  1. リポジトリから必要なファイルをダウンロードします。
    https://github.com/ggg-shirokishi/procedural-layout-tools

  2. addons および scripts ディレクトリをプロジェクトルートの直下に配置します。

2. レイアウトジェネレーターノードをシーンに追加

  1. いかなるシーンにも Node2D を追加し、scripts ディレクトリからレイアウトスクリプト room_rayout_generator をアタッチします。

  2. インスペクタで room_rayout_generator のパラメータを設定します。

    • マップサイズ: width, height
    • 部屋の数: room_count
    • 部屋のサイズ範囲: room_w_min / room_w_max, room_h_min / room_h_max
    • 廊下の幅および関連パラメータ:
      • corridor_width
      • corridor_width_min / max
      • corridor_width_randomize_each_corridor
        • corridor_width_randomize_each_corridor が有効な場合、各廊下の幅は corridor_width_min / max の間でランダムに設定されます。
    • 対角線の接続設定: connectivity_allow_diagonal
      • connectivity_allow_diagonal が有効な場合、部屋は対角線で接続できます。
    • シード: seed
  3. editor_auto_generate / editor_live_update を有効にすると、パラメータの変更がエディタに即座に反映されます。


3. TileMapLayer および TerrainAtlasPatternPlacer の設定

  1. シーンに TileMapLayer と配置スクリプトを実行するための Node2D を追加し、scripts ディレクトリから terrain_atlas_pattern_placerNode2D にアタッチします。

    • 対象となる TileMap レイヤーと配置用 Node2D は 1:1 の関係にあり、必要なペア数を追加できます。
    • レイヤー数に下限や上限はありませんが、通常は少なくとも2つの TileMapLayer + terrain_atlas_pattern_placer のペアが必要です。1つは外壁(Terrainタイルの配置用)、もう1つは内壁用です。
      (サンプルプロジェクトでは、これらは TerrainTileLayer / TerrainTilePlacer および InteriorBaseLayer / InteriorBasePlacer です。)
  2. TileMapLayer に地形 TileSet を割り当て、Terrains と Patterns を登録します。

  3. 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 を調整する必要があるカメラ。

ゲーム開始後、指定されたアクションキーを押すと:

  1. シードが変更されます。
  2. レイアウトが再生成されます。
  3. オプションでプレイヤーを移動し、カメラを調整します。

複数のレイヤーを使用した多層装飾

複数の TerrainAtlasPatternPlacer ノードが同じレイアウトノードを共有し、execution_order を使用して実行順序を制御することで、以下のような多層装飾を作成できます:

  • 第1層: 外壁(基本の壁/床タイル)
  • 第2層: 内壁(柱、窓、梁などのパターン)
  • 第3層: オブジェクト(家具、瓦礫、装飾品)

各レイヤーで、以下を切り替えることができます:

  • register_used_cells_to_layout
  • only_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 = 2
  • rooms: 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_updatetrue の場合、すぐに再生成します。
  • @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 スクリプトです。

その役割は:
RoomLayoutGeneratorgrid を参照し、指定された 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 の場合、
    TileSetTileMapPattern オブジェクトを使用してパターンをスタンプします。

その他の動作:

  • auto_update_on_layout_signaltrue の場合、ノードは 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: bool
  • var _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.gdEditorPlugin を継承し、_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_weights
  • pattern_adjacent_dirs
  • pattern_required_cells
  • pattern_min_counts
  • pattern_max_counts
  • pattern_register_used_cells_override
  • pattern_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_generationtrue の場合、レイアウト更新後に _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つの値を描画して minmax を決定します。
  • @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 へのパス。
「いいね!」 2