在Unity中使用对象池
有什么不明白的地方,扫描右方二维码加我微信交流。
跟着公司的发展战略走,不得不从cocoscreator转向了unity,转型成本不太大,很顺手。
在使用unity的过程中,发现很多cocos有的系统组件unity没有,需要自己来集成。比如:对象池,动作系统,spine动画系统等等。
今天简单说下对象池。
对于喜欢做饭的我来说,对象池就像是一个碗柜,需要用碗时去里面拿,等用完了洗洗干净再放回去,碗不够了再买新的放进去。
游戏中对应的就是需要使用游戏对象时从对象池里获取,使用完了再把游戏对象放回去,但要注意下次再拿出来时记得要重置游戏对象的各种属性。
代码如下:
using System.Collections.Generic; using UnityEngine; public class ObjectPool { private GameObject _prefab;//对象池中的对象 private readonly List<GameObject> _list = new List<GameObject>();//对象List //传游戏对象进来,并填充对象池 public void CreateObject(GameObject prefab, int count = 1, bool worldPositionStays = false) { _prefab = prefab; for (var i = 0; i < count; ++i) { var obj = Object.Instantiate(prefab, null, worldPositionStays); obj.gameObject.SetActive(false); _list.Add(obj); } } //获取对象 public GameObject Get() { if (_list.Count > 0) { var obj = _list[0]; _list.RemoveAt(0); obj.gameObject.SetActive(true); return obj; } else { //若对象不足,则再创建新的 return Object.Instantiate(_prefab, null, false); } } //回收对象 public void Put(GameObject obj) { obj.transform.SetParent(null); obj.gameObject.SetActive(false); _list.Add(obj); } }
使用如下:
var testPool = new ObjectPool(); testPool.CreateObject(testPrefab, 10); var testObj = testPool.Get(); testPool.Put(testObj);
这样一个简单的对象池就完成了。