3

我正在尝试根据 Brackeys 的教程来实现 UNET Matchmaking 系统。

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

当我尝试创建匹配并从局域网中的另一台 PC 中找到它时,它运行良好。

当我尝试创建匹配并从局域网外的另一台 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();
    }
}
4

2 回答 2

0

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

于 2018-11-06T12:09:10.823 回答
0

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

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

发生这种情况是因为我的 LAN 与加拿大有 VPN。

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

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

于 2018-11-11T13:04:03.970 回答