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

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. cvc-complex-type.2.4.d: 发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素。

      Eclipse上开发Android的时候,新建的项目提示: [2016-01-13 14:07:56 - android SDK] Error when loading the SDK: Erro ...

  2. cordova 整合 webpack vue

    cordova 是hybrid开发app的一个框架,通过js桥接原生api实现了js调用原生的一些功能:本打算学习下阿里的weex:可是一直打包不了,加上之前也用过cordova,打算使用cordov ...

  3. ref:PHP代码注入审计

    ref:https://www.waitalone.cn/php-code-injection.html 通俗易懂,全面清晰. 0x1 前言 为了方便自己以后的翻阅和查找,最近正在整理一些所学的内容. ...

  4. 2018IEEE冬季生物识别学校 5天课程

    里边有很多介绍及相关报告的PPT https://www.comp.hkbu.edu.hk/wsb18/index.php https://www.comp.hkbu.edu.hk/wsb18/pro ...

  5. 【atcoder F - Namori】**

    F- Namori http://agc004.contest.atcoder.jp/tasks/agc004_f Time limit : 2sec / Memory limit : 256MB S ...

  6. HNOI2017滚粗记

    DAY0: 高三学长说了考前要么就完全颓废要么就完全学,所以我们就完全开启了颓废模式.上午教练带队去烈士公园游玩,中途机房歌神和QYS一直在谈论如何用LCT动态维护树的直径,ORZORZORZ.... ...

  7. Google Code Jam 2010 Round 1C Problem A. Rope Intranet

    Google Code Jam 2010 Round 1C Problem A. Rope Intranet https://code.google.com/codejam/contest/61910 ...

  8. Java 常用远程调用协议比较

    一.综述本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的远程通讯协 ...

  9. Markdown 简明语法手册 - 作业

    目录 Cmd Markdown 简明语法手册 1. 内容目录 2. 标签分类 3. 删除线 水平线--- 1. 斜体和粗体 2. 分级标题 标题1 标题2 标题3 3. 外链接 4. 无序列表 5. ...

  10. 解决新版本webpack vue-cli生成文件没有dev.server.js问题

    新版本webpack生成的dev.server.js 在webpack.dev.conf.js中 webpack.dev.conf.js const axios = require('axios') ...