Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能。

主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示。如果不存在则创造一个新的。

当销毁时,调用协程延时隐藏物体。

    // <summary>
/// 对象池
/// </summary>
public class GameObjectPool : MonoSingleton<GameObjectPool>
{
//内部容器,用于存入缓存的对象
private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>(); /// <summary>
/// 生产物体
/// </summary>
public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
{
//有:key对应列表中有没有可用(非活动状态)的物体
var tempGo = FindUsable(key);
if (tempGo != null)
{
//有:设置后返回可用物体
tempGo.transform.position = position;
tempGo.transform.rotation = quaternion;
tempGo.SetActive(true);
}
else
{
//没有:(场景中没有,内存中也没有)创建物体后添加cache,
tempGo = Instantiate(go, position, quaternion) as GameObject;
Add(key, tempGo);
}
return tempGo;
} /// <summary>
/// 将对象放入缓存
/// </summary>
private void Add(string key, GameObject newObject)
{
//创建key,创建key的列表
if (!cache.ContainsKey(key))
cache.Add(key, new List<GameObject>());
cache[key].Add(newObject);
} /// <summary>
/// 找对应key的列表中没有没可用的物体
/// </summary>
private GameObject FindUsable(string key)
{
//有Key: 找非活动状态的物体
if (cache.ContainsKey(key))
{
return cache[key].Find(p => !p.activeSelf);
}
return null;
} /// <summary>
/// 即时回收
/// </summary>
/// <param name="go">要回收的对象</param>
public void CollectObject(GameObject go)
{
go.SetActive(false);
} /// <summary>
/// 延时回收
/// </summary>
/// <param name="go">要回收的对象</param>
/// <param name="delay">延时时长</param>
public void CollectObject(GameObject go,float delay)
{
//开启协程
StartCoroutine(Delay(go,delay));
} /// <summary>
/// 用于回收的协程方法
/// </summary>
public IEnumerator Delay(GameObject go,float delay)
{
//等待delay之后,
yield return new WaitForSeconds(delay);
//调用即时回收
CollectObject(go);
} /// <summary>
/// 将key对象的缓存物体从池中清除(销毁)
/// </summary>
/// <param name="key"></param>
public void Clear(string key)
{
if(cache.ContainsKey(key))
{
while (cache[key].Count > )
{
//销毁每个物体
Destroy(cache[key][]);
//删除列表中的空引用
cache[key].RemoveAt();
}
//删除key
cache.Remove(key);
}
} /// <summary>
/// 清空池中物体
/// </summary>
public void ClearAll()
{ //遍历所有的key
List<string> keys = new List<string>(cache.Keys);
//逐个清除
while (cache.Count > )
{
Clear(keys[]);
keys.RemoveAt();
}
}
}

Unity 对象池 生产 保存的更多相关文章

  1. Unity——对象池管理

    Unity对象池管理 一.Demo展示 二.逻辑 在游戏中会出现大量重复的物体需要频繁的创建和销毁:比如子弹,敌人,成就列表的格子等: 频繁的创建删除物体会造成很大的开销,像这种大量创建重复且非持续性 ...

  2. Unity ----- 对象池GameObjectPool

    孙广东 2014.6.28 非常早之前看到的外国文章,认为不错,分享一下. 对象池在AssetStore中也是有非常多插件的,可是有些重了.自己写一个轻量的岂不是非常好. 当你须要创建大量某种类型对象 ...

  3. Unity 对象池的使用

    在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的 ...

  4. Unity对象池的实现

    对象池是一个单例类: using System.Collections; using System.Collections.Generic; using UnityEngine; public cla ...

  5. 游戏设计模式——Unity对象池

    对象池这个名字听起来很玄乎,其实就是将一系列需要反复创建和销毁的对象存储在一个看不到的地方,下次用同样的东西时往这里取,类似于一个存放备用物质的仓库. 它的好处就是避免了反复实例化个体的运算,能减少大 ...

  6. Unity对象池管理

    链接: http://www.xuanyusong.com/archives/2925 http://www.xuanyusong.com/archives/2974 https://www.cnbl ...

  7. Unity实现简单的对象池

    一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...

  8. Java小对象的解决之道——对象池(Object Pool)的设计与应用

    一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...

  9. Unity中对象池的使用

    unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在 ...

随机推荐

  1. Java泛型的一点用法(转)

    1.一个优秀的泛型,建议不要这样写public static <K, V> Map<K, V> getMap(String source, String firstSplit, ...

  2. TCP的核心系列 — SACK和DSACK的实现(一)

    TCP的实现中,SACK和DSACK是比较重要的一部分. SACK和DSACK的处理部分由Ilpo Järvinen (ilpo.jarvinen@helsinki.fi) 维护. tcp_ack() ...

  3. linux之iptable案例

    转自:http://blog.csdn.net/bill_lee_sh_cn/article/details/4401896 1.一对一流量完全DNAT 首先说一下网络环境,普通主机一台做防火墙用,网 ...

  4. JS年月日三级联动下拉框日期选择代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. IOS使用pch预编译文件

    首先新建一个pch文件,然后要修改这个项目的Build Setting中的Prefix Header 修改为 $(SRCROOT)/项目名称/预编译文件名: 一般pch文件的用处: 1.导入框架,如: ...

  6. UVa340 Master-Mind Hints

    #include <stdio.h>#include <string.h> #define MIN(a,b) (((a) < (b)) ? (a) : (b)) int ...

  7. Problem D Ananagrams(map的使用)

    题目链接:Problem D 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另一个单词.在判断是否满足条件时,字母不区分大小写. 但是输出时应保留原始大小写, ...

  8. app微信支付服务器端php demo

    class Wxpay { /* 配置参数 */ private $config = array( 'appid' => "wxc92b12277f277355", /*微信 ...

  9. MVC-07 案例2

    二.电子商务网站 掌握该网站的开发流程和设计思路,并为数据模型中商品.商品分类,这两个类编写代码. 1.需求分析 2.数据模型规划 (1)商品类别 (2)商品信息 (3)会员信息 (4)购物车项目 ( ...

  10. 名叫Florida的女孩问题

    近读列纳德·蒙洛迪诺的<醉汉的脚步>,读到第六章,作者举了一个超级变态的例子来解释条件概率或者说是贝叶斯概率. 1.先来看一个简单点的问题:已知所有有2个孩子的家庭,其中一个家庭2个孩子都 ...