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. MockObject

    http://www.mockobjects.com/ http://jmock.org/download.html https://jakarta.apache.org/cactus/mock_vs ...

  2. 专访CEO何朝曦:深信服高速成长的秘诀

    在深信服公司深圳总部的办公室里,要迅速找到几位高管的工位远远不如找一位女员工的座位那样容易. 深信服CEO何朝曦先生 公司里虽然女孩很少,但几乎每位女员工的工位上都有一盆绿植.相比之下,从公司CEO何 ...

  3. NYOJ 527 AC_mm玩dota

    AC_mm玩dota 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 大家都知道AC_mm比较喜欢玩游戏,特别是擅长war3这款经典游戏.某天AC_mm来到了VS平台上 ...

  4. git 导入代码到已有仓库

    git remote add origin https://----------- git push -u origin master //这两行将该目录下的文件推送到远端(origin)上的 &qu ...

  5. kafka集群搭建与apiclient创建

    曾经的消息队列(activeMQ)对于大数据吞吐率不行,但kafka非常好的攻克了此类问题.而且以集群的方式进行扩展.可谓相当强大: 集群搭建方式很轻量级.仅仅需将tar包复制到server,解压,改 ...

  6. HDU 1976 prime path

    题意:给你2个数n m.从n变成m最少须要改变多少次. 当中: 1.n  m  都是4位数 2.每次仅仅能改变n的一个位数(个位.十位.百位.千位),且每次改变后后的新数为素数 思路:搜索的变形题,这 ...

  7. Database(Mysql)发版控制二

    author:skate time:2014/08/18 Database(Mysql)发版控制 The Liquibase Tool related Database 一.Installation ...

  8. STL中主要的算法(一)

    一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template  ...

  9. linux 下手动编译安装无线网卡驱动

    先参照 <本地yum源安装GCC >安装好gcc hp的笔记本上安装了CentOS6.3,没有安装无线网卡驱动,安装这个驱动,在Google上找了好多资料,最后终于解决了这个问题.在这里做 ...

  10. 利用Apperance协议定义View的全局外观

    假设要定义一个全局的bkColor用于背景颜色 1.@property(nonatomic,strong)UIColor *bkColor UI_APPEARANCE_SELECTOR; 2.在下面方 ...