一、对象池的概念
对象池背后的理念其实是非常简单的。我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象。池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象。这样做的好处是优化了在增删对象时CPU的性能损耗,但是增加了内存对游戏对象的小部分存储性能。
二、对象池的使用实例
1、打方块游戏的运行效果介绍
打方块游戏的对象池使用,通过创建一个对象池来储存子弹,减少CPU对子弹预设体的增删。
下面贴出游戏的运行界面:
子弹预设体的数量显示:
子弹的预设体的数量如图所示,根据子弹产生的速度,只要子弹的对象池中有子弹游戏对象存在,已经创建的子弹都可以循环使用,当对象池中没有子弹对象时,或者子弹对象都在使用中,则再创建一个新的子弹对象。
2、编写子弹游戏对象池
分析子弹为游戏对象,为了方便存储其他的游戏对象(如砖块等),根据不同名字的游戏对象,我们将该集合对象池储存为字典型。相同名字的游戏对象储存在动态数组中,则Dictionar<string, ArrayList>,并将该对象池脚本设置为单例脚本。
贴出代码部分:
层次视图中创建一个空物体命名为GameController,再创建一个平面Plane,置为GameController的子物体。
工程视图中创建如下图所示,material中是砖块的材质球,Texture中是砖块的贴图
贴图如下:
材质球设置如下,将tiling设置为0.5:
砖块预设体设置如下:
子弹预设体设置如下:
Resources中有三个脚本,如下:
Bullet脚本添加在子弹预设体上,GameController脚本添加在GameController上,ObjectPool为单例脚本不添加在任何游戏物体上。
Bullet脚本内容如下:
GameController脚本如下:
上文讲解了ObjectPool的基本原理及其实现。下面推荐一个更加成熟的插件——PoolManager,该插件功能十分强大,所以才敢卖那么贵,30美刀...国内有位牛人已经写了一份不错的教程,有兴趣的童鞋可以参考下:Unity3D研究院之初探PoolManager插件。