mcpField
G
godot-procedural-generation

godot-procedural-generation

github.com/thedivergentai開発907491 回インストール2 週間前に更新
リポジトリ

godot-procedural-generation について

godot-procedural-generation は、マップ、地形、オブジェクト配置を生成する Godot 開発者向けスキルです。アルゴリズム別のスクリプトに加え、シードによる再現性、バックグラウンドでのチャンク計算、メインスレッドでのシーン更新を扱います。

主な機能

  1. 01状態履歴付きシード乱数生成
  2. 02バックグラウンドでのチャンク生成
  3. 03ダンジョンレイアウトアルゴリズム
  4. 04ノイズ地形とハイトマップ
  5. 05ポアソンディスクによる配置
  6. 062D・3Dメッシュ生成

活用シーン

  1. 01再現可能なダンジョン配置の生成
  2. 02チャンク式オープンワールド地形の構築
  3. 03オブジェクトの密集を避けた配置
  4. 04植物や輪郭のプロシージャル生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/thedivergentai/game-dev-agentic-skills --skill godot-procedural-generation

インストール後、Claude Code で/godot-procedural-generationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
algorithm-recipes.md
migration-notes.md
scripts/
bsp_tree_rooms.gd
cellular_automata_dungeon.gd
drunknard_walk_path.gd
dungeon_generator.gd
fast_noise_noise2d_master.gd
l_system_tree_gen.gd
marching_squares_metaballs.gd
mesh_gen_infinite_terrain.gd
multi_threaded_chunk_gen.gd
poisson_disk_sampling_2d.gd
proc_gen_graph_layout.gd
proc_gen_marching_cubes_base.gd
proc_gen_seed_history.gd
wave_function_collapse_lite.gd
wfc_level_generator.gd

詳細

プロシージャル生成

シード付きアルゴリズム、ノイズ関数、制約伝播によって、再現可能なコンテンツ生成を実現します。アルゴリズムのチュートリアルを本文に貼り付けないでください — 以下の必須スクリプトを読み込んでください。

プロシージャル生成で絶対にしてはいけないこと

  • メインスレッドでチャンクを生成しないでください — プロシージャル生成は CPU 負荷が高く、フレームレートの急激な低下を引き起こします。UI の応答性を維持するため、WorkerThreadPool またはバックグラウンドの Thread を使用してください。
  • FastNoiseLite を毎フレーム呼び出さないでください — 毎フレーム(特に _process 内)でノイズをサンプリングするのは、非常に無駄です。マップを Image または Array に一度だけ生成し、メモリからサンプリングしてください [NoiseSampling]。
  • 再現可能なシードに randi() を使わないでください — 一貫したワールド生成を実現するため、乱数生成器(RandomNumberGenerator.new())内の特定の seed を必ず保存して再利用してください。
  • オブジェクトの配置に純粋な乱数を使わないでください — 純粋なランダム(ホワイトノイズ)では、密集や重なりが発生します。自然な分布を実現するには、ポアソンディスクサンプリングまたはジッターグリッドを使用してください。
  • ループの上限設定を忘れないでください — プロシージャル生成のループ(WFC やセルオートマトンなど)は、制約を満たせない場合に無限状態に陥りやすいです。必ず max_iterations による安全な中断処理を含めてください。
  • プロシージャル生成スレッドからノードを直接インスタンス化しないでください — ワーカースレッドから SceneTree にアクセスすることはできません。スレッド内で データ を生成し、メインスレッドに通知して add_child() を処理させてください。
  • 単純なレイアウトに複雑な WFC を使わないでください — Wave Function Collapse は強力ですが、単純な経路には過剰です。軽量で構造的なレイアウトには、ドランカードウォークまたはBSPを使用してください。
  • 大規模な更新に TileMap.set_cell() を使用しないでください — 10,000 個のセルを個別に更新するのは遅くなります。TileMapPattern を準備し、set_pattern() または set_cells_terrain_connect() を使用して一括更新してください。
  • 最後に Navigation をベイクするのを忘れないでください — プロシージャル生成されたワールドでは、実行時にナビメッシュを再ベイクする必要があります。そうしないと、AI が壁に向かって歩いてしまいます。
  • データのシリアライズを無視しないでください — ワールドを生成する場合は、シード と プレイヤーによる変更 を保存できなければなりません。可能であれば、チャンクの生の状態を丸ごと保存するのは避けてください。

