I wrote a lobby system for my game so that players would go to a match. This system exists as an entity. I have a running server, clients are connecting to it, and as soon as two clients click the "Ready" button, they will be transferred to the field of battle. This should ideally be, but nothing happens, no errors, nothing. I wrote a log so that after the user clicks "Ready" in the console it says "Player x is ready", but gives a warning in the screenshot
Tell me what the problem is. I will attach the lobby code.
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
namespace vsamomdeletak.Scripts.Networking
{
public class LobbyUI : NetworkBehaviour
{
private NetworkList<LobbyPlayerState> lobbyPlayers;
private void Awake()
{
lobbyPlayers = new NetworkList<LobbyPlayerState>();
}
public override void OnNetworkSpawn()
{
if (IsServer)
{
NetworkManager.Singleton.OnClientConnectedCallback += HandleClientConnected;
NetworkManager.Singleton.OnClientDisconnectCallback += HandleClientDisconnect;
foreach (NetworkClient client in NetworkManager.Singleton.ConnectedClientsList)
{
HandleClientConnected(client.ClientId);
}
}
}
public override void OnDestroy()
{
base.OnDestroy();
if (NetworkManager.Singleton)
{
NetworkManager.Singleton.OnClientConnectedCallback -= HandleClientConnected;
NetworkManager.Singleton.OnClientDisconnectCallback -= HandleClientDisconnect;
}
}
private bool IsEveryoneReady()
{
if (lobbyPlayers.Count < 2)
{
return false;
}
foreach (var player in lobbyPlayers)
{
if (!player.IsReady)
{
return false;
}
}
return true;
}
private void HandleClientConnected(ulong clientId)
{
var playerData = ServerGameNetPortal.Instance.GetPlayerData(clientId);
if (!playerData.HasValue) { return; }
lobbyPlayers.Add(new LobbyPlayerState(
clientId,
playerData.Value.PlayerName,
false
));
}
private void HandleClientDisconnect(ulong clientId)
{
for (int i = 0; i < lobbyPlayers.Count; i++)
{
if (lobbyPlayers[i].ClientId == clientId)
{
lobbyPlayers.RemoveAt(i);
break;
}
}
}
[ServerRpc(RequireOwnership = false)]
private void ToggleReadyServerRpc(ServerRpcParams serverRpcParams = default)
{
for (int i = 0; i < lobbyPlayers.Count; i++)
{
if (lobbyPlayers[i].ClientId == serverRpcParams.Receive.SenderClientId)
{
lobbyPlayers[i] = new LobbyPlayerState(
lobbyPlayers[i].ClientId,
lobbyPlayers[i].PlayerName,
!lobbyPlayers[i].IsReady
);
Debug.Log("Player" + i + "Ready");
}
}
if (IsEveryoneReady())
{
StartGameServerRpc();
}
}
[ServerRpc(RequireOwnership = false)]
private void StartGameServerRpc(ServerRpcParams serverRpcParams = default)
{
if (serverRpcParams.Receive.SenderClientId != NetworkManager.Singleton.LocalClientId) { return; }
if (!IsEveryoneReady()) { return; }
ServerGameNetPortal.Instance.StartGame();
}
public void OnLeaveClicked()
{
GameNetPortal.Instance.RequestDisconnect();
}
public void OnReadyClicked()
{
ToggleReadyServerRpc();
}
}
}
