Unity对象池的创建与使用


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力快速完成 Unity 对象池的创建与使用

为新手节省宝贵的时间,避免采坑!

Chinar 教程效果:


  • 1

    • MonoSingleton —— 单例基类
  • 2
    • ObjectPool —— 对象池
  • 3
    • PoolTest —— 测试对象池的使用
  • 支持
    • May Be —— 搞开发,总有一天要做的事!

全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

MonoSingleton —— 单例基类

任何继承自 MonoSingleton 泛型基类的脚本/类 都是单例类

using UnityEngine;/// <summary>
/// 泛型单例基类 —— 任何继承自该类的类,都是单例类
/// </summary>
/// <typeparam name="T">泛型</typeparam>
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{private static T instance;public static T Instance{get{if (instance == null){instance = FindObjectOfType(typeof(T)) as T;if (instance == null) instance = new GameObject("Chinar Single of " + typeof(T).ToString(), typeof(T)).GetComponent<T>();}return instance;}}private void Awake(){if (instance == null) instance = this as T;}private void OnApplicationQuit(){instance = null;}
}

2

ObjectPool —— 对象池

新建一个脚本 ObjectPool 继承自泛型基类 MonoSingleton《ObjectPool》

是以 ObjectPool 就会是一个单例类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 对象池(重复调用/使用的游戏物体)  子弹,技能,导弹,敌人
/// </summary>
public class ObjectPool : MonoSingleton<ObjectPool>
{//字段  池 技能预设物(因为一个技能可能有多个预制件) 技能的复用性private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>();int                                          i     = 0; //标记 0/// <summary>/// 创建显示对象/// </summary>/// <returns>The object.</returns>/// <param name="key">对象名称</param>/// <param name="go">对象的预制件</param>/// <param name="position">对象的新位置</param>/// <param name="quaternion">对象的角度</param>public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion){GameObject tempgo = cache.ContainsKey(key) ? cache[key].Find(p => !p.activeSelf) : null; //返回池中未激活的对象,所有都被激活就返回空,赋值给临时对象if (tempgo != null)                                                                      //如果临时对象不为空{tempgo.transform.position = position;   //设置位置tempgo.transform.rotation = quaternion; //旋转信息}else //否则,就是空了。(也就是没能从池子里取出对象){tempgo = Instantiate(go, position, quaternion); //那就根据传入的预设物,生成一个新物体print("实例化物体数量:" + i++);if (!cache.ContainsKey(key)) //池中没有键{cache.Add(key, new List<GameObject>()); //新建一个 列表}cache[key].Add(tempgo); //给字典中的列表加入/add 临时物体,如果有键就直接添加了}tempgo.SetActive(true); //并启用临时物体return tempgo;          //返回}/// <summary>/// 直接回收/// </summary>/// <param name="go">Go.</param>public void CollectObject(GameObject go){go.SetActive(false);}/// <summary>/// 延迟回收/// </summary>/// <param name="go">Go.</param>/// <param name="delay">Delay.</param>public void CollectObject(GameObject go, float delay){StartCoroutine(Collect(go, delay));}private IEnumerator Collect(GameObject go, float delay){yield return new WaitForSeconds(delay);CollectObject(go);}/// <summary>/// 释放资源/// </summary>/// <returns>The clear.</returns>/// <param name="key">Key.</param>public void Clear(string key){if (cache.ContainsKey(key)){//Destroy当中所有的对象for (int i = 0; i < cache[key].Count; i++){Destroy(cache[key][i]);}//清除键当中的所有值//cache[key].Clear();//清除这个键(键值一起清除)cache.Remove(key);}}/// <summary>/// 释放所有对象池/// </summary>public void ClearAll(){var list = new List<string>(cache.Keys);for (int i = 0; i < list.Count; i++){Clear(list[i]);}}
}

3

PoolTest —— 测试对象池的使用

新建一个脚本 PoolTest 用来测试对象池的使用

using UnityEngine;/// <summary>
/// 测试对象池的调用
/// </summary>
public class PoolTest : MonoBehaviour
{GameObject go;   //临时对象GameObject item; //临时对象池对象void Start(){go = Resources.Load<GameObject>("Cube"); //在Resources文件目录下做一个Cube预设物}void Update(){if (Input.GetKey(KeyCode.Space)) //按下空格创建一个Cube{item                    =  ObjectPool.Instance.CreateObject("Object1", go, Vector3.zero, new Quaternion(0, 0, 0, 0));item.transform.position += new Vector3(0, 0, 1);}if (Input.GetMouseButtonDown(0)) //按下左键执行回收对象{if (item != null){ObjectPool.Instance.CollectObject(item, 0.2f);}}if (Input.GetMouseButtonDown(1)) //按下右键执行清除已经生成的对象{ObjectPool.Instance.Clear("Object1");}}
}

