godot-genre-open-world について
Godotで、密度の高い注目地点と世界の変更保存を備えた大規模なストリーミング型オープンワールドを構築するスキルです。チャンク読み込み、原点シフト、HLOD、遠距離ロジックの制御、バイナリ差分保存のパターンを提供します。
主な機能
- 01チャンクのスレッド読み込みと解放
- 02浮動原点のシフト方式
- 03VisibilityRangeベースのHLOD
- 04距離に応じたAIと物理の制御
- 05バイナリ差分永続化
活用シーン
- 01プレイヤー周辺の地形チャンクをストリーミング
- 02大規模ワールドの揺れを軽減
- 03遠景メッシュを簡易表示に切り替え
- 04取得・破壊したエンティティだけを保存
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ thedivergentai/ game-dev-agentic-skills --skill godot-genre-open-worldインストール後、Claude Code で/godot-genre-open-worldを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/migration-notes.mdopen-world-elite-implementations.mdscripts/async_chunk_loader.gdbinary_save_manager.gdchunk_limited_pathfinder.gddynamic_lod_adjuster.gdfloating_origin_shifter.gdglobal_state.gdgroup_weather_broadcaster.gdhlod_visibility_config.gdlandscape_height_query.gdlod_logic_enabler.gdmultimesh_foliage_manager.gdserver_prop_spawner.gdworld_origin_shifter.gdworld_streamer.gd詳細
絶対に避けるべきこと(エキスパート向けアンチパターン)
ワールドと永続化
- マップの広さを密度より優先してはいけません。何もない景観は優れたデザインとはいえません。移動中、30秒ごとに 興味のある地点(POI) があることを徹底してください。
- ワールド全体の状態を保存してはいけません。保存ファイルの肥大化を防ぐため、独自の変更(伐採した木、略奪した宝箱など)だけを記録する 差分永続化 を必ず使用してください。
- 大きなチャンクやシーンを同期的にロードしてはいけません。「ロード時の引っかかり」やフレーム停止を防ぐため、必ず
ResourceLoader.load_threaded_request()を使用してください。 - バックグラウンドスレッドからアクティブな SceneTree を直接操作してはいけません。バックグラウンドスレッドでのチャンク生成をメインスレッドに安全に反映するため、必ず
call_deferred()を使用してください。 - 遠くにある未ロードのチャンクをメモリに保持してはいけません。メモリ不足(OOM)によるクラッシュを防ぐため、必ず
queue_free()を呼び出し、参照を null にしてください。 - 巨大なコリジョンを1つのメッシュにまとめてはいけません。効率的な物理クエリを実現するため、ワールドをチャンクに分割し、ローカルなコリジョン領域を設けてください。
- 大量のエンティティ状態をテキスト形式(.tscn/.json)で保存してはいけません。高速な I/O のため、必ず バイナリシリアライズ(
store_var)を使用してください。
物理演算とパフォーマンス
- 8,192単位を超えたときに発生する「浮動原点」のジッターを無視してはいけません。必ず ワールドシフトシステム を実装するか、プロジェクト設定で 大規模ワールド座標(倍精度) を有効にしてください。
- 極端に遠い距離で物理演算や AI を処理してはいけません。遠く離れた非アクティブチャンクのエンティティのロジックを無効にするため、必ず 空間分割 を使用してください。
- 物理演算に関わる状態を
_process()で計算してはいけません。フレームレートが変動しても決定論的なインタラクションを実現するため、必ず_physics_process()を使用してください。 - 大量の植生に対して、個別の
MeshInstance3Dノードを生成してはいけません。数十万個のメッシュを1回の GPU 描画呼び出しにまとめるため、必ず MultiMeshInstance3D を使用してください。 - 実行時に
OccluderInstance3Dノードを移動してはいけません。CPU の BVH 再構築が発生し、深刻なマイクロスタッターの原因になります。 - エクスポートしたビルドで
CSGShape3Dノードを有効なままにしてはいけません。リリース前に、必ず静的なArrayMeshジオメトリにベイクしてください。 - ゲームプレイ中に複雑なシェーダーをコンパイルしてはいけません。ロード中に必ず「ウォームアップ」を実行するか、プロジェクト全体のキャッシュを有効にしてください。
- 自動メッシュ簡略化だけに頼ってはいけません。極端に遠い距離では、複雑なマテリアルを低負荷のインポスターに置き換えるか、オブジェクトを完全に非表示にするため、必ず VisibilityRange(HLOD) を使用してください。
ロジックとアーキテクチャ
- 巨大なワールド全体を対象にしたグローバルな A* 検索を実行してはいけません。経路探索を局所的なアクティブ領域に限定するため、必ず
NavigationPathQueryParameters3Dを使用してください。 - グローバルな状態(時刻など)の取得に
find_child()や深いツリーの反復処理を使用してはいけません。効率よく通知するため、必ず シーングループ(call_group())を使用してください。 - 複雑な Resource 型をネットワーク経由で同期してはいけません。ワールドの変更はプリミティブな Dictionary または PackedByteArray に必ずシリアライズしてください。
ResourceLoader.load_threaded_request()でシーンのストリーミングが可能な場合、チャンク I/O にThread.new()を直接使用してはいけません。ResourceLoader を優先してください。独自スレッドは Resource 以外の処理に限り、SceneTree への適用には deferred を使用します。
🛠 エキスパート向けコンポーネント(scripts/)
必須:関心ごとに以下を確認してから実装してください。
- ストリーミング → world_streamer.gd + async_chunk_loader.gd
- 原点 → シフターを1つ選択してください(判断ツリーを参照) — floating_origin_shifter.gd または world_origin_shifter.gd
- HLOD → hlod_visibility_config.gd のみ(実体のないコンフィギュレーターは使用しないでください)
- 遠距離ロジックのゲート → lod_logic_enabler.gd
エキスパート向けオリジナルパターン
- world_streamer.gd - バックグラウンドスレッドを使用する、プロ品質のチャンク管理およびストリーミングエンジンです。
- floating_origin_shifter.gd - 浮動小数点精度のジッターを補正する、グループベースのワールドオフセット補正機能です。
モジュールコンポーネント
- async_chunk_loader.gd - スレッドを使ったリソース読み込みによる、バックグラウンドでのワールドストリーミングシステムです。
- world_origin_shifter.gd -
reset_physics_interpolationとシェーダーのworld_offsetuniform を使って、ルートとプレイヤーをシフトします。 - hlod_visibility_config.gd - VisibilityRange を使って、距離に応じてジオメトリを切り替えます(HLOD)。
- lod_logic_enabler.gd - 距離やチャンクのアクティビティに応じて、AI/物理処理を有効化・無効化します。
- multimesh_foliage_manager.gd - 数千のランドスケープエンティティをサーバー側で GPU バッチ処理します。
- binary_save_manager.gd - 大規模ワールドの永続化に対応する、高性能なシリアライズ機能です。
- chunk_limited_pathfinder.gd - NavigationServer レベルでクエリを制限し、密集したワールドでの AI を最適化します。
- server_prop_spawner.gd - RenderingServer RID を使って SceneTree を回避する、徹底的な最適化です。
- dynamic_lod_adjuster.gd - グローバルメッシュ LOD のパフォーマンスをリアルタイムで適応的に調整します。
- group_weather_broadcaster.gd - SceneTree のグループ化によって、環境の更新を効率よく分離して処理します。
- landscape_height_query.gd - 大規模ランドスケープ向けに、ノードを使わず物理演算で床の高さを取得します。
- global_state.gd - チャンクをキーにした差分の永続化(
set_entity_deadパターン)です。
コアループ
探索 → POI を発見 → クエスト/移動 → 差分を永続化 → 天候/昼夜サイクルへの没入。
判断フロー:ストリーマー/原点/HLOD
| Concern | 選択肢 | スクリプト |
|---|---|---|
| プレイヤー周辺のチャンクの読み込み/アンロード | ResourceLoader のスレッド読み込み + 遅延 add_child | 必須 world_streamer.gd、async_chunk_loader.gd |
| 原点:ゲームプレイエンティティをグループ化し、独自のシフトポリシーを使う | グループ "world_entities" をシフト | floating_origin_shifter.gd |
| 原点:単一の world_root + プレイヤーのワープ + 物理補間 + シェーダーオフセット | ルートシフター | world_origin_shifter.gd |
| 原点:惑星規模/約数万ユニット超、物理演算を多用 | Large World Coordinates(倍精度ビルド) | プロジェクト設定 — シェーダー/オーディオの同期にシフターを引き続き使う場合があります |
| 遠距離メッシュの切り替え/インポスター | VisibilityRange HLOD | 必須 hlod_visibility_config.gd |
| 遠距離の AI/物理演算を無効化 | 距離/チャンクによる制御 | lod_logic_enabler.gd |
| 変更のみを永続化 | バイナリ差分 | binary_save_manager.gd |
原点戦略は1つ選んでください — 同じワールドルートで floating_origin_shifter と world_origin_shifter の両方を管理しないでください。
アーキテクチャ(重複する Elite ダンプなし)
- ストリーマー — プレイヤーのセルを基準にアクティブなチャンクセットを管理します。
queue_freeでアンロードし、スレッドを使った ResourceLoader で読み込み、call_deferredでインスタンス化します。ストリーマーの疑似コードを再掲しないでください。必須スクリプトを参照してください。 - 差分状態 — 死亡したエンティティ/戦利品を回収済みのチェストを、チャンク ID をキーにした Dictionary で管理します。チャンクのアンロード時にバイナリセーバーで書き込みます。
- HLOD — プロキシメッシュの
visibility_range_beginを設定し、詳細な子ノードにはvisibility_parentを使います。hlod_visibility_config.gd で設定してください。 - POI/コンパス — サイズより密度を重視します。プレイヤーの正面から POI までの角度を UI 上にマップします。浮動原点のコードブロックをもう1つ追加する必要はありません。
よくある落とし穴
- 空っぽの世界 — km²あたりの密度を誇示するだけ
- セーブデータの肥大化 — 差分のみを永続化する
- 遠距離の物理演算 — lod_logic_enabler.gd
- 存在しない
hlod_configurator.gd— 存在しません。hlod_visibility_config.gd を使用してください
デシジョンツリーとスクリプトカタログを超える深い調査には、必ず open-world-elite-implementations.md を参照してください。初回の配線時には読み込まないでください。まずは同梱されている
scripts/を使用してください。
Godot 固有のヒント
- VisibilityRange:専用の LOD ノードがなくても HLOD を実現できるよう、MeshInstance3D で
visibility_range_begin/endを使用します。 - スレッド処理:チャンクには
ResourceLoader.load_threaded_request()を優先して使用します。Resource を読み込まない場合に限り、カスタムのThreadを使用します。 - OcclusionCulling:都市ではオクルージョンをベイクします。開けた場所では通常、距離カリングだけで十分です。
リファレンス
段階的に情報を開示します。特定の API を調査する場合にのみ公式ドキュメントのリンクを開き、関連領域に処理を振り分ける場合にのみ関連スキルを読み込みます。スキル全体を事前に読み込まないでください。
公式ドキュメント
- バックグラウンドでの読み込み — ResourceLoader のスレッド化されたチャンク読み込みリクエストにより、ストリーミング中にメインスレッドが一時停止しないようにします。
- 大規模ワールド座標 — 約 8k 単位を超えるマップで、浮動原点のシフトと倍精度ビルドのどちらを選ぶべきかを説明します。
- 可視範囲 — HLOD のインポスター切り替えに使う GeometryInstance3D の begin/end とヒステリシスについて説明します。
- メッシュの詳細レベル(LOD) — インポーターによる自動 LOD と、屋外の品質を適応させる Viewport の mesh_lod_threshold について説明します。
- MultiMesh の使用 — カリング用の空間分割を用いて、植生や小物を 1 回のドローコールにまとめる方法を説明します。
- オクルージョンカリング — 都市向けのベイク済み OccluderInstance3D と、実行時にオクルーダーを動かしてはいけない理由を説明します。
- ゲームの保存 — 読み込み解除されたチャンク間でエンティティの変更を永続化する差分保存のパターンについて説明します。
- バイナリシリアライズ API — 大量のワールド状態をコンパクトに保存する FileAccess.store_var/get_var について説明します。
- 複数スレッドの使用 — カスタムストリーマーで使用する Thread/Mutex/Semaphore のワーカーパターンについて説明します。
- スレッドセーフな API — スレッド外で実行できる処理と、call_deferred で SceneTree に渡す必要がある処理について説明します。
- NavigationPathQueryObjects の使用 — チャンク単位の AI 向けに、リージョンを限定して NavigationServer3D にクエリする方法を説明します。
- レイキャスティング — タイルごとのノードを使わずに行う PhysicsDirectSpaceState3D による高さ・配置クエリについて説明します。
関連スキル
前提条件
- godot-project-foundations — PackedScenes とグループをストリーミングする前に、シーンツリー、リソース、プロジェクト設定を確認します。
- godot-3d-world-building — オープンワールドのチャンクと HLOD の基礎となる GridMap/CSG/オクルージョン/LOD プリミティブを扱います。
- godot-physics-3d — 大規模なマップで使用する、衝突レイヤー、空間クエリ、原点シフトに対応した物理演算を扱います。
- godot-gdscript-mastery — ストリーマーやセーブで使用する、型付き Resource、シグナル、遅延処理/スレッド間の受け渡しを扱います。
関連項目
- godot-scene-management — チャンクストリーマーと組み合わせるシーンのパッキングとロードキューを扱います。
- godot-performance-optimization — ワールド規模でのドローコール予算、MultiMesh の分割、処理のスロットリングを扱います。
- godot-navigation-pathfinding — アクティブなチャンク内に限定した NavigationRegion3D のベイク処理と経路クエリを扱います。
- godot-camera-systems — カメラ距離を基準に、ロード半径、可視範囲、フローティングオリジンのしきい値を設定します。
- godot-save-load-systems — チャンクのアンロード時に POI/クエストフラグを保持する、永続的な差分セーブを扱います。
- godot-signal-architecture — find_child によるツリー走査を使わず、原点シフトや天候の通知を行います。
- godot-monte-carlo-balancer — ストリーミングされるマップ全体での POI 密度、エンカウント/戦利品のペース、移動時間のバランスを扱います。
下流/利用側
- godot-quest-system — チャンク単位のエンティティや発見マーカーを参照するクエストを扱います。
- godot-genre-sandbox — ストリーミング、MultiMesh、永続化のパターンを再利用する、プレイヤーが構築するワールドを扱います。
- godot-genre-survival — オープンワールドのストリーミングと差分状態を引き継ぐ、探索/サバイバルのゲームループを扱います。
マスター
- godot-master — スキル横断の検索に使うライブラリルーターおよび対応するモジュールエントリです。
コメント
Markdown 対応