From 766cdff5ffa72b65d7f106658d1603f47739b2ba Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Fri, 27 Oct 2023 11:05:14 +0800 Subject: + init --- GameCode/ObjectPool.cs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 GameCode/ObjectPool.cs (limited to 'GameCode/ObjectPool.cs') diff --git a/GameCode/ObjectPool.cs b/GameCode/ObjectPool.cs new file mode 100644 index 0000000..b17adae --- /dev/null +++ b/GameCode/ObjectPool.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using UnityEngine; + +public class ObjectPool +{ + private Stack m_availableObjects = new Stack(); + + private List m_usedObjects = new List(); + + private GameObject m_objectPrefab; + + private Transform m_objectRoot; + + private int testCounter = 1; + + public ObjectPool(GameObject prefab, int initSpawn = 0, Transform parent = null) + { + m_objectPrefab = prefab; + m_objectRoot = new GameObject(prefab.name + "_root").transform; + m_objectRoot.transform.position = parent.position; + m_objectRoot.transform.rotation = parent.rotation; + m_objectRoot.transform.SetParent(parent, worldPositionStays: true); + m_objectRoot.transform.localScale = Vector3.one; + for (int i = 0; i < initSpawn; i++) + { + GameObject gameObject = Object.Instantiate(m_objectPrefab, m_objectRoot); + gameObject.SetActive(value: false); + m_availableObjects.Push(gameObject); + } + } + + public GameObject GetObject() + { + if (m_availableObjects.Count > 0) + { + GameObject gameObject = m_availableObjects.Pop(); + m_usedObjects.Add(gameObject); + gameObject.SetActive(value: true); + return gameObject; + } + GameObject gameObject2 = Object.Instantiate(m_objectPrefab, m_objectRoot); + m_usedObjects.Add(gameObject2); + gameObject2.SetActive(value: true); + return gameObject2; + } + + public bool ReleaseObject(GameObject obj) + { + bool num = m_usedObjects.Remove(obj); + if (num) + { + m_availableObjects.Push(obj); + obj.SetActive(value: false); + } + return num; + } + + public void ClearPool() + { + while (m_availableObjects.Count > 0) + { + Object.Destroy(m_availableObjects.Pop()); + } + for (int i = 0; i < m_usedObjects.Count; i++) + { + Object.Destroy(m_usedObjects[i]); + } + m_usedObjects.Clear(); + } +} -- cgit v1.1-26-g67d0