mcpField
U
unity-networking

unity-networking

github.com/josiahsiegel開発5999 回インストール19 週間前に更新
リポジトリ

unity-networking について

Unity でマルチプレイヤーゲームやバックエンド連携機能を開発する人向けのリファレンスです。ネットワークフレームワークを比較し、権限モデル、マルチプレイヤーの構成、REST と WebSocket 通信、Unity Gaming Services を解説します。

主な機能

  1. 01ネットワークフレームワークの比較
  2. 02Netcode for GameObjects の設定とコンポーネント
  3. 03権限モデルと RPC パターン
  4. 04ロビー、スポーン、シーン同期
  5. 05REST と WebSocket の連携
  6. 06Unity Gaming Services の概要

活用シーン

  1. 01Unity ゲーム用のネットワークフレームワーク選定
  2. 02サーバー権威型のプレイヤー操作を設計
  3. 03ロビーと Relay の接続フローを構築
  4. 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)

セットアップ
  1. パッケージマネージャーからインストールします:com.unity.netcode.gameobjects
  2. シーン内の GameObject に NetworkManager を追加します
  3. トランスポートを選択します(デフォルトは Unity Transport です)
  4. ネットワーク化するプレハブに NetworkObject コンポーネントを付けます
  5. NetworkManager のプレハブリストにプレハブを登録します
コアコンポーネント
コンポーネント目的
NetworkManager接続、スポーン、シーン管理を行います
NetworkObjectネットワーク化するすべての GameObject に必要です
NetworkBehaviourネットワーク対応スクリプトの基底クラスです(MonoBehaviour の代わりに使用します)
NetworkVariable<T>所有権や権限を設定できる同期変数です
NetworkTransform位置と回転を自動的に同期します
NetworkAnimatorAnimator のパラメーターを自動的に同期します
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)

サービスパッケージ用途
Authenticationcom.unity.services.authentication匿名/プラットフォームでのサインイン
Lobbycom.unity.services.lobbyルーム作成、マッチメイキング
Relaycom.unity.services.relayP2P の NAT トラバーサル
Cloud Savecom.unity.services.cloudsaveサーバー側のプレイヤーデータ
Leaderboardscom.unity.services.leaderboardsランキング形式のスコアボード
Economycom.unity.services.economy仮想通貨、購入
Analyticscom.unity.services.analyticsプレイヤー行動の追跡
Matchmakercom.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 アーキテクチャ、認証フロー、リーダーボードとエコノミーの実装

コメント