ゴールデンパス(必須)

すべてのジェネレーターはここから始めます — シードの分離、非同期データ、メインスレッドでの確定:

  1. シードと RNG — 必須 proc_gen_seed_history.gd:レベルまたはチャンクごとに RandomNumberGenerator を 1 つ使用します。共有可能な実行のために、seed と state を永続化します。
  2. 非同期チャンク — 必須 multi_threaded_chunk_gen.gd:WorkerThreadPool.add_task → スレッド外でデータを計算 → SceneTree/ノードの処理には call_deferred("_finalize_chunk") を使用します。
  3. 検証 → ナビゲーションのベイク — タイル/メッシュをメインスレッドに反映した後、NavigationRegion を再ベイクします(godot-navigation-pathfinding を参照)。
var rng := RandomNumberGenerator.new()

func begin_generation(run_seed: int) -> void:
    rng.seed = run_seed
    WorkerThreadPool.add_task(_build_data.bind(run_seed))

func _build_data(seed: int) -> Dictionary:
    var local_rng := RandomNumberGenerator.new()
    local_rng.seed = seed
    var noise := FastNoiseLite.new()
    noise.seed = seed
    return {"heights": noise.get_image(64, 64)}

func _ready() -> void:
    # Worker returns here — safe for nodes
    pass

func _finalize_from_worker(data: Dictionary) -> void:
    # add_child / set_pattern / create_trimesh_collision — main thread only
    pass

読み込まないでください scripts/ フォルダー全体を読み込まないでください。以下のアルゴリズムの行に一致するスクリプトだけを開いてください。

アルゴリズム選択ツリー

レイアウト/コンテンツの要件アルゴリズムスクリプト(選択した場合は必須)
曲がりくねったトンネル、川、シンプルな道ドランカードウォーク必須 drunknard_walk_path.gd
構造化された部屋と通路BSP必須 bsp_tree_rooms.gd
自然な洞窟/滑らかな地形セルオートマトン(4/5)必須 cellular_automata_dungeon.gd
ハイトマップ、バイオーム、無限地形FastNoiseLite → Image必須 fast_noise_noise2d_master.gd
木、岩、スポーン(密集なし)ポアソンディスク必須 poisson_disk_sampling_2d.gd
タイルの隣接関係/街区波動関数崩壊必須 wave_function_collapse_lite.gd(lite)または wfc_level_generator.gd(完全なルール)
ジオメトリ生成前の部屋グラフAStar グラフレイアウト必須 proc_gen_graph_layout.gd
3D ボクセル/滑らかな地形メッシュマーチングキューブの基礎実装必須 proc_gen_marching_cubes_base.gd
無限のチャンク分割 3D 地形ArrayMesh + LOD チャンク必須 mesh_gen_infinite_terrain.gd
植物/分岐構造L システム必須 l_system_tree_gen.gd
等高線/メタボールマップ(2D)マーチングスクエア必須 marching_squares_metaballs.gd

選択のヒント: シンプルな道 → ドランカードウォーク、長方形の部屋 → BSP、制約付きタイル → WFC lite、オープンワールドのチャンク → ノイズ + multi_threaded_chunk_gen.gd。ローグライクのランのオーケストレーションについては、godot-genre-roguelike に引き継いでください。

利用可能なスクリプト

コア(常にここから開始)
2D レイアウトと配置
ノイズと 3D

エキスパート向け手続き型パターン

1. ArrayMesh による 3D 地形(マーチングキューブ法)

ボクセル風または滑らかな有機的地形には、ArrayMesh を使用してコードからジオメトリを生成します。

  • ロジック:ワーカースレッドで頂点、法線、インデックスを計算します。
  • 確定:add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) を使用してメッシュを作成します。
  • パフォーマンス:物理演算の更新を高速に保つため、現在のチャンクに対してのみ create_trimesh_collision() を使用します。
2. グラフベースのダンジョンロジック

まずダンジョンのジオメトリを生成するのではなく、AStar2D を使用して論理グラフを構築します。

  • 頂点:「部屋」を表します。
  • エッジ:「通路」または「ドア」を表します。
  • メリット:メッシュを 1 つも生成する前に、検証(すべての部屋に到達できるか?)を簡単に実行できます。

