unity-architecture について
unity-architectureは、コード構成やリファクタリングを計画するUnity開発者向けのアドバイザリースキルです。プロジェクト規模に応じた構成を提案し、初期化順序や更新の前提条件を明示して過剰な抽象化を避けます。
主な機能
- 01規模に応じた構成提案
- 02モジュールと層の責務整理
- 03明示的な起動順序
- 04更新時の準備状態チェック
- 05過剰設計の回避
活用シーン
- 01新しいゲームのコード構成計画
- 02リファクタリング時の結合度低減
- 03初期化と更新の前提確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ besty0728/ unity-skills --skill unity-architectureインストール後、Claude Code で/unity-architectureを入力して読み込まれたか確認します。
詳細
このモジュールのスキルを呼び出す前に: スキル名や説明から推測したパラメーターでスキルを呼び出そうとしている場合は、いったん停止し、まずこのファイルを読むか、
GET /skills/recommend?includeSchema=trueでスキーマを取得してください。recommend/schema からすでにパラメーター定義を取得している場合は、そのまま dryRun に進んでかまいません。
トリガー
- コード構成を計画する
- 責務を分割する
- 結合度を下げる
- リファクタリングの方向性を決める
- コード構成の計画、責務の分割、結合度の低減、リファクタリングの方向性の決定
Unity アーキテクチャアドバイザー
ゲームプレイ用スクリプトを大量に生成する前、またはユーザーからよりすっきりしたアーキテクチャを求められたときに使用します。
ワークフロー
- 範囲を特定します。プロトタイプ、小規模ゲーム、長期運用プロジェクトのいずれかです。
- コアとなるループと、必要最小限のランタイムシステムを定義します。
- 範囲に適した、最小限のアーキテクチャを推奨します。
- 次の要素を分離します。
- シーン/ブートストラップ層
- ゲームプレイ/ドメインロジック
- データ/設定アセット
- ビュー/プレゼンテーション層
- 今はシンプルに保つべきものと、抽象化する価値のあるものを示します。
出力形式
このスキルを使用する際は、次の形式でアドバイスを構成します。
- プロジェクトの規模:プロトタイプ/小規模ゲーム/長期運用
- 推奨モジュール:3~7個のモジュールと、それぞれの役割を示す1行の説明
- シーン/ブートストラップ計画:構成と初期化を行う場所
- データの所有者:シーンオブジェクト、ScriptableObjects、純粋な C# クラスのどれに属するか
- 通信ルール:直接参照、インターフェース、イベント、コマンドのいずれを使うか
- パフォーマンス上のリスク:影響するホットパスのみ
- 今やること/今は避けること:過剰な設計を避ける
デフォルトの指針
MonoBehaviourスクリプトは、構成をつなぐ薄いブリッジとして使います。- 可能な場合は、再利用可能なゲームプレイのルールを通常の C# クラスに配置します。
ScriptableObjectは、作成者が編集する設定や共有の静的データに使用し、ランタイム状態を何でも格納する場所にはしません。- 依存関係を明示します。プロジェクトの規模から小規模なサービス層が明らかに妥当でない限り、隠れたグローバル状態は避けます。
- フレームワークに大きく依存するアーキテクチャより、シンプルなモジュール境界を優先します。
実行順序とエントリーガードを明示する
「ランダムな」ゲームプレイのバグの多くは、2つの暗黙の前提に起因します。スクリプトが予測可能な順序で実行されること、そしてデータの準備ができるまで Update が実行されないことです。どちらも、明示的に設定しない限り成り立ちません。
起動順序を明示する
Script Execution Order パネルや、偶然の Awake の実行順序に依存しないでください。次のパターンを、上から優先して使用してください。
- 単一の Bootstrap スクリプトを唯一のエントリーポイントにします。初期化の順序を管理し、生成したマネージャーに対して
sub.Init()を呼び出します。[DefaultExecutionOrder(-10000)] を持つのは、このスクリプトだけにします。 - プッシュせず、プルする:データを必要とする購読側は、必要に応じて
source.GetValue()を呼び出すか、イベントを購読します。パブリッシャーが自身のAwake中に他のオブジェクトへデータをプッシュすると、隠れた順序依存が生まれます。 [DefaultExecutionOrder(n)]は、重要なシングルトン(Bootstrap、InputRouter、SceneController など)に限って使用します。 必要とするスクリプトが3~4個を超える場合、問題は実行順序ではなくアーキテクチャにあります。
類似する ECS のパターンである [UpdateBefore(typeof(BarSystem))]/[UpdateAfter] が機能するのは、フレームワークがソート時に矛盾を検証するためです。MonoBehaviour のコードではコンパイラーが矛盾を検出しないため、慎重に使用してください。出典:EntitiesSamples/Docs/systems.md:32 —「グループの子の順序属性が矛盾を生じさせる場合、例外がスローされる」。
更新の前提条件を明示する
すべての Update/LateUpdate/FixedUpdate の先頭にガード節を置き、システムの準備ができていない場合は早期リターンするようにします。最もコストの低いチェックを先に行ってください。
void Update() {
if (!_isInitialized) return; // construction-time
if (_dataSource == null) return; // dependency-level
if (_paused) return; // gameplay-state
// real work here
}
ガードがない場合、「まだ実行されない」(安全)か、「古いデータや null データを使って実行され、状態を気づかれないまま破損させる」(デバッグ上の悪夢)かの違いが生じます。ECS で同等の処理を行うには、OnCreate で state.RequireForUpdate<Config>() を使い、前提条件をシステムレベルの不変条件にします。出典:Dots101/Entities101/Assets/HelloCube/3. Prefabs/SpawnSystem.cs:17-19 — Spawner エンティティが存在しない限り、システムは更新されません。
ガードレール
モード:ドキュメントのみ — 制限対象となる REST スキルはありません。どの動作モード(Approval / Auto / Bypass)でも自由に読み込めます。
- プロジェクトで本当に必要でない限り、巨大で再利用可能なフレームワークから始めないでください。
- 教科書的な SOLID の表現を満たすためだけにレイヤーを追加しないでください。
- イテレーションを遅らせる見栄えのよいアーキテクチャではなく、成長できる小さなアーキテクチャを優先してください。
必要に応じて関連するアドバイザリーモジュールを読み込む
- パターンの選択:
../patterns/SKILL.mdを参照してください - Async / Update / UniTask の判断:
../async/SKILL.mdを参照してください - インスペクターに表示するフィールドの設計:
../inspector/SKILL.mdを参照してください - スクリプト品質のレビュー:
../scriptdesign/SKILL.mdを参照してください