godot-procedural-generation について
godot-procedural-generation は、マップ、地形、オブジェクト配置を生成する Godot 開発者向けスキルです。アルゴリズム別のスクリプトに加え、シードによる再現性、バックグラウンドでのチャンク計算、メインスレッドでのシーン更新を扱います。
主な機能
- 01状態履歴付きシード乱数生成
- 02バックグラウンドでのチャンク生成
- 03ダンジョンレイアウトアルゴリズム
- 04ノイズ地形とハイトマップ
- 05ポアソンディスクによる配置
- 062D・3Dメッシュ生成
活用シーン
- 01再現可能なダンジョン配置の生成
- 02チャンク式オープンワールド地形の構築
- 03オブジェクトの密集を避けた配置
- 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.mdmigration-notes.mdscripts/bsp_tree_rooms.gdcellular_automata_dungeon.gddrunknard_walk_path.gddungeon_generator.gdfast_noise_noise2d_master.gdl_system_tree_gen.gdmarching_squares_metaballs.gdmesh_gen_infinite_terrain.gdmulti_threaded_chunk_gen.gdpoisson_disk_sampling_2d.gdproc_gen_graph_layout.gdproc_gen_marching_cubes_base.gdproc_gen_seed_history.gdwave_function_collapse_lite.gdwfc_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 が壁に向かって歩いてしまいます。
- データのシリアライズを無視しないでください — ワールドを生成する場合は、シード と プレイヤーによる変更 を保存できなければなりません。可能であれば、チャンクの生の状態を丸ごと保存するのは避けてください。
ゴールデンパス(必須)
すべてのジェネレーターはここから始めます — シードの分離、非同期データ、メインスレッドでの確定:
- シードと RNG — 必須 proc_gen_seed_history.gd:レベルまたはチャンクごとに
RandomNumberGeneratorを 1 つ使用します。共有可能な実行のために、seedとstateを永続化します。 - 非同期チャンク — 必須 multi_threaded_chunk_gen.gd:
WorkerThreadPool.add_task→ スレッド外でデータを計算 → SceneTree/ノードの処理にはcall_deferred("_finalize_chunk")を使用します。 - 検証 → ナビゲーションのベイク — タイル/メッシュをメインスレッドに反映した後、
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 に引き継いでください。
利用可能なスクリプト
コア(常にここから開始)
- proc_gen_seed_history.gd — シード付き
RandomNumberGeneratorと状態のプッシュ/ポップ履歴(必須) - multi_threaded_chunk_gen.gd — WorkerThreadPool →
call_deferredによるチャンク確定パターン(必須)
2D レイアウトと配置
- drunknard_walk_path.gd — トンネル/道には必須(ローカル RNG を渡し、グローバルな
randi()は使用しないでください) - bsp_tree_rooms.gd — 構造化されたフロアプランには必須
- cellular_automata_dungeon.gd — 自然な洞窟には必須
- poisson_disk_sampling_2d.gd — ブルーノイズによる小道具/敵の配置には必須
- wave_function_collapse_lite.gd — エントロピーと
max_iterationsを使った軽量 WFC(必須) - wfc_level_generator.gd — タイルライブラリの隣接ルールを使った完全な WFC
- proc_gen_graph_layout.gd — AStar2D/3D によるジオメトリ生成前のグラフ構築
ノイズと 3D
- fast_noise_noise2d_master.gd — FastNoiseLite → Image のハイトマップ(必須)
- mesh_gen_infinite_terrain.gd — 実行時の ArrayMesh 地形。LOD に対応可能
- proc_gen_marching_cubes_base.gd — ボクセルデータから 3D メッシュを生成
- marching_squares_metaballs.gd — 2D 等高線の抽出
- l_system_tree_gen.gd — 手続き型の植物/木の文法
エキスパート向け手続き型パターン
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/stateAPI。 - 複数スレッドの使用 — メインループを停止させずに、チャンク/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 — スキル間の検索に使うライブラリルーター兼、ミラー化されたモジュールエントリーです。