我正在尝试根据Brackeys的教程实施UNET对接系统。
我已经在我的Unity帐户中启用了多人游戏服务并启用了该服务。
当我尝试创建一个匹配项并从局域网中的另一台PC上找到它时,它可以完美工作。
当我尝试创建匹配并从LAN之外的另一台PC上找到它时,在匹配列表中看不到该匹配。
我已经搜索了文档和Google,但未找到任何相关信息。
有人知道吗?
顺便说一下,这是我的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();
}
}
最佳答案
我实际上发现了问题。首先,您必须刷新配置并确保云配置处于工作状态并启用了多人游戏服务,有时它会随机关闭。然后,您应该直接通过命名配对服务器来选择它,因为例如,我使用的欧洲服务器是eu1-mm.unet.unity3d.com。您的客户。而且不同服务器中的玩家不会看到对方。或者,您可以启动自己的本地服务器并通过端口转发IP,然后将其用作客户端的主机IP。除非您拥有动态IP,否则您可以使用诸如no-ip之类的服务来获取IP的静态域。我现在正在使用这种方法,而且它是免费的。