2.对象池PoolOption(方法功能)

//单类型缓冲对象管理(单模池操作管理)功能: 激活、收回、预加载等。

namespace kernal

{

[System.Serializable]

public class PoolOption

{

public GameObject Prefab;                           //存储的“预设”

public int IntPreLoadNumber = 0;                      //初始缓冲数量

public int IntAutoDeactiveGameObjectByTime = 30;       //按时间自动禁用游戏对象

[HideInInspector]

//活动使用的游戏对象集合

public List<GameObject> ActiveGameObjectArray = new List<GameObject>();

[HideInInspector]

//非活动状态(禁用)的游戏对象集合

public List<GameObject> InactiveGameObjectArray = new List<GameObject>();

private int _Index = 0;

// 预加载

internal GameObject PreLoad(GameObject prefab, Vector3 positon, Quaternion rotation)

{

GameObject obj = null;

if (prefab)

{

obj = Object.Instantiate(prefab, positon, rotation) as GameObject;

Rename(obj);

obj.SetActive(false);          //设置非活动状态

//加入到“非活动游戏对象”集合中。

InactiveGameObjectArray.Add(obj);

}

return obj;

}

// 激活游戏对象

internal GameObject Active(Vector3 pos, Quaternion rot)

{

GameObject obj;

if (InactiveGameObjectArray.Count != 0)

{

//从“非活动游戏集合”容器中取出下标为0的游戏对象

obj = InactiveGameObjectArray[0];

//从“非活动游戏集合”容器中移除下标为0的游戏对象

InactiveGameObjectArray.RemoveAt(0);

}

else

{

//“池”中没有多余的对象,则产生新的对象

obj = Object.Instantiate(Prefab, pos, rot) as GameObject;

//新的对象进行名称“格式化”处理

Rename(obj);

}

//对象的方位处理

obj.transform.position = pos;

obj.transform.rotation = rot;

//新对象正式加入“活动池”容器中。

ActiveGameObjectArray.Add(obj);

obj.SetActive(true);

return obj;

}

// 禁用游戏对象

internal void Deactive(GameObject obj)

{

ActiveGameObjectArray.Remove(obj);

InactiveGameObjectArray.Add(obj);

obj.SetActive(false);

}

// 统计两个“池”中所有对象的数量

internal int totalCount

{

get

{

int count = 0;

count += this.ActiveGameObjectArray.Count;

count += this.InactiveGameObjectArray.Count;

return count;

}

}

// 全部清空集合(两个“池”)

internal void ClearAllArray()

{

ActiveGameObjectArray.Clear();

InactiveGameObjectArray.Clear();

}

// 彻底删除所有“非活动”集合容器中的游戏对象。

internal void ClearUpUnused()

{

foreach (GameObject obj in InactiveGameObjectArray)

{

Object.Destroy(obj);

}

InactiveGameObjectArray.Clear();

}

// 游戏对象重命名,对新产生的游戏对象做统一格式处理,目的是做“时间戳”处理。

private void Rename(GameObject instance)

{

instance.name += (_Index + 1).ToString("#000");

//游戏对象(自动禁用)时间戳  [Adding]

instance.name = IntAutoDeactiveGameObjectByTime + "@" + instance.name;

_Index++;

}

// 删除“非活动”容器集合中的一部分指定数量数据

internal void DestoryCount(int count)

{

if (count > InactiveGameObjectArray.Count)

{

ClearUpUnused();

return;

}

for (int i = InactiveGameObjectArray.Count - 1; i >= InactiveGameObjectArray.Count - count; i--)

{

Object.Destroy(InactiveGameObjectArray[i]);

}

InactiveGameObjectArray.RemoveRange(InactiveGameObjectArray.Count - count, count);

}

// 回调函数、时间管理、所有游戏对象进行时间倒计时管理,时间小于零则进行“非活动”容器集合中,即:按时间自动回收游戏对象。

internal void AllActiveGameObjectTimeSubtraction()

{

for (int i = 0; i < ActiveGameObjectArray.Count; i++)

{

string strHead = null;

string strTail = null;

int intTimeInfo = 0;

GameObject goActiveObj = null;

goActiveObj = ActiveGameObjectArray[i];

//得到每个对象的时间戳

string[] strArray = goActiveObj.name.Split('@');

strHead = strArray[0];

strTail = strArray[1];

//时间戳-10 处理

intTimeInfo = System.Convert. (strHead);

if (intTimeInfo >= 10)

{

strHead = (intTimeInfo - 10).ToString();

}

else if (intTimeInfo <= 0)

{

//游戏对象自动转入禁用

goActiveObj.name = IntAutoDeactiveGameObjectByTime.ToString() + "@" + strTail;

this.Deactive(goActiveObj);

continue;

}

//时间戳重新生成

goActiveObj.name = strHead + '@' + strTail;

}

}

}

注:这段对象池代码是对象池的功能方法,基础的实现方式,加载、显示、隐藏、时间控制等

对象池1(方法功能)PoolOption的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 对象池2(方法功能)Pools

