Unity-缓存池

news2024/10/6 8:28:12

一、.基础缓存池实现

继承的Singleton脚本为


public class Singleton<T> where T : new()
{
    private static T _instance;
    public static T GetIstance()
    {
        if (_instance == null)
            _instance = new T();
        return _instance;
    }
}

1.PoolManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 缓存池模块 
/// 1.Dictionary List
/// 2.Gameobject 和Resource两个公共类的API
/// </summary>
public class PoolManager : Singleton<PoolManager>
{
    //缓存池容器
    public Dictionary<string,List<GameObject>> poolDic = new Dictionary<string, List<GameObject>>();

    /// <summary>
    /// 从缓存池中拿
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public GameObject GetObj(string name)
    {
        GameObject obj = null;
        //1.衣柜中有抽屉,抽屉里有东西
        if (poolDic.ContainsKey(name)&&poolDic[name].Count>0)
        {
            obj = poolDic[name][0];
            poolDic[name].RemoveAt(0);
        }
        //2.无
        else
        {
            obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
            //将对象名字修改为池名字
            obj.name = name;
        }
        //激活对象
        obj.SetActive(true);
        return obj;
    }

    /// <summary>
    /// 存入缓存池
    /// </summary>
    /// <param name="name"></param>
    /// <param name="obj"></param>
    public void SaveObj(string name,GameObject obj)
    {
        //失活对象
        obj.SetActive(false);
        //1.有抽屉
        if (poolDic.ContainsKey(name))
        {
            //东西放入抽屉
            poolDic[name].Add(obj);
        }
        //2.无抽屉
        else
        {
            //创建抽屉
            poolDic.Add(name, new List<GameObject>(){ obj});
        }
    }
    
}

2.Test

挂载到摄像机上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            PoolManager.GetIstance().GetObj("Test/Cube");
        }
    }
}

3.DlaySave

挂载到预制体Cube上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelaySave : MonoBehaviour
{
    //当对象激活时,进入生命周期函数
    void OnEnable()
    {
        Invoke("Save", 1);
    }


    void Save()
    {
        PoolManager.GetIstance().SaveObj(this.gameObject.name, this.gameObject);
    }
}

二、缓存池优化

在生成物体时设置为Pool的子物体

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 抽屉数据  池子中的一列容器
/// </summary>
public class PoolData
{
    //抽屉中 对象挂载的父节点
    public GameObject fatherObj;
    //对象的容器
    public List<GameObject> poolList;

    public PoolData(GameObject obj, GameObject poolObj)
    {
        //给我们的抽屉 创建一个父对象 并且把他作为我们pool(衣柜)对象的子物体
        fatherObj = new GameObject(obj.name);
        fatherObj.transform.parent = poolObj.transform;
        poolList = new List<GameObject>() {};
        PushObj(obj);
    }

    /// <summary>
    /// 往抽屉里面 压都东西
    /// </summary>
    /// <param name="obj"></param>
    public void PushObj(GameObject obj)
    {
        //失活 让其隐藏
        obj.SetActive(false);
        //存起来
        poolList.Add(obj);
        //设置父对象
        obj.transform.parent = fatherObj.transform;
    }

    /// <summary>
    /// 从抽屉里面 取东西
    /// </summary>
    /// <returns></returns>
    public GameObject GetObj()
    {
        GameObject obj = null;
        //取出第一个
        obj = poolList[0];
        poolList.RemoveAt(0);
        //激活 让其显示
        obj.SetActive(true);
        //断开了父子关系
        obj.transform.parent = null;

        return obj;
    }
}

/// <summary>
/// 缓存池模块
/// 1.Dictionary List
/// 2.GameObject 和 Resources 两个公共类中的 API 
/// </summary>
public class PoolMgr : BaseManager<PoolMgr>
{
    //缓存池容器 (衣柜)
    public Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();

    private GameObject poolObj;

    /// <summary>
    /// 往外拿东西
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public void GetObj(string name, UnityAction<GameObject> callBack)
    {
        //有抽屉 并且抽屉里有东西
        if (poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0)
        {
            callBack(poolDic[name].GetObj());
        }
        else
        {
            //通过异步加载资源 创建对象给外部用
            ResMgr.GetInstance().LoadAsync<GameObject>(name, (o) =>
            {
                o.name = name;
                callBack(o);
            });

            //obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
            //把对象名字改的和池子名字一样
            //obj.name = name;
        }
    }

