PoolManager插件(转载)
http://www.xuanyusong.com/archives/2974
前几天我在博客里面分享了为什么Unity实例化很慢的原因,并且也分享了一个缓存池的工具。有朋友给我留言说PoolManager插件非常好用,我抽空研究了一下确实很好用。PoolManager目前的最新版本是5.5.2 我有幸在网络上找到了破解版本,文章最后我会放出来不过还是希望大家支持正版嘿嘿。
PoolManager5 介绍: https://www.assetstore.unity3d.com/en/#!/content/1010
为什么Unity实例化对象慢的原因请看我之前的文章 http://www.xuanyusong.com/archives/2925
缓存池我们主要关注的几个事情 1.怎么把游戏对象保存进缓存池 2.怎么把游戏对象从缓存池里面去出来 3.如何智能删除缓存池。很期待,因为PoolManager都满足了这几个需求。如下图所示,创建一个空的GameObjcet 接着把Spawn Pool脚本绑上去。
PoolName:缓存池的唯一名称。
MatchPoolScale:勾选后实例化的游戏对象的缩放比例将全是1,不勾选择用Prefab默认的。
MachPool Layer:勾选后实例化的游戏对象的Layer将用Prefab默认的。
Don’t Reparent:勾选后实例化的对象将没有父节点,通通在最上层,建议不要勾选。
Don’t Destroy On Load:这个就不用我解释了吧?切换场景不施放。
Pre-Prefab Pool Options :缓存池列表,意思就是缓存列表里面可以放各种类型的Prefab。右边有个 “+”按钮点击就添加每个类型的Prefab了,后面会介绍脚本怎么动态添加。
prefab:可以直接把工程里的Prefab直接拖进来。
preloadAmount:缓存池这个Prefab的最大保存数量。
preloadTime:如果都选表示缓存池所有的gameobject可以“异步”加载。
preloadFrames:每几帧加载一个。
preloadDelay:延迟多就开始加载。
limitInstance:是否开始实例的限制功能。
limit Amount:限制缓存池里最大的Prefab的数量,它和上面的preloadAmount是有冲突的,如果同时开启则以limitAmout为准。
limitFIFO:如果我们限制了缓存池里面只能有10个Prefab,如果不勾选它,那么你拿第11个的时候就会返回null。如果勾选它在取第11个的时候他会返回给你前10个里最不常用的那个。
cullDespawend:是否开启缓存池智能自动清理模式。
cull Above:缓存池自动清理,但是始终保留几个对象不清理。
cull Delay:每过多久执行一遍自动清理,单位是秒。
cullMaxPerPass:每次自动清理几个游戏对象。
补充一下,这里我们说的自动清理,就是当池子里面的对象setActive(false)也就是目前不用的时候,poolManager会根据上述参数自动清理这些对象,清理也就是Destroy()掉。
上面我详细的把PoolManager核心的参数统统介绍了一遍。上面的做法我们是在游戏运行前提前去初始化已知的游戏对象,可是实际游戏中往往我们需要动态的去载入一些无法提前预知的游戏对象,所以初始化内存池的操作我建议还是在脚本里面来完成。
如下图所示,我们在Hierarchy视图里面就创建一个PoolManager对象,上面挂上SpawnPool脚本,标记它为Don’tDestroyOnLoad状态。
下面我们看看怎么通过脚本来动态的给内存池里面加东西。
using UnityEngine;
using System.Collections;
using PathologicalGames; public class NewBehaviourScript : MonoBehaviour { SpawnPool spawnPool;
PrefabPool refabPool;
void Start()
{
spawnPool = PoolManager.Pools["Shapes"];
refabPool = new PrefabPool(Resources.Load<Transform>("momo"));
} void OnGUI()
{
if(GUILayout.Button("初始化内存池"))
{
if(!spawnPool._perPrefabPoolOptions.Contains(refabPool))
{
refabPool = new PrefabPool(Resources.Load<Transform>("momo"));
//默认初始化两个Prefab
refabPool.preloadAmount = ;
//开启限制
refabPool.limitInstances = true;
//关闭无限取Prefab
refabPool.limitFIFO = false;
//限制池子里最大的Prefab数量
refabPool.limitAmount =;
//开启自动清理池子
refabPool.cullDespawned = true;
//最终保留
refabPool.cullAbove = ;
//多久清理一次
refabPool.cullDelay = ;
//每次清理几个
refabPool.cullMaxPerPass =;
//初始化内存池
spawnPool._perPrefabPoolOptions.Add(refabPool);
spawnPool.CreatePrefabPool(spawnPool._perPrefabPoolOptions[spawnPool.Count]);
}
} if(GUILayout.Button("从内存池里面取对象"))
{
///从内存池里面取一个GameObjcet
Transform momo = spawnPool.Spawn("momo");
} if(GUILayout.Button("清空内存池"))
{
//清空池子
spawnPool.DespawnAll();
}
}
}
spawnPool.Despawn() 可以单独从池子里面清空某一个Prefab。
spawnPool.Insert() 还可以插入在池子里面某个序列上。