詳細(必要に応じて読み込み)

酔歩、ノイズによるバイオーム、BSP、戦利品テーブル、WFC ループ — references/algorithm-recipes.md。

リファレンス

段階的な情報開示:特定の API を調べる場合にのみ公式ドキュメントへのリンクを開き、関連分野に引き継ぐ場合にのみ関連スキルを読み込みます。ネットワーク全体を事前に読み込まないでください。

公式ドキュメント
  • FastNoiseLite — 高さマップやバイオームマスク向けのシード、周波数、ノイズタイプ、および get_image()/get_noise_2d()。
  • 乱数生成 — 共有可能な実行では、グローバルな randi() よりもジェネレーターごとの RandomNumberGenerator シードが優れている理由。
  • RandomNumberGenerator — 決定論的なシーケンスと取り消し可能な RNG 履歴のための seed/state API。
  • 複数スレッドの使用 — メインループを停止させずに、チャンク/WFC の処理を別スレッドに委ねます。
  • スレッドセーフな API — ワーカーが呼び出せる Godot API。SceneTree/ノードの生成はメインスレッドで行います。
  • WorkerThreadPool — 非同期チャンク生成のための add_task と call_deferred を使った確定パターン。
  • ArrayMesh の使用 — マーチングキューブ法や無限地形のメッシュに、頂点/法線/インデックスの配列を確定します。
  • SurfaceTool の使用 — 実行時の平面向けに、頂点を段階的に構築して法線を生成します。
  • TileMaps の使用 — BSP、CA、WFC、または酔歩で生成したグリッドに対する TileMapLayer/パターンの一括書き込み。
  • GridMaps の使用 — ダンジョン/地形ジェネレーター向けのモジュール式 3D セル配置バックエンド。
  • ナビゲーション入門(3D) — プロシージャルジオメトリを配置した後に、NavigationRegion のメッシュを再ベイクします。
  • AStar2D — タイルやメッシュを生成する前に、部屋/通路グラフを検証します。
関連スキル
前提条件
  • godot-project-foundations — ジェネレーターがTileMap、GridMap、ArrayMeshを生成する前に、シーン、リソース、インポートの基本を学びます。
  • godot-gdscript-mastery — すべてのジェネレータースクリプトで使用する型付き配列、call_deferred、WorkerThreadPoolのタスクパターンを学びます。
  • godot-resource-data-patterns — ハードコードされたマジックテーブルの代わりに、Resourceを使ったタイルライブラリ、隣接ルール、シード設定を扱います。
補完スキル
  • godot-tilemap-mastery — set_pattern/地形接続のバッチ処理により、大規模なCA/WFCグリッドでタイルごとにset_cellを呼び出さないようにします。
  • godot-3d-world-building — 部屋のグラフや高さマップを利用するGridMap/MeshLibrary/CSGの配置バックエンドを扱います。
  • godot-navigation-pathfinding — 部屋、洞窟、地形チャンクの生成完了後に、実行時にナビメッシュをベイクします。
  • godot-performance-optimization — 生成後のメッシュコミット、衝突用トライメッシュ、MultiMeshによる小道具の散布に関する予算を扱います。
  • godot-save-load-systems — 生成されたすべてのチャンクをシリアライズする代わりに、シードとプレイヤーの変更差分を保存します。
  • godot-scene-management — 生成データをラップするチャンクシーンのスレッド読み込み/アンロードを扱います。
  • godot-monte-carlo-balancer — リリース前に、シード分布に基づいてスポーン密度、戦利品テーブル、部屋の難易度をサンプリングします。
下流/利用側
  • godot-genre-roguelike — BSP/WFC/酔歩ジェネレーターとシード付きRNGを利用する、ラン単位で進行するダンジョンクローラーを扱います。
  • godot-genre-sandbox — 無限地形とCAスクリプトを基盤とする、ボクセル/チャンクワールドやセル・オートマトンのサンドボックスを扱います。
  • godot-genre-open-world — マルチスレッドのチャンク生成をラップする、チャンクストリーミングと浮動原点レイヤーを扱います。
マスター
  • godot-master — スキル間の検索に使うライブラリルーター兼、ミラー化されたモジュールエントリーです。

コメント