写在前面
很早就听说过对象池技术……然而一直到这几天才真正去了解= =。还得感谢Jasper Flick的博客,这里推荐他的Unity C# Tutorials系列,目前我只看了前几篇,收获还是挺大的~本篇博客也是基于这个系列中的一篇——Object Pools,加上个人的一些理解,对Unity的对象池技术进行简单介绍。
对象池简介
顾名思义,对象池是存放对象的缓冲区。用户可以从缓冲区中放入/取出对象。一类对象池存放一类特定的对象。那么对象池有什么用呢?在游戏中,经常会有产生/销毁大量同类游戏对象的需求,比如游戏中源源不断的敌人、频繁刷新的宝箱、乃至一些游戏特效(风、雨等)。如果没有一种比较好的机制来管理这些对象的产生和销毁,而是一昧的Instantiate和Destroy,将使你的游戏性能大大下降,甚至出现卡死、崩溃……
对象池实现
简而言之,就是当需要使用一个对象的时候,直接从该类对象的对象池中取出(SetActive(true)),如果对象池中无可用对象,再进行Instantitate。而当不再需要该对象时,不直接进行Destroy,而是SetActive(false)并将其回收到对象池中。下面直接贴下代码:
PooledObject.cs
1 | using UnityEngine; |
ObjectPool.cs
1 | using UnityEngine; |
实战:七彩喷泉
【注:以下译至前面提到的Object Pools一文,有部分删减】