对象池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的更多相关文章

  1. unity游戏开发_对象池

    现在假设游戏中我们需要实现一个这样功能,按下鼠标左键,发射一颗子弹,3秒之后消失.在这个功能中,我们发射了上百上千发子弹,就需要实例化生成上百上千次.这时候,我们就需要使用对象池这个概念,每次实例化生 ...

  2. 通用对象池ObjectPool的一种简易设计和实现方案

    对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...

  3. Java对象池技术的原理及其实现

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  4. 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...

  5. 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

    游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...

  6. 对象池3(方法功能)PoolManager(控制)PoolTimeObject(时间管理)text01(调用)Destorys(销毁)

    1.对象池PoolManager namespace kernal { public class PoolManager : MonoBehaviour { //“缓冲池”集合 public stat ...

  7. 对象池1(方法功能)PoolOption

    2.对象池PoolOption(方法功能) //单类型缓冲对象管理(单模池操作管理)功能: 激活.收回.预加载等. namespace kernal { [System.Serializable] p ...

  8. 常量池与方法区以及又读new String对象创建问题

    又拿出这道String str1 = new String("abc");创建几个对象的面试题梳理了一下常量池与方法区的关系,希望能把这两者的关系通过这道面试题说明白 方法区是什么 ...

  9. Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法

    切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...

随机推荐

  1. Oracle数据库之多表查询一

    上一篇给大家介绍了数据的单表查询,相信大家对于单表的查询应该都有了一些了解.单表查询在数据库中的使用会有一些,但并不是很多,但是作为初学者,我们需要学习单表查询的思路.今天呢,我们为大家介绍一下数据库 ...

  2. CodeForces 404D Minesweeper 1D (DP)

    题意:给定一个序列,*表示雷,1表示它旁边有一个雷,2表示它旁边有两个雷,0表示旁边没有雷,?表示未知,求有多少情况. 析:dp[i][j] 表示第 i 个放 j 状态,有多少种情况,然后很简单的DP ...

  3. Date的转换输出

    public static void main(String[] args) { // TODO Auto-generated method stub //20131111怎么格式化成2013年11月 ...

  4. [转]Passing Managed Structures With Strings To Unmanaged Code Part 3

    1. Introduction. 1.1 In part 1 of this series of blogs we studied how to pass a managed structure (w ...

  5. 生成全局唯一ID

    在实际业务处理中,有时需要生成全局唯一ID来区别同类型的不同事物,介绍一下几种方式及其C++实现 //获取全局唯一ID //server_id为服务的id,因当同一个服务部署在多个服务器上时,需要区别 ...

  6. JavaEE常用开发工具分享

    链接:https://pan.baidu.com/s/1Jxd2Y45LhWAUHc8-dM_ukw 提取码:h50f

  7. (原创)Problem B: JRM的自动机

    Description JRM自称是自动机之鼻祖,今天他又发明了一个自动机.人称自动复读机,宣称比LGQ的复读机的性能好无数倍.这个复读机有很多功能,你可以教会他 如何回答一个问题,还可以询问他问题, ...

  8. jQuery回车触发事件

    举例: 需求:要求回车触发下一步 Html部分 <div style="margin-top: 25px;"> <a href="#" cla ...

  9. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  10. P3554 [POI2013]LUK-Triumphal arch

    \(\color{#0066ff}{ 题目描述 }\) 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否 ...