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-адреса. Я использую этот метод сейчас и плюс это бесплатно.

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