Unity 2018.2 - UNet Matchmaking работает только в локальной сети - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь внедрить систему сопоставления UNET на основе учебного пособия от Brackeys.

Я уже включил многопользовательские службы в своей учетной записи Unity и включил службу.

Когда я пытаюсьчтобы создать совпадение и найти его на другом ПК в моей локальной сети, оно отлично работает.

Когда я пытаюсь создать совпадение и найти его на другом ПК за пределами моей локальной сети, я не вижу совпадения всписок совпадений.

Я уже искал документы и гугл, но ничего о них не нашел.

У кого-нибудь есть подсказка?

Кстати, вот мойСкрипт 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 ]

0 голосов
/ 11 ноября 2018

Вся проблема связана с балансировщиками нагрузки серверов Unity MM.

Мой код работал только в моей локальной сети, поскольку сервер создавался в том же регионе США.

Это произошлопотому что моя локальная сеть имеет VPN с Канадой.

Когда я подключался с компьютера за пределами локальной сети, меня перенаправляли в другой регион, поэтому я не могу найти сервер, созданный моей машиной локальной сети.

После развертывания на двух компьютерах за пределами моей локальной сети они оба могут создавать и подключать еще один сервер.

0 голосов
/ 06 ноября 2018

Я на самом деле понял проблему. Во-первых, вам необходимо обновить конфигурацию и убедиться, что облачная конфигурация находится в рабочем состоянии и включена многопользовательская служба, иногда она просто случайным образом отключается. Затем вы должны выбрать сервер для поиска матчей напрямую, назвав его, например, я использую европейский сервер eu1-mm.unet.unity3d.com. Если вы просто используете mm.unet.unity3d.com, он может разместить вашу игру на другом сервере, чем ваш клиент И игроки на разных серверах не собираются видеться друг с другом. В качестве альтернативы вы можете запустить свой собственный локальный сервер и перенаправить свой IP-адрес, а затем использовать его в качестве IP-адреса своего хоста на стороне клиента. За исключением случаев, когда у вас динамический IP, вы можете использовать такие сервисы, как no-ip, чтобы получить статический домен для вашего IP. Сейчас я использую этот метод, плюс он бесплатный.

...