对象池2(方法功能)Pools
对象池Pools(主要调用方法功能)
namespace kernal
{
public class Pools : MonoBehaviour
{
[HideInInspector]
public Transform ThisGameObjectPosition; //本类挂载游戏对象位置
public List<PoolOption> PoolOptionArrayLib = new List<PoolOption>();
//“单模缓冲池”集合容器
public bool IsUsedTime = false; //是否用“时间戳”
void Awake()
{
PoolManager.Add(this); //加入“多模复合池”管理器
ThisGameObjectPosition = transform;
//预加载
PreLoadGameObject();
}
void Start()
{
//开始时间戳处理
if (IsUsedTime)
{
InvokeRepeating("ProcessGameObject_NameTime", 1F, 10F);
}
}
// 时间戳处理:每间隔10秒种,对所有正在使用的活动状态游戏对象的时间戳减去10秒,活动状态的游戏对象名称的时间戳如果小于等于0,则进入禁用状态,重新进入活动状态的游戏对象,获得预先设定的存活时间写入对象名称的时间戳中。(时间的判断根据命名来判断)
void ProcessGameObject_NameTime()
{
//循环体为定义的“种类”数量
for (int i = 0; i < PoolOptionArrayLib.Count; i++)
{
PoolOption opt = this.PoolOptionArrayLib[i];
//所有正在使用的活动状态游戏对象的时间戳减去10秒,检查每个活动状态的游戏对象名称的时间戳如果小于等于0,则进入禁用状态
opt.AllActiveGameObjectTimeSubtraction();
}
}
public void PreLoadGameObject() //预加载
{
for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)
{ //“多模”集合
PoolOption opt = this.PoolOptionArrayLib[i]; //“单模”集合
for (int j = opt.totalCount; j < opt.IntPreLoadNumber; j++)
{
GameObject obj = opt.PreLoad(opt.Prefab, Vector3.zero, Quaternion.identity);
//所有预加载的游戏对象规定为Pool类所挂游戏对象的子对象。
obj.transform.parent = ThisGameObjectPosition;
}
}
}
// 得到游戏对象,从缓冲池中(“多模”集合) 功能描述: 对指定“预设”在自己的缓冲池中激活一个,且加入自己缓冲池中的"可用激活池",然后再建立一个池对象,且激活预设,再加入自己的缓冲池中的“可用激活池”中。
public GameObject GetGameObjectByPool(GameObject prefab, Vector3 pos, Quaternion rot)
{
GameObject obj = null;
//循环体为定义的“种类”数量
for (int i = 0; i < PoolOptionArrayLib.Count; i++)
{
PoolOption opt = this.PoolOptionArrayLib[i];
if (opt.Prefab == prefab)
{
//激活指定“预设”
obj = opt.Active(pos, rot);
if (obj == null) return null;
//所有激活的游戏对象必须是本类所挂空对象的子对象。
if (obj.transform.parent != ThisGameObjectPosition)
{
obj.transform.parent = ThisGameObjectPosition;
}
}
}
return obj;
}
// 收回游戏对象(“多模”集合)
public void RecoverGameObjectToPools(GameObject instance)
{
for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)
{
PoolOption opt = this.PoolOptionArrayLib[i];
//检查自己的每一类“池”中是否包含指定的“预设”对象。
if (opt.ActiveGameObjectArray.Contains(instance))
{
if (instance.transform.parent != ThisGameObjectPosition)
instance.transform.parent = ThisGameObjectPosition;
//特定“池”回收这个指定的对象。
opt.Deactive(instance);
}
}
}
// 销毁无用的对象(“多模”集合)
public void DestoryUnused()
{
for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)
{
PoolOption opt = this.PoolOptionArrayLib[i];
opt.ClearUpUnused();
}
}
// 销毁指定数量的游戏对象
public void DestoryPrefabCount(GameObject prefab, int count)
{
for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)
{
PoolOption opt = this.PoolOptionArrayLib[i];
if (opt.Prefab == prefab)
{
opt.DestoryCount(count);
return;
}
}
}
// 当本脚本所挂载的游戏对象销毁时候,清空所有集合内全部数据
public void OnDestroy()
{
//停止时间戳的检查
if (IsUsedTime)
{
CancelInvoke("ProcessGameObject_NameTime");
}
for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)
{
PoolOption opt = this.PoolOptionArrayLib[i];
opt.ClearAllArray();
}
}
}
}
注:这段对象池代码是对象池的调用实现功能的人方法,主要调用基础的实现方式,加载、显示、隐藏、时间控制等返回给上层调用的地方。
对象池2(方法功能)Pools的更多相关文章
- unity游戏开发_对象池
现在假设游戏中我们需要实现一个这样功能,按下鼠标左键,发射一颗子弹,3秒之后消失.在这个功能中,我们发射了上百上千发子弹,就需要实例化生成上百上千次.这时候,我们就需要使用对象池这个概念,每次实例化生 ...
- 通用对象池ObjectPool的一种简易设计和实现方案
对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...
- Java对象池技术的原理及其实现
看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...
- 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现
欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...
- 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)
游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...
- 对象池3(方法功能)PoolManager(控制)PoolTimeObject(时间管理)text01(调用)Destorys(销毁)
1.对象池PoolManager namespace kernal { public class PoolManager : MonoBehaviour { //“缓冲池”集合 public stat ...
- 对象池1(方法功能)PoolOption
2.对象池PoolOption(方法功能) //单类型缓冲对象管理(单模池操作管理)功能: 激活.收回.预加载等. namespace kernal { [System.Serializable] p ...
- 常量池与方法区以及又读new String对象创建问题
又拿出这道String str1 = new String("abc");创建几个对象的面试题梳理了一下常量池与方法区的关系,希望能把这两者的关系通过这道面试题说明白 方法区是什么 ...
- Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法
切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...
随机推荐
- 数据结构_calculator
问题描述 小 V 发明了一个神奇的整数计算器:给定一个合法的表达式,这个计算器能求出这个表达式的最终答案.表达式可能包含:+:运算符,整数加法.如 1+1=2-:运算符,整数减法.如 1-1=0*:运 ...
- 数据结构 i_love(我喜欢)
数据结构 i_love(我喜欢) 问题描述 集训队的学长们都怪怪的,如果 A 学长喜欢 B 学长, A 就会把自己的名字改成«I_love_<B 学长的名字>».但是奇怪的学长们很容易移情 ...
- 23种计模式之Python实现(史上最全最通俗易懂)内容整改中
第一篇 Python与设计模式:前言 第二篇(23种设计模式) 创建类设计模式(5种) 单例模式.工厂模式.简单工厂模式.抽象工厂模式.建造者模式.原型模式 结构类设计模式(7种) 代理模式.装饰器模 ...
- Spring第四篇
在spring第三篇中介绍了bean元素属性 在第四篇中介绍spring注入的方式 1 set方法注入 建立一个User类 创建私有的属性 set get 方法 重写toString方法 代码如下 ...
- JMeter上传文件 点选form-data依旧失败的解决方法
转子:https://blog.csdn.net/xingyunpi/article/details/77930476 这几天一直在调用JMeter上传文件的一个接口,一直出错,在网上找到一些文章说的 ...
- 企业建立私有云的N个理由
简而言之,私有云意味着高效.安全.可控(技术路线是否可控另说了),也意味着高成本.有限弹性.(政绩工程不在讨论范围) 全面回答这个问题,其实包括两个部分:为什么要上云计算,以及为什么要采用私有化部署模 ...
- 解决:kali linux 在vmware 虚拟机中使用bridge模式上网的问题
安装kali后,使用独立ip上网,但是设置bridge模式后依然上不了网,后来查了好多资料才解决。 能ping通网页,能ping通DNS,就是不能打开网页。 最后的原因是主机的防火墙拦截,把防火墙关了 ...
- 毛玻璃CHBlurEffect
1.将需要加入毛玻璃的UI控件传入接口即可 1.1 .h文件 // // 文 件 名:CHBlurEffect.h // // 版权所有:Copyright © 2018年 leLight. All ...
- JavaWeb中MVC的使用--以管理系统举例
开发环境:JavaSE1.7.JavaEE7.0.JSTL1.2.2.Web2.3.MySQL5.5.28 系统分析与功能设计: 本系统实现商品信息的管理,应包括以下几个功能: 商品信息列表:列出所有 ...
- (原创)Problem B: JRM的自动机
Description JRM自称是自动机之鼻祖,今天他又发明了一个自动机.人称自动复读机,宣称比LGQ的复读机的性能好无数倍.这个复读机有很多功能,你可以教会他 如何回答一个问题,还可以询问他问题, ...