-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNetworkPlayerSpawner.cs
97 lines (78 loc) · 2.94 KB
/
NetworkPlayerSpawner.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
public class NetworkPlayerSpawner : NetworkBehaviour
{
[SerializeField] private GameObject playerPrefab;
private List<ulong> spawnedPlayerIds = new List<ulong>();
private void Start()
{
NetworkManager.Singleton.OnServerStarted += OnServerStarted;
NetworkManager.Singleton.OnServerStopped += OnServerStopped;
}
private void OnServerStarted()
{
if (IsServer)
{
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected;
}
}
private void OnServerStopped(bool serverIsHost)
{
if (IsServer)
{
NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected;
}
}
private void OnClientConnected(ulong clientId)
{
Debug.Log("Updating player list for newly connected player");
ClientRpcParams clientRpcParams = new ClientRpcParams
{
Send =
{
TargetClientIds = new[] { clientId }
}
};
foreach (ulong networkObjectId in spawnedPlayerIds)
{
SendPlayerToClientClientRpc(networkObjectId, clientRpcParams);
}
}
public void SpawnPlayer(Vector3 spawnPosition)
{
SpawnPlayerServerRpc(NetworkManager.Singleton.LocalClientId, spawnPosition);
}
[ServerRpc(RequireOwnership = false)]
private void SpawnPlayerServerRpc(ulong clientId, Vector3 spawnPosition)
{
GameObject newPlayer = Instantiate(playerPrefab, spawnPosition, Quaternion.identity);
newPlayer.name = playerPrefab.name;
var networkPlayer = newPlayer.GetComponent<NetworkObject>();
if (networkPlayer != null)
{
Debug.Log("ClientId: " + clientId + "; NetworkObjectId: " + networkPlayer.NetworkObjectId);
networkPlayer.SpawnAsPlayerObject(clientId);
spawnedPlayerIds.Add(networkPlayer.NetworkObjectId);
}
else
{
Debug.LogWarning("Level Manager: The Character you've spawned is not a network object and thus will not work in the network.");
}
SendPlayerToAllClientsClientRpc(networkPlayer.NetworkObjectId);
}
[ClientRpc]
private void SendPlayerToAllClientsClientRpc(ulong networkObjectId)
{
NetworkObject networkObject = NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkObjectId];
GameObject player = networkObject.gameObject;
FindObjectOfType<NetworkLevelManager>().AddPlayerAfterSpawn(player);
}
[ClientRpc]
private void SendPlayerToClientClientRpc(ulong networkObjectId, ClientRpcParams clientRpcParams = default)
{
NetworkObject networkObject = NetworkManager.Singleton.SpawnManager.SpawnedObjects[networkObjectId];
GameObject player = networkObject.gameObject;
FindObjectOfType<NetworkLevelManager>().AddPlayerAfterSpawn(player);
}
}