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. 支持统一执行函数 /** * ...
随机推荐
- bzoj 1415 期望dp + 记忆化搜索
思路:这个题看着感觉不能dp,其实是可以dp的,因为狼每次走两步,兔子每次走一步,每进行一轮以后,狼和兔子的距离 肯定是在接近的,没有相同的状态,dp之前预处理出来,每一步狼该往哪里走. #inclu ...
- java.lang.TypeNotPresentException: Type org.eclipse.jetty.maven.plugin.JettyRunMojo not present的原因
原因 :我的JDK版本不支持当前Jetty版本. 解决:将jetty版本换成较低版本的就可以,这个是我之前的我的jdk是1.7.7的 <groupId>org.eclipse.jetty& ...
- 理解裸机部署过程ironic
部署物理机跟部署虚拟机的概念在nova来看是一样,都是nova通过创建虚拟机的方式来触发,只是底层nova-scheduler和nova-compute的驱动不一样.虚拟机的底层驱动采用的libvir ...
- code forces 505A
Mr. Kitayuta's Gift Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- 【BZOJ 2711】 2711: [Violet 2]After 17 (0-1 背包)
2711: [Violet 2]After 17 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 224 Solved: 153 Description ...
- 【BZOJ 2460】线性基
2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力 ...
- BZOJ3619 [Zjoi2014]璀灿光华 构造+dfs
题意:有一个\(a^3\)个小正方体组成的大正方体,其中有n个正方体会向上下左右前后六个方向中的一个发出光,正方体是透光的,被照亮的正方体有个美丽值\(g_{i}\),给出正方体的相邻关系,问美丽值之 ...
- Understanding Cache Access
URL Loading System提供了综合的disk 和 in-memory 策略的请求缓存.使用缓存有利于减少程序对网络的依赖,并且能提高程序的体验. Using the Cache for a ...
- const和define在值定义上的区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
- Codeforces Beta Round #5 D. Follow Traffic Rules 物理
D. Follow Traffic Rules 题目连接: http://www.codeforces.com/contest/5/problem/D Description Everybody kn ...