Unity プレイロジック開発スキル(一人称視点 / Unity 6 / URP)
パスの約束(最初に読む):このファイル内の
scripts/、references/、assets/はすべて、この SKILL.md が置かれているディレクトリからの相対パスです。 スクリプトを実行する前に、そのディレクトリをカレントディレクトリにしてください。ホストによってインストール場所が異なります:Claude Code プラグインの場合はプラグインディレクトリ、Cursor/Codex の場合はinstall.ps1によって<プロジェクト>/skills/game-dev/<スキル名>/にインストールされます。 不明な場合は、globでこの SKILL.md の絶対パスを特定し、絶対パスでスクリプトを呼び出してください。 プロジェクトルートでpython scripts/xxx.pyと叩くとファイルが見つからずエラーになります。
概要
このスキルは、GDD の仕様と 3D アセットをプレイ可能なゲーム機能に変換します。MCP を使用して Unity 内でスクリプトを作成・変更し、コンポーネントをアタッチし、アニメーションと UI を設定し、Play モードで検証し、テストを実行し、ビルドを出力します。デフォルトの技術スタック:Unity 6(6000.x LTS、6000.3 互換)、URP、UGUI、新しい Input System、Cinemachine 3(オプション)、シングルプレイヤー、オフライン。
境界
- 対応:プレイロジック、コントローラー、インタラクション、UI、インベントリ/会話/セーブ、AI、オーディオ、テスト、ビルドとパフォーマンス分析。
- 非対応:3D アセットの作成/インポート/マテリアル(
unity-blender-mcpスキルに任せる);マルチプレイヤー(Netcode);シェーダーの手書き(エフェクトの選定アドバイスのみ)。 - 対象プロジェクトは一人称視点。三人称/俯瞰視点でも同じアーキテクチャ(ステートマシン、入力、インタラクション、UI)を流用し、コントローラーとカメラブランチのみが異なります。詳細は
references/02を参照。 - 2D プロジェクト:アーキテクチャ層(ステートマシン/イベントバス/セーブ/インベントリ/UI スタック)はそのまま使用できますが、キャラクター制御、物理、ナビゲーション、パフォーマンス予算は変更する必要があります。
詳細は
references/11-2d-gameplay.mdを参照。3D のCharacterController+NavMeshを 2D で使用しないでください。
事前環境
- Unity 6000.x(6000.0 LTS は 2026 年 10 月までサポート、その後は 6000.3 LTS にアップグレードしてください。コードは両バージョンで互換性があります)。
- 必須パッケージ:
com.unity.inputsystem(新しい入力システム)、com.unity.ugui(UGUI)、com.unity.ai.navigation(NavMesh のベイク処理)、com.unity.test-framework(テスト、スキャフォールドが--testsで自動生成);オプション:com.unity.cinemachine、URPcom.unity.render-pipelines.universal。 - パッケージのインストールは MCP
manage_packagesを使用するか、スキャフォールドが manifest を自動で書き込みます(Input System / UGUI / テストフレームワーク。バージョンはエディタに組み込まれたものとメインラインのバージョンフォールバックテーブルに従って解析)。インストール後、Project Settings → Active Input Handling を Both に設定してください(スキャフォールドがactiveInputHandler: 2を書き込みます)。 - バージョン確認:
ProjectSettings/ProjectVersion.txtを確認。API が不明な場合はunity_docs/unity_reflectを使用し、不慣れな API を記憶だけで記述しないでください。
標準ワークフロー(GDD からプレイ可能な機能へ)
フロー A:新規プロジェクトのゼロからの構築
- バージョンとレンダーパイプラインの確認:
manage_editorでエディタバージョンを読み取る。プロジェクトが URP か Built-in か(マテリアルとポストエフェクトが異なる)。 - スキャフォールドの実行:
python scripts/new_gameplay.py --out "<プロジェクト>/Assets/Game" --namespace <ゲーム名>を実行し、フレームワークコード、asmdef、テストアセンブリを生成します。これにより Input System の依存関係も自動で補完されます。一度 Unity を開いてパッケージをダウンロードしてから、もう一度スキャフォールドを実行して asmdef GUID を埋め戻してください。- ⚠️ 初回コンパイル時に
CS0234/CS0246(UnityEngine.InputSystemが見つからない)が発生するのは想定内であり、スキャフォールドのバグではありません。新しいプロジェクトではパッケージがまだダウンロードされていないため、InputSystem の asmdef GUID が読み込めません。一度 Unity を開いてパッケージをダウンロード → スキャフォールドを再実行 → GUID が埋め戻される → 再コンパイルでエラーゼロになります。 - Unity 6000.0.84f1 で実際にテスト済み:再実行後、コンパイルエラーはゼロ、
InventoryTestsは 3/3 パスしました。
- ⚠️ 初回コンパイル時に
- シーンのガイドオブジェクトをセットアップ:
references/01に従って起動シーン(GameManager、AudioManager、UIManager、EventSystem、Canvas)を作成し、manage_gameobject/manage_componentsを使用します。 - 機能の順序に従って実装:入力 → 一人称コントローラー → インタラクション → HUD → 具体的なプレイシステム → AI → オーディオ/VFX(順序は以下の「機能開発の順序」を参照)。
- 機能ごとに検証:各機能を完了するごとに、Play モードで手動テスト + EditMode/PlayMode テストを作成します。詳細は
references/00の検証サイクルを参照。 - ナビゲーション/ベイク/ビルド:NavMesh のベイク、シーンのビルド設定への追加、ビルド前のチェックリスト。詳細は
references/08、references/09を参照。
フロー B:個別機能の開発(最も一般的)
GDD の該当ページ(キャラクター/インタラクション/システム/会話/アニメーションの仕様)を読む → 変更するスクリプトとコンポーネントをリストアップ → テンプレートを選ぶか新規作成 → MCP 編集サイクルに従って実装 → Play で検証 → テストを追加 → 機能完了定義を更新。
フロー C:トラブルシューティングと最適化
コンパイル/実行時エラーは references/10 を参照。フレーム落ち/スタッターは references/08 の Profiler フローを参照。MCP 操作の失敗は references/00 のフォールバック計画を参照。
MCP 編集サイクル(コードを変更するたびに遵守)
refresh_unityでまずディスクと同期。read_consoleで開始時にエラーがないことを確認。- スクリプト作成:
create_script。スクリプト変更:**優先的にscript_apply_edits(構造化されたメソッドレベルの編集)**を使用し、小さな変更のみapply_text_editsを使用。変更後validate_scriptを実行。 refresh_unityでコンパイルをトリガー →read_consoleでコンパイル結果を確認(CS エラーがあればすぐに修正し、エラーを残して先に進まない)。- コンポーネントのアタッチ/参照の設定:
manage_components/manage_gameobject。アニメーションはmanage_animationを使用。UI はmanage_gameobjectを使用(UI Toolkit の場合のみmanage_uiを使用)。 - Play モードで検証:
manage_editorで playmode を切り替え、read_consoleで実行時例外を確認。視点/操作感はfind_gameobjectsで Transform の状態を読み取って確認し、必要に応じてexecute_codeで Game View のスクリーンショットを取得。 - 競合しない複数の操作は
batch_executeにまとめる。各機能の終了前にmanage_sceneで保存。
機能開発の順序(スキャフォールド後)
1. 入力 InputReader(スキャフォールドで生成済み)→ シーンに Player をアタッチし、WASD/マウスで動かす
2. 一人称 PlayerLook + FirstPersonController(歩く、走る、ジャンプ、しゃがむ、着地)
- 2D プロジェクトの場合は `PlatformerController2D` を使用(`--dimension 2d` 指定時に自動生成、3D 専用ファイルは生成されない)
3. インタラクション Interactor + ドア/拾い物(クロスヘア UI との連携)
4. HUD + メニューパネルスタック(UIManager、ESC で一時停止)
5. プレイシステム:Health/インベントリ/会話(GDD に応じて取捨選択)
6. セーブ SaveSystem(実装済みシステムを ISaveable に接続)
7. エネミーAI:NavMesh ベイク + EnemyAI + 知覚
8. オーディオ AudioManager + ミキサー;VFX(パーティクル/マズルフラッシュ/ヒット)
9. パフォーマンス Profiler でフレーム分析;ビルド出力(references/08、09)
スキャフォールドとテンプレート
python scripts/new_gameplay.py --out "D:/MyProject/Assets/Game" --namespace MyGame
# --no-tests:テストアセンブリを生成しない
# --editor-data "Editor/Data へのパス":Input System のバージョンを解析(指定しない場合はバージョンフォールバックテーブルに従う)
テンプレート一覧(assets/templates/)。テンプレートには {{NS}} 名前空間プレースホルダーが含まれています。手動でコピーする場合は事前に置換するか、new_gameplay.py を実行して自動生成してください。そうしないとコンパイルできません。
| モジュール | ファイル | 用途 |
|---|---|---|
| Core | PersistentSingleton / StateMachine / EventBus / GameManager / GameEvents | シングルトン、ステートマシン、イベントバス、ゲームフロー(メニュー/ゲーム/一時停止/ロード) |
| Input | InputReader | 新しい Input System のコード化ラッパー、キーボードマウス+ゲームパッド |
| Player | FirstPersonController / PlayerLook / PlatformerController2D | 3D:CharacterController 移動、マウス視点、走る/ジャンプ/しゃがむ。2D:Rigidbody2D プラットフォーマージャンプ(coyote time / jump buffer / 可変ジャンプ高含む) |
| Interaction | InteractableBase / Interactor / PickupItem | クロスヘアインタラクション、拾い物サンプル |
| Systems | Health / Inventory / SaveSystem / DialogueRunner / ObjectPool / AudioManager | HP、インベントリ、JSON セーブ、リニアな会話、オブジェクトプール、オーディオ |
| AI | EnemyAI / EnemyPerception | NavMesh 巡回/追跡/攻撃ステートマシン + 視錐台による知覚 |
| UI | UIPanel / UIManager / HUDController | パネルスタック、HUD HPバー/インジケータ/字幕 |
| Tests | InventoryTests(+ asmdef) | インベントリロジックのテストサンプル、run_tests で実行可能 |
参考ドキュメント一覧(必要に応じてロード)
references/00-mcp-code-workflow.md:47 の MCP ツールとプレイタスクのマッピング、編集サイクル、Play 検証、テスト、MCP がない場合のフォールバックreferences/01-architecture.md:ディレクトリ構成、asmdef、命名規則、データ駆動、参照/イベント/シングルトンの使用境界、ScriptableObjectreferences/02-input-and-fp-controller.md:Input System の実装、Player プレハブ階層、一人称移動/視点パラメータテーブル、三人称/俯瞰ブランチreferences/03-interaction-animation.md:インタラクション層、Animator ステートマシン/Blend Tree/ルートモーション、アニメーションイベント、Humanoid の連携references/04-ui-ugui.md:Canvas/EventSystem のセットアップ、パネルスタック、HUD、一時停止、入力切り替えreferences/05-gameplay-systems.md:HP/インベントリ/会話/セーブ/オブジェクトプールの使用方法と拡張ルール、データ定義references/06-ai-navigation.md:NavMesh ベイク、敵設定、巡回ポイント、知覚パラメータ調整、状態拡張references/07-audio-vfx.md:AudioMixer グループ、オーディオプール、音楽クロスフェード、パーティクル/VFX Graph の選定references/08-performance.md:60fps 予算、Profiler/Frame Debugger フロー、一般的なボトルネックreferences/09-build-release.md:ビルド設定、シーンリスト、Steam/Deck チェック、セーブ互換性references/10-troubleshooting.md:コンパイル/ヌル参照/実行順序/入力/ナビゲーション/UI の一般的なエラー対応references/11-2d-gameplay.md:2D プロジェクトを扱う前に読むこと。2D パッケージのインストール、Sprite インポート、Physics2D とレイヤーマトリックス、 2D プラットフォーマージャンプ(coyote time/jump buffer)、Tilemap と Composite コリジョン、ピクセルパーフェクトカメラ、 overdraw と Batch で数える 2D 予算(トライアングル数の予算表は 2D では無意味)。
2D プロジェクトの注意:このスキルの C# テンプレートはデフォルトで 3D 一人称(
CharacterController、NavMesh)用です。 2D プロジェクトでは、次元に依存しない部分(EventBus、StateMachine、Inventory、SaveSystem、Health、ObjectPool、UIManager、AudioManager)を流用し、コントローラー、ナビゲーション、物理、パフォーマンス予算はreferences/11に従って書き直してください。
鉄則
- 数値は GDD から:移動速度、ジャンプ力、ダメージ、判定フレーム、視野距離はすべて Inspector で公開し、GDD の該当ページと一致させること。GDD に記載がない場合は
【要確認】とマークし、数値をでっち上げないこと。 - 各ステップは検証可能であること:コード変更後はコンパイルエラーゼロ、Play モードで実機確認。操作感(移動/視点/攻撃)は Transform/状態の証拠を記録できること。「たぶん大丈夫」では認められない。
- コンパイルの偽装禁止:
validate_scriptまたはread_consoleでエラーが解消されていない場合、完了とはみなさない。この環境で検証できない場合は明示的に宣言し、結果をでっち上げないこと。 - データとロジックの分離:調整可能な数値は SerializeField/ScriptableObject を使用。表現層はイベントを購読し、システムクラスに直接記述しない。
- 命名ルール:クラスは PascalCase。ファイル名はメインクラス名と一致。シーン/プレハブは
Level_01_、PF_Player。定数に日本語は含めない。Console に CS ワーニングが出た場合も修正すること。 - 小さなコミット:一つの機能で一つのコミット。変更前はシーンを保存/バックアップ。危険な操作(削除、コンポーネントの一括変更)は事前に影響オブジェクトをリストアップ。
機能完了定義(DoD)
- 実装したロジックが GDD の該当ページと一致し、数値がトレース可能であること(業界デフォルト値は注釈済み)
- コンパイルエラーゼロ、ワーニングゼロ(
read_consoleのスクリーンショット/表示で証明) - Play モードの実機確認が通っていること:入力、状態切り替え、インタラクション、フィードバックがすべて再現可能
- 単体テスト可能なロジックにはテストが存在すること(
run_testsでグリーン) - 関連する参照、コンポーネント、階層設定が完全であること(プレハブを空シーンにドラッグするだけで使用可能であり、手動での一時的な接続に依存しない)
- セーブに新しいフィールドを追加した場合はバージョン番号を処理。新しいシーンを追加した場合は Build Settings に含まれていること
- パフォーマンスに新しいボトルネックがないこと(目標 60fps、モバイル/Deck の場合は 08 を参照)