Skip to content

Commit 0ee53e4

Browse files
committed
Reworked Object Pooling
1 parent 6a586f6 commit 0ee53e4

File tree

4 files changed

+67
-68
lines changed

4 files changed

+67
-68
lines changed

MLAPI/Data/NetworkPool.cs

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,25 @@ namespace MLAPI.Data
44
{
55
internal class NetworkPool
66
{
7-
internal GameObject prefab;
7+
internal int spawnablePrefabIndex;
88
internal GameObject[] objects;
9-
internal string poolName;
9+
internal ushort poolId;
1010

11-
internal NetworkPool(GameObject prefab, uint size, string name)
11+
internal NetworkPool(int prefabIndex, uint size, ushort poolIndex)
1212
{
1313
objects = new GameObject[size];
14-
poolName = name;
15-
14+
poolId = poolIndex;
1615
for (int i = 0; i < size; i++)
1716
{
18-
GameObject go = UnityEngine.Object.Instantiate(prefab, Vector3.zero, Quaternion.identity);
19-
go.name = "Pool " + poolName + " #" + i;
17+
GameObject go = Object.Instantiate(NetworkingManager.singleton.SpawnablePrefabs[prefabIndex], Vector3.zero, Quaternion.identity);
18+
go.GetComponent<NetworkedObject>().IsPooledObject = true;
19+
go.GetComponent<NetworkedObject>().PoolId = poolId;
20+
go.GetComponent<NetworkedObject>().Spawn();
21+
go.name = "Pool Id: " + poolId + " #" + i;
2022
go.SetActive(false);
2123
}
2224
}
2325

24-
internal NetworkPool(GameObject[] prefabs, string name)
25-
{
26-
objects = prefabs;
27-
poolName = name;
28-
int size = prefabs.Length;
29-
30-
for (int i = 0; i < size; i++)
31-
{
32-
prefabs[i].name = "Pool " + poolName + " #" + i;
33-
prefabs[i].SetActive(false);
34-
}
35-
36-
}
37-
3826
internal GameObject SpawnObject(Vector3 position, Quaternion rotation)
3927
{
4028
for (int i = 0; i < objects.Length; i++)
@@ -47,7 +35,7 @@ internal GameObject SpawnObject(Vector3 position, Quaternion rotation)
4735
go.SetActive(true);
4836
}
4937
}
50-
Debug.LogWarning("MLAPI: The pool " + poolName + " has ran out of space");
38+
Debug.LogWarning("MLAPI: The pool " + poolId + " has ran out of space");
5139
return null;
5240
}
5341
}

