-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathSimplePool.cs
More file actions
81 lines (66 loc) · 2.48 KB
/
SimplePool.cs
File metadata and controls
81 lines (66 loc) · 2.48 KB
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
// Simple pooling script that uses UniRX for callbacks.
// Can be useful for particle effects that disable after play. Those kind of things.
// It lacks a lot of functionality tough, like automatic resizing.
using UnityEngine;
using System.Collections.Generic;
using UniRx;
using UniRx.Triggers;
public class SimplePool : MonoBehaviour
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void CreateInstance()
{
if (instance == null)
{
instance = new GameObject("Quickpool").AddComponent<SimplePool>();
GameObject.DontDestroyOnLoad(instance.gameObject);
}
}
private static SimplePool instance;
private Dictionary<GameObject, List<Transform>> inactiveObjects = new Dictionary<GameObject, List<Transform>>();
public static Transform Spawn(GameObject resource)
{
return instance.SpawnResource(resource);
}
private Transform SpawnResource(GameObject resource)
{
if (!inactiveObjects.TryGetValue(resource, out List<Transform> inactiveObjectPool))
{
inactiveObjectPool = new List<Transform>();
inactiveObjects.Add(resource, inactiveObjectPool);
}
if (inactiveObjectPool.Count == 0)
{
Transform instance = GameObject.Instantiate(resource).transform;
instance.OnDisableAsObservable()
.Subscribe(_ => ReturnToPool(resource, instance));
instance.OnEnableAsObservable()
.Subscribe(_ => RemoveFromPool(resource, instance));
instance.OnDestroyAsObservable()
.Subscribe(_ => RemoveFromPool(resource, instance));
return instance;
}
else
{
if (inactiveObjectPool.Count > 0)
{
var index = inactiveObjectPool.Count - 1;
Transform t = inactiveObjectPool[index];
inactiveObjectPool.RemoveAt(index);
t.gameObject.SetActive(true);
return t;
}
}
return null;
}
private void ReturnToPool(GameObject resource, Transform instance)
{
if (inactiveObjects.TryGetValue(resource, out List<Transform> prefabList))
prefabList.Add(instance);
}
private void RemoveFromPool(GameObject resource, Transform instance)
{
if (inactiveObjects.TryGetValue(resource, out List<Transform> prefabList))
prefabList.Remove(instance);
}
}