这里介绍一种对象池的写法。它的优点在于无论取出还是插入游戏物体都是常数量时间。

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

  1. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...

  2. Java中的对象池技术

    java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...

  3. Java 中的对象池实现

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...

  4. unity中实现简单对象池,附教程原理

    Unity对象池的创建与使用 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  5. 关于tomcat中Servlet对象池

    Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...

  6. .net core中的对象池

    asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...

  7. Unity性能优化-对象池

    1.对象池Object Pool的原理: 有些GameObject是在游戏中需要频繁生成并销毁的(比如射击游戏中的子弹),以前的常规做法是:Instantiate不断生成预设件Prefab,然后采用碰 ...

  8. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  9. Egret中的对象池Pool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...

随机推荐

  1. Python类总结-ClassMethod, StaticMethod

    classmethod-把classmethod装饰的方法变成为类中的方法 作用: 把classmethod装饰的方法变成为类中的方法,这个方法直接可以被类调用,不需要依托任何对象 应用场景: 当这个 ...

  2. React Native踩坑之Unable to load script from assets

    报错: Unable to load script from assets 'index.android.bundle'. Make sure your bundle is packaged corr ...

  3. JAVA解析xml的四种方式比较

    1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允 ...

  4. Python开发基础-Day32 进程间通信、进程池、协程

    进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...

  5. POJ1226 Substrings

    后缀数组. 求多个字符串翻转与否中最长公共子串长. 二分答案,反过来多建一倍的字符串,二分时特判一下即可. By:大奕哥 #include<cstring> #include<cst ...

  6. [BZOJ3203][SDOI2013]保护出题人(凸包+三分)

    https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急于转化成几何模型,先把式子化到底再对应到几何图形中去. #include<cstdio&g ...

  7. 【20181023T3】“新”的家园【虚图】

    打死也不告诉你这个名字是我编的 题面 [错解] 哎最短路欸 哎floyd+dijkstra有30分 骗分骗分 [正解] 我们发现n和m(不是E)不是一个数量级的 也就是说,在做传统最短路的时候,很多时 ...

  8. Shell脚本:“syntax error:unexpected end of file”

    这种错误只能说是坑,如果没有见到过,很可能就要摔里头.解决问题是重要的,但弄明白问题的来源,往往更为重要. 所以要先扯一下,换行和回车的历史遗留问题. 在计算机出现之前,有个玩意叫电传打字机.每秒钟可 ...

  9. 不按装mysql情况下,php安装pdo_mysql

    安装pdo时遇到 --with-pdo-mysql  这个要指向mysql安装目录:可是我这台机器不安装mysql; 解决方法: [root@localhost app]#  yum install ...

  10. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...