MLAPI/MonoBehaviours/Core/NetworkedObject.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ public class NetworkedObject : MonoBehaviour
1414
[HideInInspector]
1515
public bool isPlayerObject = false;
1616
public bool ServerOnly = false;
17+
[HideInInspector]
18+
public bool IsPooledObject = false;
19+
[HideInInspector]
20+
public ushort PoolId;
1721
public bool isLocalPlayer
1822
{
1923
get

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using MLAPI.MonoBehaviours.Core;
2-
using MLAPI.NetworkingManagerComponents;
1+
using MLAPI.NetworkingManagerComponents;
32
using System;
43
using System.Collections;
54
using System.Collections.Generic;
@@ -72,7 +71,8 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
7271
MessageManager.reverseMessageTypes = new Dictionary<ushort, string>();
7372
SpawnManager.spawnedObjects = new Dictionary<uint, NetworkedObject>();
7473
SpawnManager.releasedNetworkObjectIds = new Stack<uint>();
75-
NetworkPoolManager.Pools = new Dictionary<string, Data.NetworkPool>();
74+
NetworkPoolManager.Pools = new Dictionary<ushort, Data.NetworkPool>();
75+
NetworkPoolManager.PoolNamesToIndexes = new Dictionary<string, ushort>();
7676
NetworkSceneManager.registeredSceneNames = new HashSet<string>();
7777
NetworkSceneManager.sceneIndexToString = new Dictionary<uint, string>();
7878
NetworkSceneManager.sceneNameToIndex = new Dictionary<string, uint>();
@@ -100,6 +100,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
100100
MessageManager.messageTypes.Add("MLAPI_DESTROY_OBJECT", 4);
101101
MessageManager.messageTypes.Add("MLAPI_SWITCH_SCENE", 5);
102102
MessageManager.messageTypes.Add("MLAPI_SPAWN_POOL_OBJECT", 6);
103+
MessageManager.messageTypes.Add("MLAPI_DESTROY_POOL_OBJECT", 7);
103104
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromClient");
104105
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromServer");
105106

@@ -587,15 +588,16 @@ private void HandleIncomingData(int clientId, byte[] data, int channelId)
587588
{
588589
using (BinaryReader messageReader = new BinaryReader(messageReadStream))
589590
{
590-
ushort poolIndex = messageReader.ReadUInt16();
591+
uint netId = messageReader.ReadUInt32();
591592
float xPos = messageReader.ReadSingle();
592593
float yPos = messageReader.ReadSingle();
593594
float zPos = messageReader.ReadSingle();
594595
float xRot = messageReader.ReadSingle();
595596
float yRot = messageReader.ReadSingle();
596597
float zRot = messageReader.ReadSingle();
597-
NetworkPoolManager.SpawnPoolObject(NetworkPoolManager.PoolIndexToPoolName[poolIndex],
598-
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
598+
SpawnManager.spawnedObjects[netId].transform.position = new Vector3(xPos, yPos, zPos);
599+
SpawnManager.spawnedObjects[netId].transform.rotation = Quaternion.Euler(new Vector3(xRot, yRot, zRot));
600+
SpawnManager.spawnedObjects[netId].gameObject.SetActive(true);
599601
}
600602
}
601603
}

MLAPI/NetworkingManagerComponents/NetworkPoolManager.cs

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,73 +7,78 @@ namespace MLAPI.NetworkingManagerComponents
77
{
88
public static class NetworkPoolManager
99
{
10-
internal static Dictionary<string, NetworkPool> Pools;
11-
//We want to keep the pool indexes incrementing, this is to prevent new pools getting old names and the wrong objects being spawned.
10+
internal static Dictionary<ushort, NetworkPool> Pools;
1211
private static ushort PoolIndex = 0;
12+
internal static Dictionary<string, ushort> PoolNamesToIndexes;
1313

14-
internal static Dictionary<ushort, string> PoolIndexToPoolName = new Dictionary<ushort, string>();
15-
internal static Dictionary<string, ushort> PoolNamesToIndexes = new Dictionary<string, ushort>();
16-
17-
public static void CreatePool(string poolName, GameObject poolPrefab, uint size = 16)
14+
//Server only
15+
public static void CreatePool(string poolName, int spawnablePrefabIndex, uint size = 16)
1816
{
19-
if(Pools.ContainsKey(poolName))
17+
if(!NetworkingManager.singleton.isServer)
2018
{
21-
Debug.LogWarning("MLAPI: A pool with the name " + poolName + " already exists");
19+
Debug.LogWarning("MLAPI: Pools can only be created on the server");
2220
return;
2321
}
24-
else if(poolPrefab == null)
25-
{
26-
Debug.LogWarning("MLAPI: A pool prefab is required");
27-
}
28-
PoolIndexToPoolName.Add(PoolIndex, poolName);
22+
NetworkPool pool = new NetworkPool(spawnablePrefabIndex, size, PoolIndex);
2923
PoolNamesToIndexes.Add(poolName, PoolIndex);
3024
PoolIndex++;
31-
Pools.Add(poolName, new NetworkPool(poolPrefab, size, poolName));
3225
}
3326

34-
35-
public static void CreatePool(string poolName, GameObject[] poolPrefabs)
27+
public static void DestroyPool(string poolName)
3628
{
37-
if (Pools.ContainsKey(poolName))
29+
if (!NetworkingManager.singleton.isServer)
3830
{
39-
Debug.LogWarning("MLAPI: A pool with the name " + poolName + " already exists");
31+
Debug.LogWarning("MLAPI: Pools can only be destroyed on the server");
4032
return;
4133
}
42-
else if (poolPrefabs == null)
34+
for (int i = 0; i < Pools[PoolNamesToIndexes[poolName]].objects.Length; i++)
4335
{
44-
Debug.LogWarning("MLAPI: A pool prefab array is required");
36+
MonoBehaviour.Destroy(Pools[PoolNamesToIndexes[poolName]].objects[i]);
4537
}
46-
PoolIndexToPoolName.Add(PoolIndex, poolName);
47-
PoolNamesToIndexes.Add(poolName, PoolIndex);
48-
PoolIndex++;
49-
Pools.Add(poolName, new NetworkPool(poolPrefabs, poolName));
38+
Pools.Remove(PoolNamesToIndexes[poolName]);
5039
}
5140

5241
public static GameObject SpawnPoolObject(string poolName, Vector3 position, Quaternion rotation)
5342
{
54-
if(NetworkingManager.singleton.isServer)
43+
if (!NetworkingManager.singleton.isServer)
44+
{
45+
Debug.LogWarning("MLAPI: Object spawning can only occur on server");
46+
return null;
47+
}
48+
GameObject go = Pools[PoolNamesToIndexes[poolName]].SpawnObject(position, rotation);
49+
using (MemoryStream stream = new MemoryStream(28))
5550
{
56-
using(MemoryStream stream = new MemoryStream(26))
51+
using (BinaryWriter writer = new BinaryWriter(stream))
5752
{
58-
using(BinaryWriter writer = new BinaryWriter(stream))
59-
{
60-
writer.Write(PoolNamesToIndexes[poolName]);
61-
writer.Write(position.x);
62-
writer.Write(position.y);
63-
writer.Write(position.z);
64-
writer.Write(rotation.eulerAngles.x);
65-
writer.Write(rotation.eulerAngles.y);
66-
writer.Write(rotation.eulerAngles.z);
67-
}
68-
NetworkingManager.singleton.Send("MLAPI_SPAWN_POOL_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
53+
writer.Write(go.GetComponent<NetworkedObject>().NetworkId);
54+
writer.Write(position.x);
55+
writer.Write(position.y);
56+
writer.Write(position.z);
57+
writer.Write(rotation.eulerAngles.x);
58+
writer.Write(rotation.eulerAngles.y);
59+
writer.Write(rotation.eulerAngles.z);
6960
}
61+
NetworkingManager.singleton.Send("MLAPI_SPAWN_POOL_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
7062
}
71-
return Pools[poolName].SpawnObject(position, rotation);
63+
return go;
7264
}
7365

74-
public static void DestroyPoolObject(GameObject gameObject)
66+
public static void DestroyPoolObject(NetworkedObject netObject)
7567
{
76-
gameObject.SetActive(false);
68+
if (!NetworkingManager.singleton.isServer)
69+
{
70+
Debug.LogWarning("MLAPI: Objects can only be destroyed on the server");
71+
return;
72+
}
73+
netObject.gameObject.SetActive(false);
74+
using (MemoryStream stream = new MemoryStream(4))
75+
{
76+
using (BinaryWriter writer = new BinaryWriter(stream))
77+
{
78+
writer.Write(netObject.NetworkId);
79+
}
80+
NetworkingManager.singleton.Send("MLAPI_DESTROY_POOL_OBJECT", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.GetBuffer());
81+
}
7782
}
7883
}
7984
}

0 commit comments

Comments
 (0)