对象池是一个单例类:

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. RS485转USB插电脑上通讯不上

    在确定没有其他问题时,基本可以确定是干扰问题,换个24V电源试试,不要用原来的线 485接口确定,好坏通过两个相反对接,发送信息,两边一致,就可以

  2. Oracle单机Rman笔记[4]---RMAN联机备份

    备注:RMAN备份(仅支持基于spfile的备份,不支持基于init.ora配置的备份) 练习:开启ARCHIVELOG模式 \为归档的重做日志被指FRA和单独的归档日志目标 SQL>show ...

  3. learning makefile string example

  4. s6k0:一种输入法分词关联模型演示

    实现:用kotlin.但是考虑到习惯问题,需要借助akka实现erlang的actor,以及rx.java 需求:略 预计:最快两周 保守估计时间:2019年3月左右 优先级:低 加速方法:打饭钱 赞 ...

  5. 【转载】Druid 介绍及配置

    原文链接:https://www.cnblogs.com/niejunlei/p/5977895.html 1. Druid是什么? Druid是Java语言中最好的数据库连接池.Druid能够提供强 ...

  6. 用docker搭建python项目运行环境

    Docker Hub镜像加速器 安装docker: curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-eng ...

  7. [Leetcode 217&219]寻找数组中的重复值Contains Duplicate I & II

    [题目1] Given an array of integers, find if the array contains any duplicates. Your function should re ...

  8. Android : Camera之CHI API

    一.CAM CHI API功能介绍: CHI API建立在Google HAL3的灵活性基础之上,目的是将Camera2/HAL3接口分离出来用于使用相机功能,它是一个灵活的图像处理驱动程序(摄像头硬 ...

  9. LeetCode 102 二叉树的层次遍历

    题目: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 ...

  10. 【SoftwareTesting】Homework1

    The errors I will mention after are from the project in the last semester. The project is a Java pro ...