Как получить фактическое количество соединений для NetworkServer в Unity

Я собираюсь разработать простой мультиплеер для моего игрового проекта Unity. Я начал с HLAPI, но он кажется очень медленным при порождении и синхронизации состояний, поэтому я решил вместо этого исследовать интернет-сервисы Unity, начиная с базовых примеров на https://docs.unity3d.com/Manual/UNetInternetServicesOverview.html. Проблема здесь в устаревших ссылках, поэтому я не уверен, что причиной моих проблем является моё недопонимание или ошибочная структура ((

Во всяком случае, я взял первый пример, начал его модифицировать и не могу понять соответствие между "соединениями" и "клиентами" для сервера.

А именно,

  • Я создаю матч с networkMatch.CreateMatch метод.
  • Затем в OnMatchCreate обратный звонок я проверяю значение NetworkServer.connections.Count - это 0.
  • Тогда я звоню networkMatch.ListMatches и увидеть matchInfoSnapshot.currentSize созданного совпадения в обратном вызове - это 1.
  • я проверяю NetworkServer.connections.Count в том же обратном вызове - все равно 0 (!!!). я проверяю NetworkServer.localConnections.Count - это тоже 0

Хорошо, я предположил, что локальный клиент не производит никакого соединения с сервером (???), давайте проверим это.

  • Тогда я звоню networkMatch.JoinMatch от того же клиента - все получится.
  • Тогда я звоню networkMatch.ListMatches снова и увидеть matchInfoSnapshot.currentSize моего матча в колбэке - сейчас 2.
  • я проверяю NetworkServer.connections.Count в том же обратном вызове - и теперь тоже 2 (!!!) (пока NetworkServer.localConnections.Count остается 0).

Итак, вопрос прост - я не хочу добавлять какие-либо переменные счетчика, но...как я могу получить фактическое количество подключенных клиентов на сервере?

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);
        }
    }

И это вывод консоли: Консольный вывод

1 ответ

Вы можете использовать NetworkServer.numPlayers

Однако NetworkServer предназначен только для серверной части. Если вам нужно, чтобы ваши клиенты знали, сколько еще клиентов, вам нужно синхронизировать переменную.

Если вы являетесь клиентом, используйте NetworkClient.allClients, чтобы получить соединение с вашим сервером.

Другие вопросы по тегам