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

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

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

  1. // <summary>
  2. /// 对象池
  3. /// </summary>
  4. public class GameObjectPool : MonoSingleton<GameObjectPool>
  5. {
  6. //内部容器,用于存入缓存的对象
  7. private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>();
  8.  
  9. /// <summary>
  10. /// 生产物体
  11. /// </summary>
  12. public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
  13. {
  14. //有:key对应列表中有没有可用(非活动状态)的物体
  15. var tempGo = FindUsable(key);
  16. if (tempGo != null)
  17. {
  18. //有:设置后返回可用物体
  19. tempGo.transform.position = position;
  20. tempGo.transform.rotation = quaternion;
  21. tempGo.SetActive(true);
  22. }
  23. else
  24. {
  25. //没有:(场景中没有,内存中也没有)创建物体后添加cache,
  26. tempGo = Instantiate(go, position, quaternion) as GameObject;
  27. Add(key, tempGo);
  28. }
  29. return tempGo;
  30. }
  31.  
  32. /// <summary>
  33. /// 将对象放入缓存
  34. /// </summary>
  35. private void Add(string key, GameObject newObject)
  36. {
  37. //创建key,创建key的列表
  38. if (!cache.ContainsKey(key))
  39. cache.Add(key, new List<GameObject>());
  40. cache[key].Add(newObject);
  41. }
  42.  
  43. /// <summary>
  44. /// 找对应key的列表中没有没可用的物体
  45. /// </summary>
  46. private GameObject FindUsable(string key)
  47. {
  48. //有Key: 找非活动状态的物体
  49. if (cache.ContainsKey(key))
  50. {
  51. return cache[key].Find(p => !p.activeSelf);
  52. }
  53. return null;
  54. }
  55.  
  56. /// <summary>
  57. /// 即时回收
  58. /// </summary>
  59. /// <param name="go">要回收的对象</param>
  60. public void CollectObject(GameObject go)
  61. {
  62. go.SetActive(false);
  63. }
  64.  
  65. /// <summary>
  66. /// 延时回收
  67. /// </summary>
  68. /// <param name="go">要回收的对象</param>
  69. /// <param name="delay">延时时长</param>
  70. public void CollectObject(GameObject go,float delay)
  71. {
  72. //开启协程
  73. StartCoroutine(Delay(go,delay));
  74. }
  75.  
  76. /// <summary>
  77. /// 用于回收的协程方法
  78. /// </summary>
  79. public IEnumerator Delay(GameObject go,float delay)
  80. {
  81. //等待delay之后,
  82. yield return new WaitForSeconds(delay);
  83. //调用即时回收
  84. CollectObject(go);
  85. }
  86.  
  87. /// <summary>
  88. /// 将key对象的缓存物体从池中清除(销毁)
  89. /// </summary>
  90. /// <param name="key"></param>
  91. public void Clear(string key)
  92. {
  93. if(cache.ContainsKey(key))
  94. {
  95. while (cache[key].Count > )
  96. {
  97. //销毁每个物体
  98. Destroy(cache[key][]);
  99. //删除列表中的空引用
  100. cache[key].RemoveAt();
  101. }
  102. //删除key
  103. cache.Remove(key);
  104. }
  105. }
  106.  
  107. /// <summary>
  108. /// 清空池中物体
  109. /// </summary>
  110. public void ClearAll()
  111. {
  112.  
  113. //遍历所有的key
  114. List<string> keys = new List<string>(cache.Keys);
  115. //逐个清除
  116. while (cache.Count > )
  117. {
  118. Clear(keys[]);
  119. keys.RemoveAt();
  120. }
  121. }
  122. }

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. poj 3740 Easy Finding 精确匹配

    题目链接 dlx的第一题, 真是坎坷..... #include <iostream> #include <vector> #include <cstdio> #i ...

  2. 重拾javascript动态客户端网页脚本

    笔记一: 一.DOM 作用: ·              DOM(Doument Object Model) 1.document文档 HTML 文件 (标记语言) <html> < ...

  3. The error indicates that IIS is in 32 bit mode, while this application is a 64 b it application and thus not compatible.

    I was trying to install a new WSS v3 Sharepoint on a 64 bit Windows 2003 server today but the instal ...

  4. jquery 小插件,完成“输入字段预期值的提示信息”,防html5 placeholder属性

    前言:在很多时候,我们需要文本框中显示默认值,获取焦点时,文字框中就会清空给的值,当失去焦点时,如果没有值,继续显示默认的文字,如果有输入值,就显示输入的值.现在项目中需要用到这个地方的功能比较多,于 ...

  5. Mysql 权限修改何时生效

    首先权限是记录在表中的,所以如果我们要修改权限只要修改表中的数据就可以了! 方法 1 grant ,revoke,set password,rename user .......等等 2 insert ...

  6. 浅析JQuery中的html(),text(),val()区别

    1.HTML html():取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档 html(val):设置每一个匹配元素的html内容.这个函数不能用于XML文档.但 ...

  7. Linux/UNIX进程控制(1)

    进程控制(1) 进程标识符 每一个进程都有肺腑的整形表示唯一的进程ID.按一个进程终止后,其进程ID就能够再次使用了.例如以下是几个典型进程的ID及其类型和功能. ID     进程名         ...

  8. android开发_SimpleAdapter适配器

    android开发_SimpleAdapter适配器   新建项目: 项目结构: drawable-hdpi文件夹中的图片是自己加入的.主要是在菜单选项中显示的图片: 运行效果: 代码部分: main ...

  9. 交换机VLAN研究

    这两天在研究openWRT的网络接口问题,涉及到了交换机的一些概念,主要是跟VLAN相关的,在此总结一下. VLAN在802.11Q中定义,802.11Q帧格式如下图所示: 交换机示意图如下图所示: ...

  10. Dos关闭进程命令

    netstat -ao 查找占用端口的进程 taskkikk /pid 端口pid  /f