    对象池Pools(主要调用方法功能) namespace kernal { public class Pools : MonoBehaviour { [HideInInspector] public ...

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

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

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

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

  9. C# 对象池的实现(能限制最大实例数量,类似于WCF的MaxInstanceCount功能)

    对象池服务可以减少从头创建每个对象的系统开销.在激活对象时,它从池中提取.在停用对象时,它放回池中,等待下一个请求.我们来看下主线程中,如何与对象池打交道: static void Main(stri ...

随机推荐

  1. 数据结构_sfdg(小F打怪)

    问题描述 小 F 很爱打怪, 今天因为系统 bug, 他提前得知了 n 只怪的出现顺序以及击倒每只怪得到的成就值 ai. 设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒钟出现一只新怪且没被击倒 ...

  2. 开启wifi后不能ping通本机 Cann't ping the local PC while start a wlan

    问题如题:今天发现一个问题,测试本机ip时候有时候总是获取失败,后来才发现是wifi共享软件导致的缘故. 本来呢?我买的是小米wifi,但是小米wifi对应的客户端不是很好用,动不动就启动失败,不要问 ...

  3. 使用docker的kms服务器激活office2016专业增强版

    我安装了office2016专业增强版,使用自己搭建的kms激活服务器无法激活,回来使用了一下脚本: 感谢,rainfarm的博主.博客地址:http://blog.sina.com.cn/s/blo ...

  4. Mac下的UI自动化测试 (二)

    下面讲一下Sikuli的重要概念,就是region,所谓region就是Sikuli在进行图像识别的时候的一个区域,默认是整个屏幕. 当然,如果region选得太大的话,并且UI上存在相似的控件,那么 ...

  5. android: 获取屏幕高度和虚拟导航栏高度的几种方法

    package com.yongdaimi.android.androidapitest; import android.app.Activity; import android.content.Co ...

  6. 异步解决方案(三)Promise

    首先建议大家先看看这篇博文,这是我看过的最清晰给力的博文了: https://www.cnblogs.com/lvdabao/p/es6-promise-1.html 附赠一篇笑死我了的博客,加入有一 ...

  7. JS模式和原型精解

    首先需要知道的是 模式只是思想.不要用 结构 看模式. ES中函数是对象,因此函数也有属性和方法. 每个函数含有两个属性: length 和 prototype 每个函数含有两个非继承的方法: app ...

  8. 1005 继续(3n+1)猜想(25 分)

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...

  9. Ansible故障

    常见问题一: [root@m01 ~]# ansible  -k 172.16.1.51 -m ping SSH password: [WARNING]: No hosts matched, noth ...

  10. xshell连接不上

    1.排查道路通不通 ping  baidu.com   是否通畅,如果不通 2.排查DNS ping 223.5.5.5 地址解释是否通畅 3.是否有劫财劫色的 检查防火墙   selinux是否 关 ...