using Unity.Netcode;
public class MyNetworkManager : MonoBehaviour
{
[Header("References")]
[SerializeField] private SpawnManager spawnManager;
[SerializeField] private GameObject playerPrefab;
private void Start()
{
if (NetworkManager.Singleton == null)
{
Debug.LogError("No NetworkManager found in the scene!");
return;
}
NetworkManager.Singleton.OnClientConnectedCallback += HandleClientConnected;
// Only spawn the host player after the network is started
NetworkManager.Singleton.OnServerStarted += () =>
{
if (NetworkManager.Singleton.IsHost)
{
SpawnPlayer(NetworkManager.Singleton.LocalClientId);
}
};
}
private void OnDestroy()
{
if (NetworkManager.Singleton != null)
NetworkManager.Singleton.OnClientConnectedCallback -= HandleClientConnected;
}
private void HandleClientConnected(ulong clientId)
{
// Only server spawns players
if (!NetworkManager.Singleton.IsServer) return;
if (clientId == NetworkManager.Singleton.LocalClientId) return;
SpawnPlayer(clientId);
}
private void SpawnPlayer(ulong clientId)
{
if (spawnManager == null || playerPrefab == null)
{
Debug.LogError("SpawnManager or PlayerPrefab not assigned!");
return;
}
Vector3 spawnPos = spawnManager.GetNextSpawnPoint();
GameObject playerInstance = Instantiate(playerPrefab, spawnPos, Quaternion.identity);
NetworkObject netObj = playerInstance.GetComponent<NetworkObject>();
if (netObj != null)
{
netObj.SpawnAsPlayerObject(clientId, true);
Debug.Log($"Spawned player {clientId} at {spawnPos}");
}
else
{
Debug.LogError("Player prefab missing NetworkObject!");
}
}
}