Как получить фактическое количество соединений для 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, чтобы получить соединение с вашим сервером.