支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)

1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !



Chinar


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

unity中实现简单对象池,附教程原理相关推荐

  1. Unity中实现溶解(Dissolve)特效及其原理解析

    Unity中实现溶解(Dissolve)特效及其原理解析 今天我们分享一个Unity中非常常见的特效: 溶解. 下面先来看看效果. 大家可能和我一样, 在不了解实现方式的时候, 会觉得这个效果很神奇, ...

  2. 【多线程和并发】Java中的线程池的实现原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池. 合理使用线程池能带来三个好处: 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗: 提 ...

  3. Unity中使用ProtoBuf-保姆式教程

    ·ProtoBuf介绍 ProtoBuf 是结构数据序列化方法,可简单类比于 XML.JSON,其具有以下特点: 语言无关.平台无关.即 ProtoBuf 支持 Java.C++.Python 等多种 ...

  4. unity 构建迷宫_教程:使用GameDraw在Unity中构建迷宫游戏关卡

    unity 构建迷宫 GameDraw is a 3D modeling extension for Unity developed by Mixed Dimensions that reduces ...

  5. [Unity] unity中对象池的使用

    在现代游戏引擎设计中中,使用的大多都是托管内存,基于此我们不必手动管理内存,造成内存泄露等问题.对于unity中的游戏对象,每隔一段时间,Mono的垃圾回收机制将会检测内存,将没有再被引用的内存释放回 ...

  6. unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

  7. Java-Java中的线程池原理分析及使用

    文章目录 概述 线程池的优点 线程池的实现原理 线程池的使用 创建线程池 向线程池中提交任务 关闭线程池 合理的配置线程池 线程池的监控 概述 我们在上篇博文 Java-多线程框架Executor解读 ...

  8. 快速 Get 面试题中:线程池七个参数和工作原理问题,理解万岁

    这次用一个生活案例来让你快速的 get 到线程池的工作原理和七个参数的作用. 最近在复习面试题,巩固一下自己.学完看看面试题,可以很有效的知道的不足.也是为以后做准备. 你好,我是博主宁在春,希望文章 ...

  9. Cinemachine教程 | Unity中如何快速制作镜头晃动?

    摘要:经常在游戏.影视中会看到镜头晃动的镜头,比如枪的后坐力.爆炸.碰撞.巨人踩踏地面等等,镜头晃动如何快速制作呢? 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周 ...

最新文章

  1. Spring Batch事务处理
  2. mysql 书签查找_my-bookmark
  3. 一个自己整理的HASH类
  4. Acwing第 21 场周赛【完结】
  5. HDU - 3364 Lanterns(高斯消元解方程(取模))
  6. git rebase原理(转)
  7. 新手开车 驾驶小秘诀要牢记
  8. homebrew Mac 相关问题
  9. fiddler设置中文版本_Python3.x+Fiddler 抓取 APP 数据
  10. python库下载安装报错_Python 各种库的安装
  11. 数据分析避坑必读:让人怀疑人生的七大悖论
  12. java录音程序_record类完成语音信号采集的任务_Android实现语音数据实时采集、播放...
  13. rowStyle设置Bootstrap Table行样式
  14. SVN日常提交工作时需要注意的事项
  15. Solaris 11.4安装,映像包管理系统(IPS)搭建
  16. 免费pdf转换成jpg图片方法
  17. 阿里云如何给c盘扩容
  18. python爬虫详细-Python爬虫|Python爬虫入门(一):爬虫基本结构简单实例
  19. 解决OSS传输的文本文件网页打开乱码
  20. 麦当劳可以免费添加可乐的!

热门文章

  1. CreateMainWindow 创建主窗口属性
  2. android元素离边框间距,RecyclerView Item 的分割线 距边框距离问题总结
  3. php上传图片完成后的截图,php实现粘贴截图并完成上传功能
  4. android 获取位置数据库,尝试从webview获取位置时,Android“SQLite数据库无法从/CachedGeoposition.db加载”错误...
  5. class反编译_IDEA反编译功能小试牛刀
  6. 如果计算机用户有密码 待机,电脑待机密码怎么设置
  7. android新建view类,android – 无法创建ViewModel类的实例(无法启动活动ComponentInfo)
  8. c语言知道坐标求线段长度,C语言编写程序:输入任意3线段的长度,判断组成三角形的种类...
  9. 软件测试缺陷发生方法,软件测试缺陷分析方法简介
  10. oracle insert if语句怎么写,oracle存储过程的调用(insert 语句的存储过程)