最后是完整的游戏代码,并且包括PoolManager5的插件。 大家来下载吧。
http://pan.baidu.com/s/1gdEG7dx
PoolManager插件(转载)的更多相关文章
- 写jquery插件(转载)
如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...
- 10条建议让你创建更好的jQuery插件(转载)
为了避免重复造轮子,自己手动开发jquery 插件,让小组其他成员可以直接使用.学习开发中,看到Phillip Senn 写的 关于jquery 插件开发注意10点,转载之! ------------ ...
- elcipse 安装svn插件 转载
1.下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java EE Developers)版 如果没有安装的请到这里下载安装:http://ecli ...
- Eclipse中用Link方式安装Maven插件(转载)
标签: it 分类: 开发软件 1.工具下载: Eclipse4.2 jee版本(注意是Jee,不是标准版的eclipse) 下载地址:http://www.eclipse.org/downloads ...
- SublimeText3常用快捷键和优秀插件(转载)
SublimeText是前端的一个神器,以其精简和可DIY而让广大fans疯狂.好吧不吹了直入正题 -_-!! 首先是安装,如果你有什么软件管家的话搜一下就好,一键安装.然后,有钱的土豪就自己买个吧, ...
- Eclipse安装SVN插件(转载)
http://www.cnblogs.com/ruiati/p/3584120.html 1.下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java E ...
- JavaScript之正方教务系统自动化教评[插件-转载]
[声明]本插件系学院学长原创,非博主所创,发布此处,仅供学习和效仿. /** * @name:正方教务系统自动化教评-插件 * * @author:chenzhongshu * @date:2017- ...
- 利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)-----转载
前言 作为一个前端工程师,无论公司是什么行业,无论你做什么端,基本都会遇到一个避不开的动画效果:循环轮播.做轮播并不难,市场上的轮播插件有很多,其中比较著名的是swiper,使用也非常简单.但轮播插件 ...
- java可视化编程-eclipse安装windowbuilder插件(转载)
原文地址:http://blog.csdn.net/jason0539/article/details/21219043 一直做在安卓用xml作界面,对于java的控件不熟悉,也不习惯用代码做UI尤其 ...
随机推荐
- Serializable 序列化 The byte stream created is platform independent. So, the object serialized on one platform can be deserialized on a different platform.
Java 序列化接口Serializable详解 - 火星猿类 - 博客园 http://www.cnblogs.com/tomtiantao/p/6866083.html 深入理解JAVA序列化 - ...
- HTTP服务器用什么组件或者方式比较好
我目前用Indy的HttpServer组件来编写,但遇到一个暂时没有办法解决的问题,就是上传文件到这个HTTPServer,如果文件名包含中文,则会出现乱码.网上查了一下,这是个indy的遗留问题,据 ...
- 利用JS判断当前来路域名并跳转到指定页面
某网站绑定了多个域名,默认情况下访问这些域名的时候是指向网站的首页,也就是访问不同域名时看到的页面是一样的,现在需要访问不同域名时显示不同页面. 一般情况下,可以用子站绑定域名的方法来实现,访问不同的 ...
- 关于苹果iPhone手机对页面margin属性无效的解决方法一(如有错误,请留言批评)
这个问题,是在给商城网站底部footer设置margin属性的时候发现的,先把出现问题的截图发出来看一下 安卓手机,打开正常 iphone6 p 打开出现的问题(无视margin-bottom:6 ...
- MYSQL进阶学习笔记三:MySQL流程控制语句!(视频序号:进阶_7-10)
知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN ...
- oracle监听器启动,实例启动
1,su - oracle登录oracle用户 2,sqlplus / as sysdba登录oracle 3,show parameter service_names; 若正常输出servicena ...
- javaScript实现增删改查
自己写的一个html+javaScript实现增删改查小实例.下面是js代码1. [代码][JavaScript]代码 //1.创建受捐单位数组var arrOrgData = [ { & ...
- 创建一个Windows Service 程序
1.新建Windows项目,选择"Windows服务"类型的项目. 2.在生成的Service1.cs中代码中写你需要的代码,如下: using System; using Sys ...
- linux防火墙过滤规则
一.linux防火墙基础 防火墙分为硬件防火墙和软件防火墙. 1.概述 linux 防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙. 包过滤机制:netfil ...
- 每次rand出来都是41?说好的随机数呢?!
rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个"伪随机"整数,理论上可以产生的最大数值为2^16-1,即32767. rand()函数不接 ...