对象池1(方法功能)PoolOption
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的更多相关文章
- 通用对象池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 ...
- 对象池2(方法功能)Pools
对象池Pools(主要调用方法功能) namespace kernal { public class Pools : MonoBehaviour { [HideInInspector] public ...
- 常量池与方法区以及又读new String对象创建问题
又拿出这道String str1 = new String("abc");创建几个对象的面试题梳理了一下常量池与方法区的关系,希望能把这两者的关系通过这道面试题说明白 方法区是什么 ...
- Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法
切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...
- C# 对象池的实现(能限制最大实例数量,类似于WCF的MaxInstanceCount功能)
对象池服务可以减少从头创建每个对象的系统开销.在激活对象时,它从池中提取.在停用对象时,它放回池中,等待下一个请求.我们来看下主线程中,如何与对象池打交道: static void Main(stri ...
随机推荐
- C# 实现文件(夹)在ftp服务器间的同步【无需将文件(夹)保存到本地】
C#实现不同ftp服务器间文件(夹)同步 图1 实现不同ftp服务器间文件(夹)同步的实现思路图 /// <summary> /// 将文件夹1从ftp服务器1移到ftp服务器2文件夹2 ...
- [学习笔记]Vfork深入理解
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> ...
- 读取url接口数据
string url = "http://localhost:8180/city-smscenter/smscenter?cmd=flowsms.queryMobileSmsList& ...
- 搭建邮件服务器 Postfix + Dovecot (CentOS)
最近分配到一台ECS服务器,需要搭建一台邮件服务器. 查了一波资料选择了Postfix (smtp)和 Dovecot(pop3). 推荐教程:http://www.cnblogs.com/zlbei ...
- Algorithms - Insertion sort
印象 图1 插入排序过程 思想 插入排序(Insertion Sort)的主要思想是不断地将待排序的元素插入到有序序列中,是有序序列不断地扩大,直至所有元素都被插入到有序序列中. 分析 时间复杂度: ...
- iOS工程师 - 简历
基本信息 姓 名:张学友 性 别:男 年 龄:28 学 历:本科 毕业学校:广西师范大学 专 业:通信工程 手 ...
- A Plug for UNIX UVA - 753(网络流)
题意:n个插座,m个设备及其插头类型,k种转换器,没有转换器的情况下插头只能插到类型名称相同的插座中,问最少剩几个不匹配的设备 lrj紫书里面讲得挺好的. 先跑一遍floyd,看看插头类型a能否转换为 ...
- Python中__call__的用法
概念: Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的.换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符. 示例: 所 ...
- Nodejs 文档概览
Node.js v8.11.1 Node.js v8.11.1 文档 今天大致浏览了一下Node.js的官方文档,走马观花的了解了大部分模块的api,对他们的使用场景做一个简单的笔记 assert 断 ...
- 智能合约安全事故回顾(2)-BEC溢出攻击
讲溢出攻击之前,先给大家讲个故事:2014年的时候,美国的宾夕法尼亚州的某个小镇上发生了一个乌龙事件,征兵系统对一万多名1893年到1897出生的男子发去信函,要求他们注册参军,否则面临罚款和监禁.收 ...