0

我是网络新手,有点卡在网络大厅,我的问题是,如果我在 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”按下,再次任何帮助或指出我正确的方向将不胜感激。

4

0 回答 0