godot-platform-console について
Godotでのコンソールゲーム開発向けスキルガイドです。コントローラー優先の操作、認証要件、固定フレームレートを重視し、フォーカス喪失や切断への対応、非同期セーブ、メモリ監視、ボタン表示の割り当てを扱います。
主な機能
- 01認証フロー、フォーカス、コントローラー切断への対応
- 02GUIDベースのボタン表示マッピング
- 03スレッド処理によるアトミックセーブ
- 04解像度スケーリングとメモリ予算監視
- 05コントローラーナビゲーションとInput Map操作
活用シーン
- 01コンソール認証要件に沿ったゲームフローの構築
- 02複数のコントローラーに応じたボタン表示
- 03メモリとフレームレートを管理し、セーブ破損を防止
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ thedivergentai/ game-dev-agentic-skills --skill godot-platform-consoleインストール後、Claude Code で/godot-platform-consoleを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/console-cert-patterns.mdmigration-notes.mdscripts/achievement_offline_queue.gdasync_save_manager.gdbackground_data_prefetcher.gdcertification_manager.gdconsole_boot_config.gdconsole_compliance_handler.gdconsole_shader_manager.gdcontroller_prompt_mapper.gdcontroller_telemetry.gdmemory_budget_guard.gdperformance_scaler_fsr.gdplatform_console_patterns.gdplatform_dialog_invoker.gdplatform_overlay_manager.gdserver_side_projectile.gd詳細
プラットフォーム:コンソール
コントローラー優先の設計、認証要件への準拠、固定フレームレートがコンソール開発の要です。
絶対にしてはいけないこと
- マウスカーソルを絶対に表示しないでください — 認証(TRC/TCR)に不合格となります。
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)で非表示にしてください。 - フォーカスを失ったときに絶対に一時停止を省略しないでください —
NOTIFICATION_APPLICATION_FOCUS_OUTを監視し、強制的に一時停止してください。 - コントローラーの切断を絶対に未処理のままにしないでください — 強制的に一時停止し、再接続用のUIを表示してください。
- 固定されていないフレームレートを絶対に使わないでください —
Engine.max_fpsで30または60 FPSに固定し、VSyncを有効にしてください。 - D-Padによるナビゲーションを絶対に忘れないでください — アナログ操作だけのメニューはアクセシビリティ/TRCの要件を満たしません。すべてのメニューでD-Padをサポートしてください。
- ボタンラベルを絶対にハードコードしないでください — 「Aを押してください」ではなく、GUIDベースのプロンプトマッピング(
controller_prompt_mapper.gd)を使ってください。 - ハードウェアのメモリ上限を絶対に超えないでください — RAMをプロファイリングしてください。Switchのメモリ予算は厳格です。
- Joypad 0が常にプレイヤー1だと絶対に決めつけないでください —
Input.get_connected_joypads()で確認してください。 - コンソールのエクスポートテンプレートやSDKを絶対に公開配布しないでください — NDAの対象です。
- 連続するアナログスティックの入力を絶対にブール値で判定しないでください —
get_vector()/get_action_strength()を使ってください。 - 無効化するオプションなしに、絶対に振動を継続させないでください —
Input.start_joy_vibration()は時間を指定し、アクセシビリティ設定で切り替えられるようにしてください。 - コンソールでOSのウィンドウAPIが使えると絶対に期待しないでください —
DisplayServer.window_set_mode()は無視されるか、失敗します。 - UIを生のボタンインデックスに絶対に割り当てないでください — Project Input Map(
ui_accept、ui_cancel、カスタムアクション)を使ってください。 - 終了処理に
NOTIFICATION_WM_CLOSE_REQUESTを絶対に頼らないでください — コンソールはサスペンドされるため、フォーカス喪失/サスペンド時の処理を実装してください。 - フレーム単位の精度が必要な入力を、バッファーをフラッシュせずに絶対に照会しないでください — 重要なチェックの前に
Input.flush_buffered_events()を呼び出してください。 - アナログトリガー軸に
==/!=を絶対に使わないでください —is_equal_approx()を使ってください。 - シーン遷移後に孤立ノードを絶対に残さないでください — RAMは厳しく制限されています。
queue_free()を呼び出し、循環参照を解消してください。 - 実行時に
res://へ絶対に書き込まないでください —user://のみを使ってください。 - メインスレッドで絶対に同期保存しないでください — 別スレッドに委譲し、一時ファイル
.tmpを使ってから名前を変更してください。
利用可能なスクリプト
必須:対応するパターンを実装する前に、該当するスクリプトを読んでください。
certification_manager.gd
フォーカス喪失やコントローラー切断など、TRC/TCRへの準拠を徹底します。
performance_scaler_fsr.gd
コンソールのパフォーマンス向上に向けた動的解像度スケーリングとFSR 2.2の管理を行います。
server_side_projectile.gd
高頻度オブジェクト向けに、RenderingServer/PhysicsServerを直接利用します。
async_save_manager.gd
アトミックで破損に強い、スレッド化されたセーブシステムです。
controller_prompt_mapper.gd
GUIDベースでボタンプロンプトを検出します(PlayStation/Xbox/Switch)。
memory_budget_guard.gd
プラットフォーム固有のハードウェアメモリ予算に対して、厳格にRAMを監視します。
platform_dialog_invoker.gd
ネイティブOSダイアログと仮想キーボードの抽象化を行います。
background_data_prefetcher.gd
WorkerThreadPoolを使ってアセットを事前に取得し、レベル読み込み時のカクつきを防ぎます。
achievement_offline_queue.gd
実績/トロフィーをキャッシュし、オフライン時も保持します。
console_boot_config.gd
ハードウェアを考慮した初期化とレンダリング設定の上書きを行います。
認証のゴールデンパス(必須スクリプト)
コンソール対応の垂直スライスを完成させるため、以下のチェックリストを順番に実行してください。以下の表で任意と記載されている場合を除き、任意のスクリプトは読み込まないでください。
| 手順 | 必須スクリプト | 読み込まない(必要な場合を除く) |
|---|---|---|
| 1. 起動 | console_boot_config.gd | server_side_projectile.gd — RID バイパス。認証対象外 |
| 2. フォーカス/切断 | certification_manager.gd | — |
| 3. セーブのアトミック性 | async_save_manager.gd | — |
| 4. FPS/スケーラー/RAM | performance_scaler_fsr.gd + memory_budget_guard.gd | Switch:ram_limit_mb を約 3072(製品版)に設定し、3584 で警告。PS/Xbox:SKU ごとに 4096–5120 — スクリプトの @export を参照 |
| 5. プロンプト | controller_prompt_mapper.gd | — |
任意項目のみ: achievement_offline_queue.gd、platform_dialog_invoker.gd、background_data_prefetcher.gd。実績、システムダイアログ、またはプリフェッチが対象範囲に含まれない限り、手順 1~5 ではこれらを読み込まないでください。
入力処理(入力マップ — 生のインデックスではありません)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("ui_accept"):
on_confirm()
elif event.is_action_pressed("ui_cancel"):
on_cancel()
# Prompts: MANDATORY controller_prompt_mapper.gd for face-button glyphs
エキスパート向けテクニック
TRC の不合格 → 修正(症状 → スクリプト → ドキュメント)
| 症状 | 修正スクリプト | ドキュメント |
|---|---|---|
| ゲーム UI にマウスポインターが表示される | 入力マップのフローを使って非表示にし、起動時に Input.MOUSE_MODE_HIDDEN を設定 | カスタムマウスカーソル |
| ダッシュボード/ホームボタンを押してもゲームが動き続ける | certification_manager.gd でフォーカス喪失時に一時停止 | 終了要求の処理 |
| Switch で「A を押す」がハードコードされている | controller_prompt_mapper.gd の GUID グリフ | コントローラー、ゲームパッド、ジョイスティック |
| 電源喪失時にセーブが破損する | async_save_manager.gd の .tmp リネーム | ゲームのセーブ |
| フレーム時間の急増/TRC パフォーマンス不合格 | performance_scaler_fsr.gd + RAM ガード | 解像度スケーリング |
1. プラットフォームオーバーレイマネージャー(ネイティブ UI ダイアログ)
カスタムのモーダルスタックよりも、TRC のシステムメッセージには platform_dialog_invoker.gd/platform_overlay_manager.gd/DisplayServer.dialog_show() を優先してください。
2. シェーダーバイナリーキャッシュ(RenderingDevice)
固定されたコンソール GPU ではシェーダー/パイプラインキャッシュを有効にしてください。console_shader_manager.gd と、「リファレンス」にあるパイプラインコンパイルに関する公式ドキュメントのガイダンスを参照してください。
3. コントローラーバッテリーテレメトリーのフック
controller_telemetry.gd 経由で Input.joy_connection_changed + Input.get_joy_info() を使用してください。バッテリーレベルの取得には、NDA 下で提供されるプラットフォーム GDExtension が必要となる場合がよくあります。
詳細解説(必要に応じて)
- ジョイパッドのスニペット、ネイティブオーバーレイダイアログ、シェーダーキャッシュ UUID、コントローラーテレメトリー → console-cert-patterns.md
リファレンス
段階的開示:特定の API を調査するときにのみ公式ドキュメントへのリンクを開き、関連分野へルーティングするときに関連スキルを読み込んでください。依存関係全体を事前に読み込まないでください。
公式ドキュメント
- コントローラー、ゲームパッド、ジョイスティック — Joypad のインデックス、デッドゾーン、get_vector/get_connected_joypads、およびコンソールではデバイス 0 がプレイヤー 1 とは限らない理由について説明します。
- コントローラーの番号と振動 — start_joy_vibration の有限時間、接続シグナル、および TRC/TCR で必要な触覚アクセシビリティの切り替えについて説明します。
- InputEvent の使用 — InputEventJoypadButton/Motion のイベントフロー、Input Map アクション、およびフレーム処理に不可欠なチェックの前に入力バッファをフラッシュする方法について説明します。
- カスタムマウスカーソル — コンソールの認証に失敗しないよう、Input.set_mouse_mode でカーソルを非表示にする方法について説明します。
- 終了要求の処理 — コンソールでは通知されないことが多い NOTIFICATION_WM_CLOSE_REQUEST と、フォーカス喪失/一時停止時の処理経路との違いについて説明します。
- キーボード、マウス、コントローラーによる UI ナビゲーション — アナログ入力のみのメニューがアクセシビリティ/TRC に不適合となる場合に必要な、フォーカス先の設定と D-Pad/ゲームパッドによる UI 操作について説明します。
- 解像度スケーリング — 性能の低い SKU で 30/60 FPS を維持するために使用する、Viewport FSR2/scaling_3d_scale のプロファイルについて説明します。
- ゲームの保存 — user:// への永続化、セーブインジケーター、およびエクスポート済みコンソールビルドで res:// への書き込みが無効な理由について説明します。
- バックグラウンド読み込み — コンソールのストレージが遅くてもレベル遷移時に停止しないよう、ResourceLoader を使ってスレッドで事前読み込みする方法について説明します。
- 複数スレッドの使用 — メインスレッドでの TCR フレーム時間の急増を避けながら、WorkerThreadPool でアトミックな保存や事前読み込みをオフロードする方法について説明します。
- 機能タグ — コンソールの起動時オーバーライド(VSync、最大 FPS、ローエンド向け GI)を制御する OS.has_feature/エクスポートタグについて説明します。
- シェーダー/パイプラインのコンパイルによるカクつきの軽減 — 初回使用時のカクつきによる不合格を避けるため、固定構成のコンソール GPU でシェーダー/パイプラインをキャッシュする方法について説明します。
関連スキル
前提条件
- godot-project-foundations — 認証用フックやコンソールの起動時オーバーライドを導入する前に必要な、プロジェクトの構成、Input Map、エクスポート先/ユーザーデータのパスについて説明します。
- godot-input-handling — コントローラー優先の UI やプロンプトマッパーの基盤となる、Joypad アクション、デッドゾーン、デバイスの再マッピングについて説明します。
- godot-gdscript-mastery — コンプライアンス処理や非同期セーブマネージャーで使用する、型付き通知、シグナル、スレッドセーフな呼び出しパターンについて説明します。
補完
- godot-export-builds — エクスポートプリセット、機能タグ、テンプレートの運用規則(コンソール SDK は、このスキルの範囲外では NDA の対象です)。
- godot-save-load-systems — アトミックな名前変更、クラウド対応のスロット、TRC のセーブ表示が対象とするセーブ UX。
- godot-ui-containers — ゲームパッドのみで操作するメニュー向けの、フォーカス可能な Control ツリーと方向キーの隣接グラフ。
- godot-performance-optimization — TCR のもとで FPS 上限を維持するフレーム予算、FSR スケーリング、サーバー側エンティティのパターン。
- godot-debugging-profiling — Switch クラスの RAM 上限を守るために使用するメモリ/プロファイラーのタブとモニター。
- godot-scene-management — シーン遷移をコンソールの RAM 予算内に収めるための、積極的な queue_free と読み込みキューの活用。
- godot-resource-data-patterns — メモリ予算ガードと組み合わせたリソースキャッシュおよびアンロード戦略。
下流/利用側
- godot-platform-desktop — Input Map/アクションを共有しつつ、コンソール向けのマウス非表示と FPS 固定の処理を維持する、PC との二重展開ビルド。
- godot-platform-mobile — 同じタイトルを携帯端末にも展開する場合に共有する、フォーカス喪失/サスペンド時の一時停止パターン。
- godot-multiplayer-networking — 実績キューやプラットフォームオーバーレイに加える、オンラインマッチメイキング/フレンド機能のフック。
- godot-genre-party — 動的なジョイパッドスロットの検出とプロンプトのマッピングを利用する、複数パッドでのローカルプレイ。
マスター
- godot-master — スキルを横断して見つけるためのライブラリルーターおよびミラー化されたモジュールエントリ。