私はネットワーキングに初心者で、ネットワーク ロビーに少し行き詰まっています。私の問題は、たとえば 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」までシーンをロードするために送信されるメッセージを停止したいだけですが押されている場合でも、助けを借りたり、正しい方向に私を向けたりしていただければ幸いです。