Unity 2018.2 - UNet多人游戏只在局域网中有效

3
我正在尝试根据Brackeys的教程实现基于UNET的匹配系统。
我已经在我的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();
    }
}

同样的问题,如果有帮助就会很感激! - wilk3ns
@wilk3ns,UNET 将被弃用,请等待新的多人游戏 API。 - Lucas Freitas
它并不意味着UNET已经停止服务。它仍然可以使用,只是发布了一个答案。 - wilk3ns
2个回答

0

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


0
整个问题与Unity MM服务器负载均衡器有关。
我的代码只在我的局域网中工作,因为服务器是在同一美国地区创建的。
这是因为我的局域网与加拿大有VPN连接。
当我从局域网外的计算机连接时,我被重定向到另一个地区,这就是为什么我找不到由我的局域网机器创建的服务器。
在部署到我的局域网之外的两台计算机后,它们都可以创建并连接到另一个服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接