对象池是一个单例类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class ObjectPool {
private static ObjectPool instance;
private ObjectPool()
{
pool = new Dictionary<string, List<GameObject>>();
prefabs = new Dictionary<string, GameObject>();
}
public static ObjectPool GetInstance()
{
if (instance==null)
{
instance = new ObjectPool();
}
return instance;
} /// <summary>
/// 对象池
/// </summary>
private Dictionary<string,List<GameObject>> pool; /// <summary>
/// 预设体
/// </summary>
private Dictionary<string, GameObject> prefabs; /// <summary>
/// 从对象池中获取对象
/// </summary>
/// <param name="objName"></param>
/// <returns></returns>
public GameObject GetObj(string objName)
{
//结果对象
GameObject result=null;
//判断是否有该名字的对象池
if (pool.ContainsKey(objName))
{
//对象池里有对象
if (pool[objName].Count>)
{
//获取结果
result = pool[objName][];
//激活对象
result.SetActive(true);
//从池中移除该对象
pool[objName].Remove(result);
//返回结果
return result;
}
}
//如果没有该名字的对象池或者该名字对象池没有对象 GameObject prefab = null;
//如果已经加载过该预设体
if (prefabs.ContainsKey(objName))
{
prefab = prefabs[objName];
}
else //如果没有加载过该预设体
{
//加载预设体
prefab = Resources.Load<GameObject>("Prefabs/"+objName);
//更新字典
prefabs.Add(objName, prefab);
} //生成
result = UnityEngine.Object.Instantiate(prefab);
//改名(去除 Clone)
result.name = objName;
//返回
return result;
} /// <summary>
/// 回收对象到对象池
/// </summary>
/// <param name="objName"></param>
public void RecycleObj(GameObject obj)
{
//设置为非激活
obj.SetActive(false);
//判断是否有该对象的对象池
if (pool.ContainsKey(obj.name))
{
//放置到该对象池
pool[obj.name].Add(obj);
}
else
{
//创建该类型的池子,并将对象放入
pool.Add(obj.name, new List<GameObject>() { obj });
} } }

以后要生成对象就获取单例通过GetObj()来获取,对象回收就调用RecycleObj(),这样就减少了生成和销毁预制体的性能消耗

Unity对象池的实现的更多相关文章

  1. Unity 对象池 生产 保存

    Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能. 主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示.如果不存在则创造一个新的. 当销毁时,调用协程延时隐藏物 ...

  2. Unity——对象池管理

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

  3. Unity ----- 对象池GameObjectPool

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

  4. Unity 对象池的使用

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

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

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

  6. Unity对象池管理

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

  7. Unity中对象池的使用

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

  8. Unity中的万能对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...

  9. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

随机推荐

  1. raid10模型比raid01模型的冗余度高

    RAID10和RAID01的冗余度看起来差不多,但本质上有一定的区别. RAID10:左边损坏1块盘,右边还可以容忍一块盘损坏而不影响整体的数据;冗余度=2 RAID01:左边损坏1块盘,此时左边已经 ...

  2. git提交步骤

    1,为了确定在本地分支下操作,可以用命令查看一下是否在本地分支 git branch 2,可以查看状态,是否添加了哪些内容 git status 3,如果确认无误,使用命令进行提交本地代码,并加上注释 ...

  3. mysql插件的初始化

  4. 浏览器与WEB服务器交互

    问题:打开浏览器,在地址栏输入url到页面展现,整个过程发生了什么? 图示: 步骤: 1 用户输入网址,包括协议和域名. 2 浏览器先查找自身缓存有没有记录,没有的话再找操作系统缓存. 3 当浏览器在 ...

  5. PHP7.X连接SQLSERVER数据库(CENTOS7)

    加入微软的源 curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlreleas ...

  6. Vue.js学习过程

    打开各大论坛,看到好多Vue.js的话题,可以说现在是非常火的框架,看到一个人这样评论Vue:“Vue.js兼容angular.js和 react.js的优点,并剔除他们的缺点.”因为现在公司不用Vu ...

  7. goodsSearch初始化选中代码

    watch: { selectGoodsList (val) { let list = [] val.forEach(item => { this.goodsList.forEach((tag, ...

  8. Linux权限总结

    第1章 课前小拓展 虚拟机打不开原因 问题: 该虚拟机似乎正在使用中. 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权.否则,请按“取消(C)”按钮以防损坏. 配置文件: E:\vm ...

  9. 第三周博客之一---Oracle基础知识

    一.数据库的定义.作用介绍 1.定义:按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 2.数据库的发展历史: 2.1.在1962年数据库一词出现在系统研发的公司的技术备忘录中 2. ...

  10. springboot源码之(内嵌tomcat)

    server---service----engine----host-----context---wrapper---servletStandardServer---StandardService-- ...