GameObjectPool——Unity中的对象池
这里介绍一种对象池的写法。它的优点在于无论取出还是插入游戏物体都是常数量时间。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//对象池
public class GameObjectPool : MonoSingleton<GameObjectPool>
{ /// <summary>可能存放多个种类的对象,每个种类有多个对象 </summary>
private Dictionary<string, LinkedList<GameObject>> Pool = new Dictionary<string, LinkedList<GameObject>>();
private Dictionary<GameObject, LinkedListNode<GameObject>> ObjectDic = new Dictionary<GameObject, LinkedListNode<GameObject>>();
/// <summary>增加物体进入池(按类别增加)</summary>
public void Add(string key, GameObject go)
{
//1.如果key在容器中存在,则将go加入对应的列表
//2.如果key在容器中不存在,是先创建一个列表,再加入
if (!Pool.ContainsKey(key))
{
Pool.Add(key, new LinkedList<GameObject>());
}
LinkedListNode<GameObject> t = new LinkedListNode<GameObject>(go);
Pool[key].AddLast(t);
ObjectDic[go] = t; } /// <summary>销毁物体(将对象隐藏)</summary>
public void MyDestory(string key, GameObject destoryGo)
{
//设置destoryGo隐藏
ObjectDic[destoryGo].Value.SetActive(false);
LinkedListNode<GameObject> temp = ObjectDic[destoryGo];
Pool[key].Remove(temp);
Pool[key].AddFirst(temp);
} /// <summary>将对象归入池中<summary>
public void MyDestory(string key, GameObject tempGo, float delay)
{
//开启一个协程
StartCoroutine(DelayDestory(key, tempGo, delay));
} /// <summary>延迟销毁</summary>
private IEnumerator DelayDestory(string key, GameObject destoryGO, float delay)
{
//等待一个延迟的时间
yield return new WaitForSeconds(delay);
MyDestory(key, destoryGO);
} /// <summary>创建一个游戏物体到场景 </summary>
public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
{
//先找是否有可用的,如果没有则创建,如果有找到后设置好位置,朝向再返回
GameObject tempGo = Pool[key].First.Value;
if (tempGo.activeSelf == false)
{
tempGo.transform.position = position;
tempGo.transform.rotation = quaternion;
tempGo.SetActive(true);
Pool[key].RemoveFirst();
Pool[key].AddLast(ObjectDic[tempGo]);
}
else
{
tempGo = GameObject.Instantiate(go, position, quaternion) as GameObject;
Add(key, tempGo);
}
return tempGo; } /// <summary>清空某类游戏对象</summary>
public void Clear(string key)
{
var t = Pool[key].First;
while (t.Next!=null)
{
ObjectDic.Remove(t.Value);
}
Pool.Remove(key); } /// <summary>清空池中所有游戏对象</summary>
public void ClearAll()
{
ObjectDic.Clear();
Pool.Clear();
}
}
GameObjectPool——Unity中的对象池的更多相关文章
- Unity编程标准导引-3.4 Unity中的对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- Java 中的对象池实现
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...
- unity中实现简单对象池,附教程原理
Unity对象池的创建与使用 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- .net core中的对象池
asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...
- Unity性能优化-对象池
1.对象池Object Pool的原理: 有些GameObject是在游戏中需要频繁生成并销毁的(比如射击游戏中的子弹),以前的常规做法是:Instantiate不断生成预设件Prefab,然后采用碰 ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- Egret中的对象池Pool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...
随机推荐
- Java 中(静态)变量、(静态)代码块的执行顺序
Java 中(静态)变量.(静态)代码块的执行顺序 非原创 本文讨论 Java 中(静态)变量.(静态)代码块的执行顺序 首先创建 3 个类 1.Foo 类 public class Foo { pu ...
- 缩略图信息提取工具vinetto
缩略图信息提取工具vinetto 在Windows操作系统中,为了方便用户快速浏览图片,系统会自动为每个图片生成预览图.预览图默认保存在同目录的Thumbs.db文件中.当图片文件删除后,Thum ...
- Wordpress,你好!
[caption id="" align="alignleft" width="1024"] 耳机[/caption] 想了想,还是没有删掉 ...
- Number 和 parseInt 区别
把字符串 转换成 数字的时候, Number 有点不靠谱, 因为会对 '' 和 null 转换成0, parseInt 相对靠谱些; 判断是否是数值时, isNaN 对于字符串'2'的判断是数字, 对 ...
- FastReport.Net使用:[13]如何使用表达式
在FastReport报表中,表达式(Expressions)用在很多地方,譬如文本框,排序过滤器等. 表达式基于报表选择的脚本语言,从菜单[报表]->[选项]打开“报表选项对话框”,切换到“脚 ...
- codevs 1230【pb_ds】
题目链接[http://codevs.cn/problem/1230/] 题意:给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 题解:很简单的一道题,可以选择用 ...
- Properties Editor 中文编辑器 汉化
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 在Eclipse的 [Help]-> [ Install New Software ...
- CodeForces 1065E. Side Transmutations 计数
昨天不该早点走的.... 首先操作限制实际上是一个回文限制 每个$b[i] - b[i - 1]$互不干扰,不妨设这个串关于中心点对称的这么一对区间的串分别为$(S_1, S_2)$ 题目的限制相当与 ...
- 1.8(SQL学习笔记)触发器
一.触发器简介 当需要某些操作在某些语句执行之前或之后执行就需要使用触发器. 例如每次插入数据时进行数据校对,每次删除数据后将删除内容备份到新表. 这些操作我们希望它(某些语句)在满足某些条件时自动执 ...
- 数组中找出最小的K个数
题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...