Unity 2018.2 - UNet Matchmaking работает только в локальной сети
Я пытаюсь реализовать UNET Matchmaking на основе учебного пособия от Brackeys.
Я уже включил многопользовательские сервисы в своей учетной записи Unity и включил сервис.
Когда я пытаюсь создать совпадение и найти его с другого компьютера в моей локальной сети, он работает отлично.
Когда я пытаюсь создать совпадение и находить его на другом компьютере за пределами локальной сети, я не вижу совпадения в списке совпадений.
Я уже искал документы и Google, но ничего не нашел об этом.
У кого-нибудь есть подсказка?
Кстати, вот мой скрипт JoinRoom.
Функция возврата из функции обратного вызова успешна, но список комнат возвращается пустым.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using UnityEngine.Networking.Match;
using System;
public class JoinGame : MonoBehaviour
{
List<GameObject> roomList = new List<GameObject>();
[SerializeField] GameObject roomListItemPrefab;
[SerializeField] Transform roomListParent;
[SerializeField] Text status;
private NetworkManager networkManager;
void Start()
{
networkManager = NetworkManager.singleton;
if (networkManager.matchMaker == null)
{
networkManager.StartMatchMaker();
}
RefreshRoomList();
}
public void RefreshRoomList()
{
ClearRoomList();
networkManager.matchMaker.ListMatches(0, 20, "", false, 0, 0, OnMatchList);
status.text = "Loading...";
}
public void OnMatchList(bool success, string extendedInfo, List<MatchInfoSnapshot> responseData)
{
status.text = "";
if (!success)
{
status.text = "Couldn't get room list";
return;
}
responseData.ForEach(match =>
{
GameObject _roomListItemGO = Instantiate(roomListItemPrefab);
_roomListItemGO.transform.SetParent(roomListParent);
RoomListItem _roomListItem = _roomListItemGO.GetComponent<RoomListItem>();
if (_roomListItem != null)
{
_roomListItem.Setup(match, JoinRoom);
}
//as well as setting up a callback function that will join the game
roomList.Add(_roomListItemGO);
});
if (roomList.Count == 0)
{
status.text = "No rooms at the moment";
}
}
public void JoinRoom(MatchInfoSnapshot _match)
{
Debug.Log($"Joining {_match.name}");
networkManager.matchMaker.JoinMatch(_match.networkId, "", "", "", 0, 0, networkManager.OnMatchJoined);
ClearRoomList();
status.text = $"Joining {_match.name}...";
}
private void ClearRoomList()
{
roomList.ForEach(item =>
{
Destroy(item);
});
roomList.Clear();
}
}
2 ответа
Вся проблема связана с балансировщиками нагрузки серверов Unity MM.
Мой код работал только в моей локальной сети, потому что сервер создавался в том же регионе США.
Это произошло потому, что в моей локальной сети есть VPN с Канадой.
Когда я подключался с компьютера за пределами локальной сети, меня перенаправляли в другой регион, поэтому я не могу найти сервер, созданный моей машиной локальной сети.
После развертывания на двух компьютерах за пределами моей локальной сети они оба могут создавать и подключать еще один сервер.
Я на самом деле понял проблему. Во-первых, вам необходимо обновить конфигурацию и убедиться, что облачная конфигурация находится в рабочем состоянии и многопользовательская служба включена, иногда она просто случайным образом отключается. Затем вы должны выбрать сервер для сватовства напрямую, назвав его, например, я использую европейский сервер eu1-mm.unet.unity3d.com. Если вы просто используете mm.unet.unity3d.com, он может разместить вашу игру на другом сервере, чем ваш клиент И игроки на разных серверах не собираются видеться друг с другом. В качестве альтернативы вы можете запустить собственный локальный сервер и перенаправить ваш IP-адрес, а затем использовать его в качестве IP-адреса хоста на стороне клиента. За исключением случаев, когда у вас динамический IP-адрес, вы можете использовать такие сервисы, как no-ip, чтобы получить статический домен для вашего IP-адреса. Я использую этот метод сейчас и плюс это бесплатно.