Spawning Players When Set Number of Players Joined
Tutorial for spawning players as soon as a set number of clients have joined your game.
2
Add the needed fields and namespaces
using FishNet;
using FishNet.Connection;
using FishNet.Managing;
using FishNet.Managing.Server;
using FishNet.Object;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class CountBasedPlayerSpawner : MonoBehaviour
{
[SerializeField] private NetworkObject _playerPrefab;
[SerializeField] private int _requiredPlayerCount;
private NetworkManager _networkManager;
}3
Get a reference to the NetworkManager
private void Awake()
{
_networkManager = GetComponentInParent<NetworkManager>();
if (_networkManager == null)
_networkManager = InstanceFinder.NetworkManager;
if (_networkManager == null)
{
Debug.LogWarning($"CountBasedPlayerSpawner cannot work as a NetworkManager couldn't be found.");
return;
}
}4
5
Implement the OnClientLoadedStartScenes method
private void OnClientLoadedStartScenes(NetworkConnection _, bool asServer)
{
if (!asServer)
return;
List<NetworkConnection> authenticatedClients = _networkManager.ServerManager.Clients.Values
.Where(conn => conn.IsAuthenticated).ToList();
if (authenticatedClients.Count < _requiredPlayerCount) return;
foreach (NetworkConnection client in authenticatedClients)
{
NetworkObject obj = Instantiate(_playerPrefab);
_networkManager.ServerManager.Spawn(obj, client);
}
}6
7
8
Final script
using FishNet;
using FishNet.Connection;
using FishNet.Managing;
using FishNet.Managing.Server;
using FishNet.Object;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class CountBasedPlayerSpawner : MonoBehaviour
{
[SerializeField] private NetworkObject _playerPrefab;
[SerializeField] private int _requiredPlayerCount;
private NetworkManager _networkManager;
private void Awake()
{
_networkManager = GetComponentInParent<NetworkManager>();
if (_networkManager == null)
_networkManager = InstanceFinder.NetworkManager;
if (_networkManager == null)
{
Debug.LogWarning($"CountBasedPlayerSpawner cannot work as a NetworkManager couldn't be found.");
return;
}
_networkManager.SceneManager.OnClientLoadedStartScenes += OnClientLoadedStartScenes;
}
private void OnDestroy()
{
if (_networkManager != null)
_networkManager.SceneManager.OnClientLoadedStartScenes -= OnClientLoadedStartScenes;
}
private void OnClientLoadedStartScenes(NetworkConnection _, bool asServer)
{
if (!asServer)
return;
List<NetworkConnection> authenticatedClients = _networkManager.ServerManager.Clients.Values
.Where(conn => conn.IsAuthenticated).ToList();
if (authenticatedClients.Count < _requiredPlayerCount) return;
foreach (NetworkConnection client in authenticatedClients)
{
NetworkObject obj = _networkManager.GetPooledInstantiated(_playerPrefab, asServer: true);
_networkManager.ServerManager.Spawn(obj, client);
// If the client isn't observing this scene, make him an observer of it.
if (!client.Scenes.Contains(gameObject.scene))
_networkManager.SceneManager.AddOwnerToDefaultScene(obj);
}
}
}Last updated