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);
}

次に、プレーヤーの準備ができたら、これを使用して、playersReady を true に設定します。

public override void OnClientSceneChanged(NetworkConnection conn)
{
    playersReady[playerCount-1] = true;
}

私はこれについてどうやって行くのか非常に混乱しています.それを行うための許容できる方法を見つけることなく何日もグーグルで検索しました.サーバーコードにアクセスしてwhileループを追加し、すべてがtrueに設定されるまでplayerReadyリストをチェックする必要はありません.サーバーにメッセージを送信してシーンをロードさせますか? キーを押して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」が押されるまでロビー画面で保持されます「待機」をfalseに設定しますが、シーンはまだロードされており、プレーヤーはシーンにインスタンス化されています。「w」までシーンをロードするために送信されるメッセージを停止したいだけですが押されている場合でも、助けを借りたり、正しい方向に私を向けたりしていただければ幸いです。

4

0 に答える 0