1

Unity ゲーム プロジェクト用の単純なマルチプレイヤーを開発します。私は HLAPI から始めましたが、スポーン状態と同期状態が非常に遅いように見えるので、 https ://docs.unity3d.com/Manual/ の基本的な例から始めて、代わりに Unity インターネット サービスを調査することにしました。 UNetInternetServicesOverview.html . ここでの問題は古いリファレンスにあるため、問題の原因が私の誤解なのかバグのあるフレームワークなのかはわかりません.(

とにかく、最初の例を取り上げて、それを修正し始めたところ、サーバーの「接続」と「クライアント」の対応がわかりません。

すなわち、

  • メソッドで一致を作成しますnetworkMatch.CreateMatch
  • 次に、OnMatchCreateコールバックで値を確認しますNetworkServer.connections.Count-0です。
  • 次に、コールバックで作成された一致を呼び出しnetworkMatch.ListMatchesて確認します。これは 1 です。matchInfoSnapshot.currentSize
  • 同じコールバックをチェックインNetworkServer.connections.Countしましたが、まだ 0 です (!!!)。私はチェックNetworkServer.localConnections.Countします-それも0です。

OK、ローカル クライアントがサーバーへの接続を作成していないと推測しました (???)。確認してみましょう。

  • 次に、同じクライアントから呼び出しnetworkMatch.JoinMatchます-成功します。
  • 次にnetworkMatch.ListMatches、もう一度呼び出しmatchInfoSnapshot.currentSizeて、コールバックで一致を確認します。現在は 2 です。
  • 私は同じコールバックをチェックインNetworkServer.connections.Countします - そしてそれは今も 2 です (!!!) (ながらNetworkServer.localConnections.Count0 のままです)。

ですから、質問は簡単です - 私は愚かなカウンター変数を追加したくないのですが... サーバーに接続されているクライアントの実際の数を取得するにはどうすればよいですか?

PS: テストする簡略化されたスクリプト:

    using UnityEngine;
    using UnityEngine.Events;
    using UnityEngine.Networking;
    using UnityEngine.Networking.Types;
    using UnityEngine.Networking.Match;
    using System.Collections.Generic;

    public class TestNetworkController : MonoBehaviour
    {
        private NetworkMatch networkMatch;

        void Start () {
            networkMatch = gameObject.AddComponent<NetworkMatch>();

            networkMatch.CreateMatch ("TestMatch", 4, true, "", "", "", 0, 1, OnMatchCreate);
        }

        private void OnMatchCreate(bool success, string extendedInfo, MatchInfo matchInfoResponse) {
            NetworkServer.RegisterHandler (MsgType.Connect, OnServerConnect);

            if (!NetworkServer.Listen (matchInfoResponse, 9000)) {
                success = false;
            }

            if (success) {
                Debug.Log ("Match created, connections="+NetworkServer.connections.Count+" localConnections="+NetworkServer.localConnections.Count);

                networkMatch.ListMatches(0, 20, "", true, 0, 1, OnMatchesListPage1);
            }
        }

        private void OnMatchesListPage1(bool success, string extendedInfo, List<MatchInfoSnapshot> matchListResponse) {
            Debug.Log ("Match list received, connections=" + NetworkServer.connections.Count + " localConnections=" + NetworkServer.localConnections.Count);
            Debug.Log ("Match 0 size "+matchListResponse[0].currentSize);

            networkMatch.JoinMatch (matchListResponse[0].networkId, "", "", "", 0, 1, OnMatchJoined);
        }

        private void OnMatchJoined(bool success, string extendedInfo, MatchInfo matchInfoResponse) {
            if (success) {
                NetworkClient networkClient = new NetworkClient ();

                networkClient.RegisterHandler (MsgType.Connect, OnClientConnect);
                networkClient.Connect (matchInfoResponse);

                Debug.Log ("Match 0 joined, connections=" + NetworkServer.connections.Count + " localConnections=" + NetworkServer.localConnections.Count);
            }
        }

        private void OnServerConnect(NetworkMessage networkMessage) {
            Debug.Log("Client connected, connections="+NetworkServer.connections.Count);

            networkMatch.ListMatches(0, 20, "", true, 0, 1, OnMatchesListPage2);
        }

        private void OnClientConnect(NetworkMessage networkMessage) {
            Debug.Log("Connected to server, connections="+NetworkServer.connections.Count);
        }

        private void OnMatchesListPage2(bool success, string extendedInfo, List<MatchInfoSnapshot> matchListResponse) {
            Debug.Log ("Match list received, connections=" + NetworkServer.connections.Count + " localConnections=" + NetworkServer.localConnections.Count);
            Debug.Log ("Match 0 size "+matchListResponse[0].currentSize);
        }
    }

そしてそれはコンソール出力です: コンソール出力

4

1 に答える 1