需要解决/优化的问题:

在Unity3D中,实例化物体和销毁物体是都非常消耗性能的,小项目可能没问题的,但是一旦有大量的物体在短时间内需要销毁或者创建,那么游戏就会变得巨卡,如果是手游你的手机还会变烫,非常影响游戏体验,所以要尽量避免过多的使用Instantiate和Destroy操作

很容易想到,可以用物体隐藏和显示来代替物体的创建与销毁(也就是SetActive操作)而这也是对象池所做的事

核心代码:

脚本使用说明(该脚本名为Pool):

  • Pool.Get(key, path, pos, rot, name):创建并返回一个GameObject,这个GameObject的路径是path(Resources文件下的路径),它出现在位置pos上,旋转角为rot,名字为name,使用的预制体名字为key,要保证在Resources文件夹中存在名字为key的预制体
  • Pool.Return(name):销毁名字为name的GameObject
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pool : MonoBehaviour
{public static Pool instance;public static Dictionary<string, ArrayList> dic = new Dictionary<string, ArrayList>();      //创建一个字典dic,键为类名,值为对象数组#region 单例模式public static Pool GetPool{get{if (instance == null)instance = new Pool();return instance;}}#endregion/// <summary>/// Get(预制体名字,预制体所在Resources的路径,初始位置,初始旋转角,是否是UI预制体,预制体改名,可缺省)/// </summary>public static GameObject Get(string key, string path, Vector3 position, Quaternion roration, string keyName = ""){GameObject need;string name = key + "(Clone)";if (keyName != "")name = keyName;if (dic.ContainsKey(name) && dic[name].Count > 0)           //如果该对象在池中存在,复用该对象{ArrayList list = dic[name];need = (GameObject)list[0];list.RemoveAt(0);need.SetActive(true);need.transform.position = position;need.transform.rotation = roration;}else{need = Instantiate(Resources.Load(path), position, roration) as GameObject;          //不存在就直接创建need.name = name;}return need;}public static GameObject Return(GameObject unNeed)          //这个物体已经用不到了,丢入对象池{string key = unNeed.name;if (dic.ContainsKey(key))dic[key].Add(unNeed);elsedic[key] = new ArrayList() { unNeed };unNeed.SetActive(false);                        //可以理解为将物体丢入对象池就是隐藏该物体return unNeed;}public static void ClearPool(){dic.Clear();}
}

注意事项:

  • 隐藏的物体在切换场景时会被系统自动回收/销毁!也就是说如果你在场景1中回收物体A,并在场景B中取出物体A,那么就会出现错误!所以如果想要在多场景中使用,需要将该脚本挂在物体上面,或者单例设计模式的话,每次切换场景时手动清空字典(Dictionary)里面的元素
  • 用对象池的方法创建物体时,不会自动执行物体身上脚本中的Start()和Awake()生命周期,必需的情况下可以手动

游戏物体复用:对象池(以Unity3D为例)相关推荐

  1. Unity3D游戏开发之类对象池优化秘籍残篇

    翻开秘籍第一页: 问: 什么是类对象池? 剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景.如果我们不做任何的特殊处理,这种场景会出现两个性能问题--大量的内存碎片以及频繁的分配内存 ...

  2. Unity3D对象池的设计

    文章目录 为什么要使用对象池 对象池的分类 对象池存在的问题 对象池的适用范围 对象池适用于以下情况 对象池不适用于以下情况 对象池的设计 具体实现 使用例 原本的旧脚本 使用对象池改造后的脚本 修订 ...

  3. 【游戏开发实战】Unity循环复用列表,支持不规则尺寸(对象池 | UGUI | ScrollRect | Demo源码)

    文章目录 一.前言 二.使用方法 1.创建Scroll View 2.设置Scroll View参数 2.1.调整宽高 2.2.删除Scrollbar滑块 2.3.设置item模板: Item Tem ...

  4. Unity3D 大型游戏 最后一站 源码部分重点 对象池GameObejctPool(4)

    本文固定链接:http://blog.csdn.net/u013108312/article/details/60583764 本章我们来学习下最后一站中的对象池技术. 何为对象池,相信大部分的程序员 ...

  5. Unity3D 对象池 静态预制件与动态单体

    Unity3D 对象池 静态预制件与动态单体 效果 整体思路 静态预制件对象池 对象池接口 对象池接口继承类 动态单体对象池 游戏里为了利用内存资源一般对象池是用的比较多 这里总结了两版对象池. 请结 ...

  6. Unity3D学习笔记(一):Unity简介、游戏物体、组件和生命周期函数

    Project(工程.项目):工程是把游戏开发当前所需要的资源归类管理用的. Console控制台:日志.报错.调试,右上角,消息过滤 Assets:资源,存储游戏中一切用到的资源 Library:临 ...

  7. 实现类似涂鸦跳跃的游戏(对象池的使用和背景固定)

    --个人学习笔记 对象池的使用原理,就是把一些类似的物体一次性生成一堆,然后设置未激活状态,然后使用就激活,不适用就放回对象池,再次设置未激活.能使用范围就是,要频繁地删除生成的对象. Gameman ...

  8. 【Unity】游戏对象池ObjectPool

    游戏引擎:Unity 版本:2019.4.6f1 [2017版本以上均可] 编译平台:Visual Studio 2019   前要   在开发过程中,很多时候会出现针对某一GameObject的频繁 ...

  9. Unity3D 内存优化(一)对象池

    一.定义: 关于U3D内存优化,一直是游戏开发者头疼的事情,由于在项目中我们会频繁地创建和销毁一些对象,例如:怪物模型或者是UI预设体,但是,部分对象在游戏中是会频繁出现的,例如战斗中的小怪物,假如每 ...

最新文章

  1. Xshell配置ssh使用密钥公钥(publice key)登录
  2. form select multiple 某个字段是数组_你知道什么是Select函数吗?
  3. [YTU]_2803( 字符串中小写改大写)
  4. SAP物料类型与物料库存信息在哪个表中
  5. javascript与C#的编码解码问题
  6. RedHat虚拟机Vmware Tools的安装教程
  7. 在linux下vcd光盘提取,linux下抓取Vcd的视频文件[Linux安全]
  8. HDU2081 手机短号【水题】
  9. Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)
  10. 利用whistle调试移动端页面
  11. windows下的工具链 树莓派_Lab2树莓派交叉编译(windows平台)
  12. k2pbreed刷高恪教程_斐讯K2刷高恪固件教程,通过breed刷入,详细图文教程
  13. editormd显示后台html,editormd文档不显示内容了,js也全部都引入了
  14. java 生成2位随机数_java生成随机数保留数点后两位
  15. 屏蔽宽带运营商的弹窗广告
  16. SIM卡的IMSI号
  17. 骇客帝国弹幕2.0--移动鼠标触发弹幕
  18. 如何成为数字化人才?
  19. \(^_^)/ MySQL语句
  20. 四川大学计算机夏令营总结

热门文章

  1. python工资这么高为什么不学-现在Python就业薪资高吗?
  2. python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
  3. 语音识别十年来发展的历程
  4. Vue源码分析 - mvvm.js
  5. 超级计算机运行吃鸡,决赛圈的时候,如果两个人同时被手雷炸死该怎么办呢?...
  6. php 按行读取 太慢,3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?
  7. vue的介绍及基本使用(详细,好理解,示例代码)
  8. vue 绑定背景图片、图片
  9. 【动态规划】完全背包:整数划分(方案数)
  10. 【python笔记】:python面向对象实现学生管理系统