unity-networking について
Unity でマルチプレイヤーゲームやバックエンド連携機能を開発する人向けのリファレンスです。ネットワークフレームワークを比較し、権限モデル、マルチプレイヤーの構成、REST と WebSocket 通信、Unity Gaming Services を解説します。
主な機能
- 01ネットワークフレームワークの比較
- 02Netcode for GameObjects の設定とコンポーネント
- 03権限モデルと RPC パターン
- 04ロビー、スポーン、シーン同期
- 05REST と WebSocket の連携
- 06Unity Gaming Services の概要
活用シーン
- 01Unity ゲーム用のネットワークフレームワーク選定
- 02サーバー権威型のプレイヤー操作を設計
- 03ロビーと Relay の接続フローを構築
- 04ゲーム機能をバックエンド API やサービスに接続
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill unity-networkingインストール後、Claude Code で/unity-networkingを入力して読み込まれたか確認します。
詳細
Unity のネットワークとマルチプレイヤー
概要
Unity でマルチプレイヤーシステムやバックエンドサービスを実装するためのリファレンスです。主要なネットワークフレームワーク、権限モデル、一般的なマルチプレイヤーパターン、Unity Gaming Services との統合について説明します。
ネットワークフレームワークの比較
| フレームワーク | 種類 | 最適な用途 | ライセンス |
|---|---|---|---|
| Netcode for GameObjects (NGO) | クライアントホスト型/専用サーバー型 | Unity ネイティブのプロジェクト、UGS との統合 | 無料(Unity) |
| Mirror | クライアントホスト型/専用サーバー型 | オープンソースの代替手段、成熟したエコシステム | MIT |
| Photon PUN 2 | クラウドホスト型 | 素早いプロトタイピング、ルームベースのゲーム | 無料枠+有料 |
| Photon Fusion 2 | クラウド/セルフホスト可能 | 対戦ゲーム、ティックベースのシミュレーション | 無料枠+有料 |
| Fish-Net | クライアントホスト型/専用サーバー型 | パフォーマンス重視、Mirror の代替手段 | MIT |
Netcode for GameObjects (NGO)
セットアップ
- パッケージマネージャーからインストールします:
com.unity.netcode.gameobjects - シーン内の GameObject に
NetworkManagerを追加します - トランスポートを選択します(デフォルトは Unity Transport です)
- ネットワーク化するプレハブに
NetworkObjectコンポーネントを付けます - NetworkManager のプレハブリストにプレハブを登録します
コアコンポーネント
| コンポーネント | 目的 |
|---|---|
NetworkManager | 接続、スポーン、シーン管理を行います |
NetworkObject | ネットワーク化するすべての GameObject に必要です |
NetworkBehaviour | ネットワーク対応スクリプトの基底クラスです(MonoBehaviour の代わりに使用します) |
NetworkVariable<T> | 所有権や権限を設定できる同期変数です |
NetworkTransform | 位置と回転を自動的に同期します |
NetworkAnimator | Animator のパラメーターを自動的に同期します |
RPC(リモートプロシージャコール)
public class PlayerCombat : NetworkBehaviour
{
NetworkVariable<int> _health = new(100,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
[ServerRpc]
void AttackServerRpc(ulong targetId)
{
// Runs on server - validate and apply damage
if (!IsServer) return;
var target = NetworkManager.SpawnManager.SpawnedObjects[targetId];
target.GetComponent<PlayerCombat>().TakeDamage(10);
}
[ClientRpc]
void PlayHitEffectClientRpc(Vector3 position)
{
// Runs on all clients - visual feedback only
Instantiate(hitVFX, position, Quaternion.identity);
}
void TakeDamage(int amount)
{
_health.Value -= amount;
PlayHitEffectClientRpc(transform.position);
}
}
| RPC の種類 | 方向 | 用途 |
|---|---|---|
[ServerRpc] | クライアント -> サーバー | プレイヤーのアクション、リクエスト |
[ClientRpc] | サーバー -> すべてのクライアント | VFX、サウンド、UI の更新 |
[ClientRpc(SendTo.Owner)] | サーバー -> オーナークライアント | オーナー固有のフィードバック |
NetworkVariable の権限
// Server-writable (default) - authoritative state
NetworkVariable<int> score = new(0, writePerm: NetworkVariableWritePermission.Server);
// Owner-writable - client-authoritative (use sparingly)
NetworkVariable<Vector3> cursorPos = new(writePerm: NetworkVariableWritePermission.Owner);
UI の反応には OnValueChanged コールバックを使用します:
_health.OnValueChanged += (oldVal, newVal) => healthBar.value = newVal;
権限モデル
| モデル | 説明 | 使用する場面 |
|---|---|---|
| サーバー権限型 | サーバーがすべてのアクションを検証し、クライアントは最小限の役割を担います | 対戦ゲーム、不正対策が重要な場合 |
| クライアント権限型 | クライアントが自身の状態を所有し、サーバーは中継します | 協力プレイ、信頼ベースの場合 |
| クライアント予測+サーバー調整 | クライアントがローカルで予測し、サーバーが修正します | FPS、テンポの速いアクション |
| リレー/リッスンサーバー | 1 人のプレイヤーがホストとなり、他のプレイヤーはリレー経由で接続します | カジュアル、小規模なロビー |
サーバー権限型のフロー
Client: Press "Attack" -> Send ServerRpc(targetId)
Server: Validate range/cooldown -> Apply damage -> Update NetworkVariable
Server: Send ClientRpc for VFX
All Clients: Play hit effect
クライアントからのデータを決して信頼しないでください。サーバー側で位置、クールダウン、弾薬、射線を検証します。
一般的なマルチプレイヤーパターン
ロビーシステム
1. Player authenticates (UGS Auth / custom)
2. Player creates or joins lobby (UGS Lobby / custom)
3. Lobby fills -> host starts game
4. Relay allocation for NAT traversal (UGS Relay)
5. All players connect to relay
6. NetworkManager starts host/client
スポーンとデスポーン
// Server-side spawning
var instance = Instantiate(prefab, spawnPoint, Quaternion.identity);
instance.GetComponent<NetworkObject>().SpawnWithOwnership(clientId);
// Server-side despawning
networkObject.Despawn(); // Removes from all clients
シーン管理
同期されたシーンの読み込みには NetworkManager.SceneManager.LoadScene("GameScene", LoadSceneMode.Single) を使用します。これを呼び出すのはサーバー/ホストのみにしてください。
REST API と WebSocket の統合
REST API(UnityWebRequest)
async Awaitable<T> GetAsync<T>(string url)
{
using var request = UnityWebRequest.Get(url);
request.SetRequestHeader("Authorization", $"Bearer {token}");
await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
throw new Exception(request.error);
return JsonUtility.FromJson<T>(request.downloadHandler.text);
}
単純な型には JsonUtility を、複雑なシリアル化には Newtonsoft.Json(com.unity.nuget.newtonsoft-json)を使用します。メモリリークを防ぐため、UnityWebRequest では必ず using を使用してください。
WebSocket(NativeWebSocket / WebSocketSharp)
チャットや通知など、ゲーム以外のリアルタイム通信には WebSocket ライブラリを使用します。NativeWebSocket は WebGL を含む複数のプラットフォームで動作します。
Unity Gaming Services (UGS)
| サービス | パッケージ | 用途 |
|---|---|---|
| Authentication | com.unity.services.authentication | 匿名/プラットフォームでのサインイン |
| Lobby | com.unity.services.lobby | ルーム作成、マッチメイキング |
| Relay | com.unity.services.relay | P2P の NAT トラバーサル |
| Cloud Save | com.unity.services.cloudsave | サーバー側のプレイヤーデータ |
| Leaderboards | com.unity.services.leaderboards | ランキング形式のスコアボード |
| Economy | com.unity.services.economy | 仮想通貨、購入 |
| Analytics | com.unity.services.analytics | プレイヤー行動の追跡 |
| Matchmaker | com.unity.services.matchmaker | スキルベースのマッチメイキング |
サービスを使用する前に UGS を初期化してください:
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();
Firebase と PlayFab
Realtime Database、Cloud Functions、FCM プッシュ通知を必要とするインディー/モバイルプロジェクトでは Firebase を使用してください。プレイヤーのセグメンテーション、A/B テスト、自動化されたルール処理を必要とする LiveOps 中心のゲームでは PlayFab を使用してください。どちらも、それぞれのダウンロードページから Unity SDK を提供しています。
その他のリソース
参照ファイル
references/netcode-advanced.md-- クライアント予測と調整の実装、関心領域管理、ネットワーク LOD、帯域幅の最適化、カスタムシリアル化、トランスポート層の設定references/backend-services.md-- UGS の詳細なセットアップ手順、Firebase/PlayFab の統合パターン、REST API アーキテクチャ、認証フロー、リーダーボードとエコノミーの実装