-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObjectPool.cs
More file actions
88 lines (77 loc) · 2.23 KB
/
ObjectPool.cs
File metadata and controls
88 lines (77 loc) · 2.23 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
82
83
84
85
86
87
88
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour{
public GameObject prefab;
public int size;
Queue<GameObject> pool;
void Awake() {
Init();
}
public void Init() {
pool = new Queue<GameObject>();
for(int i = 0; i < size; i++)
ExpandPool();
}
public void Init(GameObject prefab, int size) {
this.prefab = prefab;
this.size = size;
pool = new Queue<GameObject>();
for(int i = 0; i < size; i++)
ExpandPool();
}
public GameObject Get() {
if(pool.Count == 0) ExpandPool();
GameObject obj = pool.Dequeue();
obj.SetActive(true);
return obj;
}
public GameObject Get(Transform parent) {
if(pool.Count == 0) ExpandPool();
GameObject obj = pool.Dequeue();
obj.transform.SetParent(parent);
obj.SetActive(true);
return obj;
}
public GameObject Get(Vector3 position, Quaternion rotation) {
if(pool.Count == 0) ExpandPool();
GameObject obj = pool.Dequeue();
obj.transform.position = position;
obj.transform.rotation = rotation;
obj.SetActive(true);
return obj;
}
public GameObject Get(Vector3 position, Quaternion rotation, Transform parent) {
if(pool.Count == 0) ExpandPool();
GameObject obj = pool.Dequeue();
obj.transform.position = position;
obj.transform.rotation = rotation;
obj.transform.SetParent(parent);
obj.SetActive(true);
return obj;
}
public GameObject Get(TransformData data) {
if(pool.Count == 0) ExpandPool();
GameObject obj = pool.Dequeue();
obj.transform.position = data.position;
obj.transform.rotation = data.rotation;
obj.transform.SetParent(data.parent);
obj.SetActive(true);
return obj;
}
//Ensure the GameObject belongs to this pool before calling it!!!
public void Release(GameObject obj) {
if(obj == null || !obj.activeInHierarchy) return;
obj.SetActive(false);
SpriteRenderer sp = obj.GetComponent<SpriteRenderer>();
if(sp != null) sp.sprite = null;
obj.transform.SetParent(transform);
obj.transform.position = Vector3.zero;
obj.transform.rotation = Quaternion.identity;
pool.Enqueue(obj);
}
void ExpandPool() {
GameObject obj = Instantiate(prefab, transform);
Release(obj);
}
}