14

現在のゲーム状態 (誰のターンかなど) を制御するゲーム マネージャーが必要なマルチプレイヤー ターンベースの戦略ゲームがあります。このマネージャーはすべてのクライアントに共通である必要があり、その状態はサーバー上で同期される必要があります。

これを行う方法は次のとおりです。ゲームマネージャーオブジェクトはNetworkBehaviourであり、ローカルプレーヤー権限でもサーバー権限でもないNetworkIdentityを持っています。カスタム NetworkManager を作成し、クライアント接続でゲーム マネージャーを生成し、それがサーバーであるかどうかもテストします。コードは次のとおりです。

public override void OnClientConnect(NetworkConnection conn)
    {
        ClientScene.Ready(conn);
        if (NetworkServer.active)
        {
            var manager = Instantiate(MultiplayerManagerPrefab, Vector3.zero, Quaternion.identity) as GameObject;
            var tacticsManager = manager.GetComponent<MultiplayerManagerModel>();
            NetworkServer.RegisterHandler(MsgType.AddPlayer, tacticsManager.CreatePlayerOnServer);
            NetworkServer.Spawn(manager);
        }
        ClientScene.AddPlayer(0);
    }

サーバー上で実行すると、正常に動作し、クライアント上にインスタンスが作成され、サーバーからクライアントへ変数が同期されます。しかし、クライアントからコマンドを実行しようとすると、コマンドは無視され、次の警告がスローされます。

権限のないオブジェクトに対してコマンドを送信しようとしています。UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter, Int32, String)

このゲーム マネージャーは、プレイヤーのスポーンを担当する必要があるため、どのプレイヤーよりも先にスポーンされることに注意してください。私は何を間違っていますか?

4

3 に答える 3