我是网络新手,有点卡在网络大厅,我的问题是,如果我在 3 台设备上构建和加载场景,如果服务器速度最快,它将加载场景并将玩家实例化到场景中,而其他 2 可以在加载后再延迟 4 秒,然后他们加载他们的场景并将玩家实例化到场景中。
我要做的是在启动时获取玩家状态并将其添加到 bool 的“playersReady”列表中为 false 并且每个人都准备好将他们的 bool 设置为 true 并且只有当所有都为 true 时才让服务器实例化玩家进入现场。
我已经进入 LobbyManager.cs 并添加了以下代码来获取连接玩家的数量及其设置为 false 的“playersReady”状态。
public int playerCount;
public List<bool> playersReady = new List<bool>();
public override void OnServerConnect(NetworkConnection conn)
{
playerCount = 0;
StartCoroutine(playerReadyScript.PlayerCount(0));
foreach (NetworkConnection con in NetworkServer.connections)
{
if (con != null)
{
playerCount++;
}
}
base.OnServerConnect(conn);
}
public override void OnClientNotReady(NetworkConnection conn)
{
playersReady[playerCount-1] = false;
base.OnClientNotReady(conn);
}
然后当播放器准备好时,我使用它来将 playerReady 设置为 true。
public override void OnClientSceneChanged(NetworkConnection conn)
{
playersReady[playerCount-1] = true;
}
我很困惑如何解决这个问题,我已经用谷歌搜索了好几天但没有找到可接受的方法,是否可以访问服务器代码以添加一个 while 循环检查 playerReady 列表,直到所有都设置为 true让服务器发送消息以加载他们的场景?如果我通过按键设置 bool true 来使用此测试代码
public override void OnClientSceneChanged(NetworkConnection conn)
{
StartCoroutine(Waiting(conn));
}
public IEnumerator Waiting (NetworkConnection conn)
{
while (waiting)
{
yield return null;
}
base.OnClientSceneChanged(conn);
}
这将保持在大厅屏幕上,直到按下“w”设置“等待”为假,但场景仍然加载并且玩家实例化到场景中,我只想停止发送消息以加载他们的场景,直到“w”按下,再次任何帮助或指出我正确的方向将不胜感激。