ダンジョン自動生成スクリプト+プラグイン

概要

こちらは Godot のエディタ/ランタイムでダンジョンを自動生成する GDScript 群です。

特徴

  • ダンジョン全体の広さ、部屋数、部屋と通路の幅/高さの最小値/最大値を設定可能

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

  • 外装/内装用レイアウトデータを先行作成し、ダンジョンの基本的なタイリング・パターンを使って装飾やオブジェクトを配置

  • パターンごとの最小/最大出現数、出現頻度や接地方向を視覚的に設定可能

  • セルの占有設定、パターンのカバレッジ、上書き可否などをレイヤー/パターンごとに設定可能
    レイヤーを複数設定することで多層的な装飾が可能


使い方説明

設定項目は多いですが、一度サンプルプロジェクトをダウンロードしていただくとスムーズに理解していただけます。

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

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

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

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. シーンに TileMapLayerNode2D(配置スクリプト実行用) を追加し、Node2Dscripts ディレクトリの terrain_atlas_pattern_placer をアタッチします。

    • 配置先のタイルマップレイヤーと配置用 Node2D は 1:1 の関係で、必要に応じて複数追加できます。
    • レイヤー数に下限・上限はありませんが、多くの場合、外装(Terrain タイル配置)用と内装用に TileMapLayer + terrain_atlas_pattern_placer のセットが 2 組、最低限必要となります。
      (サンプルプロジェクトでは TerrainTileLayer / TerrainTilePlacerInteriorBaseLayer / InteriorBasePlacer
  2. 地形用の TileSetTileMapLayer に設定し、Terrain / Pattern を登録します。

  3. 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_orderTerrainAtlasPatternPlacer が複数ある場合の処理順
    番号が小さいほど先に処理されます。only_place_on_unoccupiedregister_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:床判定に使う 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

を切り替えたり、パターン側オーバーライドを使うことで、

  • 「ベースを壊さず上に重ねる」
  • 「一部だけ上書きする」

といった制御が可能になります。


Tips・注意点

  • タイルマップレイヤー、タイルセットのサイズは統一する必要があります。

  • ゲームオブジェクトをランダムに配置したい場合:
    タイルセットに対してシーンコレクションを追加し、オブジェクトをタイルマップに配置したのち、パターンに取り込み直して配置することが可能です。
    (サンプルプロジェクト内 GameObjectLayerInteriorBaseLayer などで該当設定を確認できます。)

各種スクリプトの詳細

room_rayout_generator.gd

使い方の概要

Node2D にアタッチして使うレイアウト専用ジェネレータです。
TileMap には一切書き込みません。

生成結果はプロパティとして保持されます。

  • grid : int 二次元配列
    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 : 外部(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_mincorridor_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_updatetrue の場合はその場で再生成します。
  • @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.gdTerrainAtlasPatternPlacer

使い方の概要

class_name TerrainAtlasPatternPlacer 付きの Node2D 用スクリプトです。

役割は
RoomLayoutGeneratorgrid を参照し、指定の TileMapLayer に Terrain または Pattern を貼ること」です。

主な前提:

  • layout_node には room_rayout_generator.gd など、grid を持ち layout_updated / generation_finishedemit するノードを参照させます。
  • 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_nodelayout_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_nodelayout_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: 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 モードか 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.gdplugin.gd / plugin.cfg

使い方の概要

plugin.cfgplugin.gd によって、
「Terrain Pattern Tools」プラグインとして Godot エディタに登録されます。

plugin.cfg の内容:

  • name="Terrain Pattern Tools"
  • description="Custom inspector for TerrainAtlasPatternPlacer (pattern weights / adjacency)."
  • script="plugin.gd"

plugin.gdEditorPlugin を継承し、_enter_tree()

  • terrain_pattern_placer_inspector.gdScript.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_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 を生成し、patternset_cell() などで貼り付け、_draw() で見た目をそのまま表示します。

辞書アクセス系ヘルパー

  • _get_dict_safe(placer, "pattern_weights") などで各 Dictionary を取得し、UI 操作時に更新して
    placer.set("pattern_weights", d) のように書き戻します。

runtime_rayout_controller.gdRuntimeLayoutKeyboardController

使い方の概要

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_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 回引いて 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 へのパスです。
「いいね!」 1