C# Unity 2018.2-UNet配对仅适用于LAN

C# Unity 2018.2-UNet配对仅适用于LAN,c#,unity3d,unity3d-unet,matchmaking,C#,Unity3d,Unity3d Unet,Matchmaking,我正试图实现基于Brackeys教程的UNET配对系统 我已经在我的Unity帐户中启用了多人游戏服务并启用了该服务 当我尝试创建一个匹配,并从局域网中的另一台PC上找到它时,它工作得非常完美 当我尝试创建一个匹配项并从局域网外的另一台电脑中查找它时,我在匹配项列表中看不到该匹配项 我已经搜索了文档和谷歌,但没有找到任何关于它的信息 有人有线索吗 顺便说一下,这是我的JoinRoom脚本 回调函数返回成功,但房间列表返回为空 using System.Collections.Generic; u

我正试图实现基于Brackeys教程的UNET配对系统

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

当我尝试创建一个匹配,并从局域网中的另一台PC上找到它时,它工作得非常完美

当我尝试创建一个匹配项并从局域网外的另一台电脑中查找它时,我在匹配项列表中看不到该匹配项

我已经搜索了文档和谷歌,但没有找到任何关于它的信息

有人有线索吗

顺便说一下,这是我的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();
    }
}
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
使用UnityEngine。联网;
使用UnityEngine.Networking.Match;
使用制度;
公共类游戏:单一行为
{
List roomList=新列表();
[SerializeField]GameObject RoomListItemPrefact;
[序列化字段]转换roomListParent;
[序列化字段]文本状态;
专用网络管理器;
void Start()
{
networkManager=networkManager.singleton;
if(networkManager.matchMaker==null)
{
networkManager.StartMatchMaker();
}
RefreshRoomList();
}
公共房间列表()
{
ClearRoomList();
networkManager.matchMaker.ListMatches(0,20,”,false,0,0,OnMatchList);
status.text=“正在加载…”;
}
public void OnMatchList(bool successfuccess,string extendedInfo,List responseData)
{
status.text=“”;
如果(!成功)
{
status.text=“无法获取房间列表”;
返回;
}
responseData.ForEach(匹配=>
{
GameObject\u roomListItemGO=实例化(roomListItemPrefab);
_roomListItemGO.transform.SetParent(roomListParent);
RoomListItem\u RoomListItem=\u roomListItemGO.GetComponent();
如果(_roomListItem!=null)
{
_roomListItem.设置(匹配,JoinRoom);
}
//以及设置一个将加入游戏的回调函数
roomList.Add(_roomListItemGO);
});
if(roomList.Count==0)
{
status.text=“目前没有房间”;
}
}
公共无效JoinRoom(匹配信息快照\u匹配)
{
Log($“加入{u match.name}”);
networkManager.matchMaker.JoinMatch(_match.networkId,“,”,“,”,0,0,networkManager.OnMatchJoined);
ClearRoomList();
status.text=$“加入{u match.name}…”;
}
私有void ClearRoomList()
{
roomList.ForEach(项目=>
{
销毁(物品);
});
roomList.Clear();
}
}

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

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

我的代码只在我的局域网中工作,因为服务器是在同一个美国地区创建的

这是因为我的局域网与加拿大有一个VPN

当我从局域网外的PC连接时,我被引导到另一个区域,这就是为什么我找不到我的局域网机器创建的服务器


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

此处相同,欢迎提供任何帮助@wilk3ns,UNET将被弃用,请等待新的多人游戏API。这并不意味着UNET已停止使用。它是有效的,只是发布了一个答案