Unity 2018.2 - UNet 对接会仅适用于 LAN

Unity 2018.2 - UNet Matchmaking only works at LAN

我正在尝试根据 Brackeys 的教程实施 UNET 配对系统。

我已经在我的 Unity 帐户中启用了多人游戏服务并启用了该服务。

当我尝试创建一个匹配项并从我局域网中的另一台 PC 找到它时,它完美无缺。

当我尝试创建一个匹配项并从我的 LAN 之外的另一台 PC 上找到它时,我在匹配项列表中看不到该匹配项。

我已经搜索了文档和 google 但没有找到任何相关信息。

有人知道吗?

顺便说一句,这是我的 JoinRoom 脚本。

回调函数 return 成功,但返回的房间列表为空。

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

其实我也想通了。首先,您必须刷新配置并确保云配置处于工作状态并且启用了多人服务,有时它只是随机关闭。那么你应该通过命名直接选择匹配服务器,因为我使用的是欧洲服务器 eu1-mm.unet.unity3d.com 如果你只是使用 mm.unet.unity3d.com 它可以在与您的客户端不同的服务器上托管您的游戏。而且不同服务器的玩家不会互相看到对方。或者,您可以启动自己的本地服务器并端口转发您的 IP,然后将其用作客户端的主机 IP。除非你有动态 IP,否则你可以使用像 no-ip 这样的服务来为你的 IP 获取静态域。我现在正在使用这个方法,而且它是免费的。

整个问题与 Unity MM 服务器负载平衡器有关。

我的代码只能在我的 LAN 中运行,因为服务器是在同一美国地区创建的。

发生这种情况是因为我的局域网有连接加拿大的 VPN。

当我从 LAN 外的 PC 连接时,我被定向到另一个区域,这就是为什么我找不到由我的 LAN 计算机创建的服务器的原因。

部署到局域网外的两台计算机后,它们都可以创建并连接另一台服务器。