    /// <summary>
    /// 换暂时不用的东西给我
    /// </summary>
    public void PushObj(string name, GameObject obj)
    {
        if (poolObj == null)
            poolObj = new GameObject("Pool");

        //里面有抽屉
        if (poolDic.ContainsKey(name))
        {
            poolDic[name].PushObj(obj);
        }
        //里面没有抽屉
        else
        {
            poolDic.Add(name, new PoolData(obj, poolObj));
        }
    }


    /// <summary>
    /// 清空缓存池的方法 
    /// 主要用在 场景切换时
    /// </summary>
    public void Clear()
    {
        poolDic.Clear();
        poolObj = null;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac安装nacos,M1芯片

第一步&#xff0c;官网下载 》nacos官网 去github中下载对应的版本&#xff0c;本人下载的是1.4.1版本 在这儿选择其他的版本&#xff0c;下面这里选择 tar.gz 压缩包 解压后放到一个非中文的目录下&#xff0c;我选择在 user目录下面创建一个other目录&#xff0c;将使用的环…

python-网络爬虫.Request

Request python中requests库使用方法详解&#xff1a; 一简介&#xff1a; Requests 是Python语言编写&#xff0c;基于urllib&#xff0c; 采用Apache2 Licensed开源协议的 HTTP 库。 与urllib相比&#xff0c;Requests更加方便&#xff0c;处理URL资源特别流畅。 可以节约我…

慕课网Go-4.package、单元测试、并发编程

package 1_1_User.go package usertype User struct {Name string }1_1_UserGet.go package userfunc GetCourse(c User) string {return c.Name }1_1_UserMain.go package mainimport ("fmt"Userch03 "goproj/IMOOC/ch03/user"//别名&#xff0c;防止同名…

HarmonyOS/OpenHarmony元服务开发-配置卡片的配置文件

卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分&#xff1a; 1.卡片需要在module.json5配置文件中的extensionAbilities标签下&#xff0c;配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签&#xff0c;其中键名称…

论文解读|2020 CVPR:PointASNL:基于自适应采样的非局部神经网络点云鲁棒处理

原创 | 文 BFT机器人 01 背景 点云是由大量的点组成的三维数据集&#xff0c;通常由激光雷达或摄像机等传感器采集。点云数据处理是计算机视觉和机器学习领域的重要研究方向&#xff0c;应用广泛&#xff0c;例如自动驾驶、机器人导航、三维建模等。然而&#xff0c;点云数据通…

CCIA数安委等组织发起“个人信息保护影响评估专题工作”,合合信息首批入选试点

近期&#xff0c;“个人信息保护影响评估专题工作”&#xff08;简称“PIA专题工作”&#xff09;试点评估结果正式发布。PIA专题工作组由中国电子技术标准化研究院、中国信息通信院等单位的法律与技术专家组成&#xff0c;对试点申报单位开展PIA工作的过程是否符合评估依据提出…

bigemap工程行业应用

类似这种看布置&#xff0c;修温室大棚&#xff0c;再就是把影像添加到cad里。落坐标点 是因为觉得地图影像清晰&#xff0c;更新及时能直接用软件做等高线地形图进行投影转换配合cad来使用直接在线下载卫星图和高程节省测绘时间&#xff0c;以及手机端去做数据的采集&#xff…

我为“IT教父”柳传志的名言画蛇添足

我为“IT教父”柳传志的名言画蛇添足 搭班子&#xff0c;定战略&#xff0c;带队伍 添两条足&#xff1a;配资源&#xff0c;拼打法 趣讲大白话&#xff1a;教父还是很牛&#xff0c;被恶意黑化了 【趣讲信息科技243期】 **************************** 搭班子&#xff1a;是一条…

Bootstrap框架(JavaScript组件)

目录 前言一&#xff0c;JavaScript插件简介二&#xff0c;插件的引入方式三&#xff0c;data属性四&#xff0c;关闭data属性五&#xff0c;过渡插件六&#xff0c;模态框6.1&#xff0c;JavaScript操作模态框6.2&#xff0c;模态框属性6.3&#xff0c;模态框方法6.4&#xff…

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…

无涯教程-jQuery - position( )方法函数

position()方法获取元素相对于其偏移父级的顶部和左侧位置。 返回的对象包含两个Integer整数属性&#xff0c;即top和left。为了进行准确的计算&#xff0c;请确保将像素值用于边距&#xff0c;边框和填充。此方法仅适用于可见元素。 position( ) - 语法 selector.position(…

StopWatch与ThreadLocal

目录 1、StopWatch 1、1作用&#xff1a; 1、2方法&#xff1a; 1、3使用方法 2、ThreadLocal 2、1什么是ThreadLocal 2、2简单例子 2、3使用ThreadLocal带来的四个好处 2、4主要方法 2、5ThreadLocal内存泄漏问题 1、StopWatch 1、1作用&#xff1a; 统计代码块耗时时…

【前端|CSS系列第4篇】面试官:你了解居中布局吗?

欢迎来到前端CSS系列的第4篇教程&#xff01;如果你正在寻找一种简单而又强大的前端技术&#xff0c;以使你的网页和应用程序看起来更加专业和美观&#xff0c;那么居中布局绝对是你不能错过的重要知识。 在前端开发中&#xff0c;实现居中布局是一项必备技能&#xff0c;无论…

DC电源模块输出电压的调节范围

BOSHIDA DC电源模块输出电压的调节范围 DC电源模块是一种可以将交流电转换为直流电的设备&#xff0c;可以广泛应用于电子、通信、工业自动化等领域。在实际使用中&#xff0c;输出电压的调节范围非常重要&#xff0c;因为它决定了该模块能够适应的电器设备的种类和使用范围。…

(自控原理)自动控制的一般概念

1、自动控制理论发展简史 1.1经典控制理论&#xff08;19世纪初—20世纪50年代) 时域法 复域法(根轨迹法) 频域法 1.2 现代控制理论&#xff08;20世纪60年代—&#xff09; 线性系统 自适应控制预测控制 最优控制 鲁棒控制 滑模控制 最佳估计 容错控制 大系统复杂系统 系…

golang自带的命令行解析库flag库实践

1. 简介 flag用于解析命令行选项。有过类 Unix 系统使用经验的童鞋对命令行选项应该不陌生。例如命令ls -al列出当前目录下所有文件和目录的详细信息&#xff0c;其中-al就是命令行选项。 命令行选项在实际开发中很常用&#xff0c;特别是在写工具的时候。 指定配置文件的路径…

高压开关柜温度在线监测系统设计

摘要&#xff1a;在当前的社会之中&#xff0c;电力资源是最重要的能源资源之一&#xff0c;人们对于电力资源的依赖程度也逐渐升高&#xff0c;到目前为止&#xff0c;任何人的生活与工作都不能离开电力资源&#xff0c;这就导致电力系统的普及型大大提高。电力系统具有着极高…

小程序原生实现左右锚点联动

效果 wxml <view classbox><scroll-view scroll-y scroll-with-animation style"width:25%"><view classnav><view wx:for"{{navList}}" wx:keyindex class"title {{index active ?select:}}"data-index{{index}} bin…

el-select 中加了filterable 点击箭头下拉框回收不去问题

解决方式①&#xff1a;参考连接&#xff1a;&#xff08;亲测有用&#xff09;【element-select】添加过滤属性以及change后下拉框异常_element select过滤时,不收起下拉框_Y.哈哈的博客-CSDN博客 1、添加过滤属性后点击下箭头不收起下拉框 2、change通过dialog触发事件后&…

新能源光学膜厚测量仪

能源是人类社会可持续发展的动力源泉和重要生存基础。近年来&#xff0c;新能源的研究受到世界各国的高度重视&#xff0c;包括太阳能、风能和潮汐能等在内的可再生能源正在成为传统化石燃料有希望的替代品&#xff0c;因此&#xff0c;开发低成本、大规模的能源转换技术与新型…