PoolManager
我用的PoolManager版本是5.5.2的,导入的包总共有三个文件夹:Editor,Plugins,PoolManagerExampleFiles
1、Editor这个文件夹里面的东西,顾名思义,就是写关于编辑器的东西,从而使用于可以很方便的为对象添加PreRuntimePoolItem和SpawnPool这两个脚本,生成的编辑器样式为:
2、Plugins文件夹里面主要有三个非常重要的脚本,即PoolManager,PreRuntimePoolItem和SpawnPool这三个脚本
3、PoolManagerExampleFiles文件夹里面存放的就是实例工程文件了
1、SpawnPool脚本
作用:创建缓冲池,并缓冲需要的对象
每一个选项的解释说明如下:
PoolName:缓存池的唯一名称。
MatchPoolScale:勾选后实例化的游戏对象的缩放比例将全是1,不勾选择用Prefab默认的。
MachPool Layer:勾选后实例化的游戏对象的Layer将用Prefab默认的。
Don’t Reparent:勾选后实例化的对象将没有父节点,通通在最上层,建议不要勾选。
Don’t Destroy On Load:这个就不用我解释了吧?切换场景不释放。
Log Messages 是否打印日志信息
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()掉。
active变为true或false是由Spawn和Despawn方法决定的!
limitInstance是否开启(打钩)的区别:
不开启情况:假如此时preloadAmount为1,如果用户想要每隔5秒去Spawn一个缓冲池中的对象,那么当加载第二个prefab对象的时候,缓冲池会再创建一个此对象,如果程序再Spawn,那么还会在产生一个这样的对象,就这样一直产生下去,Spawn几次就产生几个对象!
(粒子系统:循环时:Spawn几次,就会产生几个对象,不循环时(循环结束状态为false):会再产生一个对象,如果此时的Spawn速度特别快,并且检测不到前面的对象状态为false,那么可能会产生多个对象,直到检测到前面的几个对象有false状态,那么产生对象到此为止,程序在此几个对象之间来回Spawn!)
开启情况:
此时Limit Amount为1
limitFIFO勾选:那么程序永远使用的是预加载对象,而不会再产生其他对象!当加载第二次的时候,即使第一个对象处于true状态,也使用它,即操作第一个对象!(粒子系统为循环或者不循环时,效果和这一样)
limitFIFO不勾选:那么程序永远使用的是预加载对象,而不会再产生其他对象!当加载第二次的时候,那么必须等第一个对象变为false状态,才能使用它!如果过了5s,第一个对象还没变为false状态,那么程序会报错!(粒子系统为循环:会循环下去,只有一个预加载对象,不报错,不循环时:等上一个变为false才能进行第二次,只有一个预加载对象,不报错!)
如果limit Amount数量大于1,为10的话
limitFIFO勾选:永远只有10个对象产生,当加载第11个对象时,如果前十个对象没有一个active为false状态,那么程序会选择不常用的那个,从而避免报错!
limitFIFO不勾选:永远只有10个对象产生,但是当加载第11个对象时,如果前十个对象没有一个active为false状态,那么程序会报错!
(粒子系统,永远只有10个对象,不报错!)
缓冲池里面的对象active变为true和false时,触发的事件(此脚本悬挂在缓冲池对象上):
- private void OnSpawned(SpawnPool pool)
- {
- Debug.Log
- (
- string.Format
- (
- "OnSpawnedExample | OnSpawned running for '{0}' in pool '{1}'.",
- this.name,
- pool.poolName
- )
- );
- }
- private void OnDespawned(SpawnPool pool)
- {
- Debug.Log
- (
- string.Format
- (
- "OnSpawnedExample | OnDespawned unning for '{0}' in pool '{1}'.",
- this.name,
- pool.poolName
- )
- );
- }
获取缓冲池的方式:
SpawnPool pool = PoolManager.Pools[poolName];
SpawnPool pool = this.GetComponent<SpawnPool>();
代码为缓冲池预加载对象:这也是PreRuntimePoolItem脚本的作用,SpawnPool下的Options预设必须包含prefabName,并且悬挂PreRuntimePoolItem脚本的对象和SpawnPool脚本下的Options中的预设无关!
- public class PreRuntimePoolItem : MonoBehaviour
- {
- public string poolName = "";//缓冲池名称
- public string prefabName = "";//预设名称
- public bool despawnOnStart = true; //active初始化为false状态
- public bool doNotReparent = false;//是否有父节点
- private void Start()
- {
- SpawnPool pool;
- if (!PoolManager.Pools.TryGetValue(this.poolName, out pool))
- {
- string msg = "PreRuntimePoolItem Error ('{0}'): " +
- "No pool with the name '{1}' exists! Create one using the " +
- "PoolManager Inspector interface or PoolManager.CreatePool()." +
- "See the online docs for more information at " +
- "http://docs.poolmanager.path-o-logical.com";
- Debug.LogError(string.Format(msg, this.name, this.poolName));
- return;
- }
- pool.Add(this.transform, this.prefabName,
- this.despawnOnStart, !this.doNotReparent);
- }
- }
Code
如果SpawnPool脚本下已经有预设为Cube的对象,并且预加载数量为3,如果此时我们通过 PreRuntimePoolItem脚本的作用,也为此缓冲池加载了2个预设为Cube的对象,那么即使PreRuntimePoolItem脚本的Do Not Reparent是否勾选,一旦程序进行Spawn获取,那么这些预加载对象都会被加载到挂有SpawnPool脚本的对象下,如果Spawn50个,那么就会依次激活他们!Despawn On Start为true的不会算在内!
通过脚本创建缓冲池,取对象,销毁对象:
- public class CreationExample : MonoBehaviour
- {
- //要实例化的预设
- public Transform testPrefab;
- //缓冲池的名称
- public string poolName = "Creator";
- //缓冲数量
- public int spawnAmount = ;
- //多久实例化或者删除一个对象(Interval:时间间隔)
- public float spawnInterval = 0.25f;
- //缓冲池对象
- private SpawnPool pool;
- private void Start()
- {
- //创建缓冲池,并命名
- pool = PoolManager.Pools.Create(this.poolName);
- //从缓冲池中创建出来的对象会被列到名称为CreaterGroup这个组中去
- pool.group.name = "CreatorGroup";//默认名称为CreatorPool
- //指定这个组的父节点(此时的父节点被指定为当前脚本悬挂的对象,即Creator对象)
- pool.group.parent = this.transform;
- //那么从缓冲池获取对象,对象的层次关系为:
- // Creator
- // -------CreatorGroup
- // ---------------------Sphere(Clone)001
- // ---------------------Sphere(Clone)002
- // ---------------------Sphere(Clone)003
- //指定这个组(即CreatorGroup)的位置与旋转
- pool.group.localPosition = new Vector3(1.5f, , );
- pool.group.localRotation = Quaternion.identity;
- //创建预设
- PrefabPool prefabPool = new PrefabPool(testPrefab);
- //缓存池这个Prefab的最大保存数量
- prefabPool.preloadAmount = ;
- //是否开启缓存池智能自动清理模式
- prefabPool.cullDespawned = true;
- //缓存池自动清理,但是始终保留几个对象不清理
- prefabPool.cullAbove = ;
- //每过多久执行一遍自动清理(销毁),单位是秒
- prefabPool.cullDelay = ;
- //每次自动清理2个游戏对象
- prefabPool.cullMaxPerPass = ;
- //是否开启实例的限制功能
- prefabPool.limitInstances = true;
- //限制缓存池里最大的Prefab的数量,它和上面的preloadAmount是有冲突的,如果同时开启则以limitAmout为准
- prefabPool.limitAmount = ;
- //如果我们限制了缓存池里面只能有10个Prefab,如果不勾选它,那么你拿第11个的时候就会返回null。如果勾选它在取第11个的时候他会返回给你前10个里最不常用的那个
- prefabPool.limitFIFO = true;
- //加入此预设
- pool.CreatePrefabPool(prefabPool);
- //开启协同,实例化对象
- StartCoroutine(Spawner());
- }
- //每隔一段时间实例化一个对象
- private IEnumerator Spawner()
- {
- int count = this.spawnAmount;
- Transform inst;
- while (count > )
- {
- inst = pool.Spawn(this.testPrefab, Vector3.zero, Quaternion.identity);
- inst.localPosition = new Vector3(this.spawnAmount - count, , );
- count--;
- yield return new WaitForSeconds(this.spawnInterval);
- }
- // 开始销毁对象
- this.StartCoroutine(Despawner());
- }
- //每隔一段时间销毁一个对象
- private IEnumerator Despawner()
- {
- while (pool.Count > )
- {
- Transform instance = pool[pool.Count - ];
- pool.Despawn(instance);
- yield return new WaitForSeconds(this.spawnInterval);
- }
- }
- }
Code
取缓冲池中的某一个对象
- Transform cubePrefab = PoolManager.Pools["Shapes"].prefabs["Cube"];
- Transform cubeinstance = PoolManager.Pools["Shapes"].Spawn(cubePrefab);
- cubeinstance.name = "Cube (Spawned By CreationExample.cs)";
参考:http://www.xuanyusong.com/archives/2974
PoolManager的更多相关文章
- urllib3 PoolManager
A pool manager is an abstraction for a collection of ConnectionPools.If you need to make requests to ...
- cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)
#include <CCRef.h> Ref is used for reference count manangement. If a classinherits from Ref. C ...
- PoolManager 简单使用
如图,创建空物体并命名 PoolManager,添加 脚本 spawn pool,并添加 如上图右边一些 参数,prefab为 Resources中 的预置体. 添加 空物体并 改名,如上图,并添加脚 ...
- 对象池3(方法功能)PoolManager(控制)PoolTimeObject(时间管理)text01(调用)Destorys(销毁)
1.对象池PoolManager namespace kernal { public class PoolManager : MonoBehaviour { //“缓冲池”集合 public stat ...
- Untiy PoolManager随手记
用法,1是获取,2是清除, 问题是这个池到底能做什么用 首先用这个池生成的对象是在池节点下使用,而不是取出来用(可以取出来用,直接transform.parent赋值就可以) 疑问,池里面的节点时什么 ...
- PoolManager插件(转载)
http://www.xuanyusong.com/archives/2974 前几天我在博客里面分享了为什么Unity实例化很慢的原因,并且也分享了一个缓存池的工具.有朋友给我留言说PoolMana ...
- Appium - multiprocessing.pool.MaybeEncodingError-【 “Can’t pickle local object ‘PoolManager.__init__.<locals>.<lambda>‘】
公司同事学习自动化新装环境后,run多进程测试用例时出错: multiprocessing.pool.MaybeEncodingError: Error sending result: ’<ap ...
- cocos2d-x内存管理
Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一. 为什么需要内存管理 1. new和delete 2. 堆上申 ...
- 爬虫requests模块 2
会话对象¶ 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能.所 ...
随机推荐
- 立体最短路径,广搜(POJ2251)
题目链接:http://poj.org/problem?id=2251 参考了一下大神们的解法.也有用深搜的.然而,之前不久看到一句话,最短路径——BFS. 参考:http://blog.csdn.n ...
- 2017.9.30 Java中引用类型变量的创建及使用&循环的高级
今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 ...
- 1.Netty入门
Netty入门 1.Netty介绍 (1)百度百科介绍: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络 ...
- Erwin 简单使用
1. 物理设计:汉译英过程 ① Logical 中操作:Tools-Names-Edit Naming Standards…-Glossary选项import,导入内容为编辑好的CSV文件(只包含中文 ...
- JSON 与 XML 的比较 - iOS
在与 web 服务进行数据交换的时候,通常支持两种主要的数据格式(即:JavaScript 对象表示法 JSON 与可扩展标记语言 XML),两者在可读性上都不分高下,接下来对此进行简单的总结和分析, ...
- iOS第三方支付(支付宝)
使用支付宝进行一个完整的支付功能,大致有以下步骤: 与支付宝签约,获得商户ID(partner)和账号ID(seller) 下载相应的公钥私钥文件(加密签名用) 下载支付宝SDK 生成订单信息 调用支 ...
- 解题:在下面画线的地方填任何代码,使得最终输出 'hello world',至少写五个不同思路的方案
今天(已经好些天前了...),群里面(JS前端开发跳板6群[81501322])有个群友问了这样一个问题. 如题:在下面画线的地方填任何代码,使得最终输出 'hello world',至少写五个不同思 ...
- vs code配置c/c++调试环境+mingw+windows
目录 1.安装codeblocks 2.配置mingw环境变量 3.配置.vscode文件夹的json文件 ref 1.安装codeblocks 我已经安装过vscode和c++扩展插件,现在需要g+ ...
- POJ2154 Color(Polya定理)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11654 Accepted: 3756 Description Bead ...
- poj_2689_Prime Distance
The branch of mathematics called number theory is about properties of numbers. One of the areas that ...