unity-netcode-design について
Netcode for GameObjects 2.x でマルチプレイヤーコードを開発・レビューする人向けのドキュメントスキルです。ライフサイクル、RPC、ネットワーク変数、スポーン、シーン、トランスポート設定をソース付きで解説します。
主な機能
- 01NetworkBehaviour のライフサイクル指針
- 02RPC と所有権のルール
- 03NetworkVariable のシリアライズ制約
- 04NetworkObject のスポーンとシーンのルール
- 05UnityTransport の設定指針
活用シーン
- 01マルチプレイヤーゲームコードのレビュー
- 02サーバー権威または分散権威の設計
- 03RPC とネットワーク変数の動作調査
- 04ネットワークオブジェクトとトランスポートの設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ besty0728/ unity-skills --skill unity-netcode-designインストール後、Claude Code で/unity-netcode-designを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LIFECYCLE.mdOWNERSHIP.mdPITFALLS.mdRPC.mdSCENE.mdSPAWNING.mdTRANSPORT.mdVARIABLES.md詳細
このモジュールのスキルを呼び出す前に: スキル名や説明からパラメーターを推測してスキルを呼び出そうとしている場合は、そこで止まり、まずこのファイルを読むか、
GET /skills/recommend?includeSchema=trueでスキーマを取得してください。recommend/schema からパラメーターの定義をすでに取得している場合は、そのまま dryRun に進んで構いません。
トリガー
- マルチプレイヤーコードの作成またはレビュー
- サーバー/分散権限の設計
- RPC または NetworkVariable の接続
- netcode のデバッグ
- マルチプレイヤーコードの作成またはレビュー、サーバー/分散権限の設計、RPC またはネットワーク変数の接続、netcode 問題の調査
Netcode for GameObjects - 設計ルール
参考用モジュールです。すべてのルールは com.unity.netcode.gameobjects 2.x のソースから抽出したものです。各ルールには、根拠を確認できるよう具体的なファイル/行が記載されています。
モード:ドキュメントのみ — 制限対象の REST スキルはありません。どの動作モード(Approval / Auto / Bypass)でも自由に読み込めます。
このモジュールを読み込むタイミング
以下を作成またはレビューする前に読み込んでください。
- NetworkBehaviour スクリプト(OnNetworkSpawn / OnNetworkDespawn / RPC / NetworkVariable)
- NetworkManager の起動/終了/シーン切り替え
- NetworkObject の Spawn / Despawn / ChangeOwnership / TrySetParent
- UnityTransport の設定(直接接続/Relay)
- IsHost / IsServer / IsClient / IsOwner に基づいて分岐するコード
重要ルールの概要(サブドキュメントを読み飛ばす場合も覚えておいてください)
| # | ルール | 参照箇所 |
|---|---|---|
| 1 | Spawn() / Despawn() は Server/Host でのみ呼び出す必要があります。クライアント側から呼び出すと失敗します。 | Runtime/Core/NetworkObject.cs:1884, 1921 |
| 2 | OnNetworkSpawn() は Unity の Start() より前に、Awake/OnEnable より後に実行されます。 | Runtime/Core/NetworkBehaviour.cs:704 + InvokeBehaviourNetworkSpawn callers |
| 3 | 従来の [ServerRpc] メソッド名は末尾が ServerRpc である必要があります。[ClientRpc] の末尾は ClientRpc である必要があります(ILPP によりコンパイル時に適用されます)。 | Editor/CodeGen/ ILPP validators |
| 4 | 新しい [Rpc(SendTo.X)] に命名上の制約はありません。SendTo には 11 個の値があります。 | Runtime/Messaging/RpcTargets/RpcTarget.cs:9-80 |
| 5 | PlayerPrefab は NetworkPrefabsList または NetworkConfig.Prefabs に存在する必要があります。存在しない場合、2.x ランタイムで拒否されます。 | Runtime/Configuration/NetworkConfig.cs:40 + NetworkPrefabsList.cs:14 |
| 6 | 入れ子の NetworkObject は禁止されています(NetworkObject を含む NetworkObject プレハブ)。実行時には TrySetParent で親子関係を変更してください。 | Runtime/Core/NetworkObject.cs:2135-2215 |
| 7 | NetworkVariable<T> では、T が unmanaged であるか、INetworkSerializable を実装している必要があります。string、List<>、class は拒否されます。 | Runtime/NetworkVariable/NetworkVariable.cs:12 + ILPP |
| 8 | NetworkList<T> では T: unmanaged, IEquatable<T> が必要です。NetworkVariable<List<T>> ではありません。 | Runtime/NetworkVariable/Collections/NetworkList.cs:14 |
| 9 | NetworkSceneManager.LoadScene/UnloadScene は Server でのみ実行できます。 | Runtime/SceneManagement/NetworkSceneManager.cs:1496, 1252 |
| 10 | UnityTransport.SetRelayServerData と SetConnectionData は相互に排他的です。どちらか一方を使用してください。 | Runtime/Transports/UTP/UnityTransport.cs:776-897 |
サブドキュメントの参照先
| サブドキュメント | 読むタイミング |
|---|---|
| LIFECYCLE.md | ライフサイクル、コールバックの実行順序、Awake/OnNetworkSpawn/Start の違い |
| OWNERSHIP.md | IsOwner/IsServer/IsHost の権限マトリックス、ChangeOwnership、分散権限 |
| RPC.md | RPC 属性の選択、SendTo のセマンティクス、RpcInvokePermission、非推奨の方法 |
| VARIABLES.md | NetworkVariable/NetworkList の初期化とシリアル化の制約 |
| SPAWNING.md | プレハブの登録 → Spawn → Despawn、GlobalObjectIdHash、SpawnAsPlayerObject |
| SCENE.md | NetworkSceneManager、EnableSceneManagement、シーン内オブジェクトの同期 |
| TRANSPORT.md | UnityTransport の直接接続/Relay/DebugSimulator の設定 |
| PITFALLS.md | 具体的なハルシネーションの落とし穴 30 件 |
他のモジュールへの振り分け
- NetworkBehaviour スクリプトの生成 → 機能モジュール
netcodeのnetcode_add_network_behaviour_scriptを使用します - シーン内での NetworkObject/NetworkTransform の一括アタッチ →
netcodeモジュールの Components スキルを使用します - アーキテクチャレベルの判断(サーバー権限型か分散オーソリティか) → architecture も読み込みます
バージョンの対象範囲
このドキュメントは com.unity.netcode.gameobjects 2.x を対象としています(2.11.0、Unity 6000.0 以降で検証済み)。一部の API(SendTo.Authority、RpcInvokePermission、ユニバーサルな [Rpc] 属性)は 1.x には存在しません。