【Unity程序技巧】异步保险箱管理器

news2024/10/2 16:27:45

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==II==)<font color=green >涉及知识点
    • 🎶(==W==) 异步保险箱管理器
        • 1.知识点
        • 2.特点
        • 3.脚本
    • 🅰️


前言


🎶(II涉及知识点


  • List泛型类
    在这里插入图片描述
    在这里插入图片描述

  • Dictionary泛型类

在这里插入图片描述
在这里插入图片描述

  • hashtable的遍历 和 Dictionary 遍历API的区别对比
    +

🎶(W 异步保险箱管理器


1.知识点

在这里插入图片描述

2.特点

  • 由两个部分组成:保险箱数据 和 缓存池管理器
  • 减少了GC的回收,提高了性能,实现了闭环
  • 代码自动创建对象
  • 首先得再面板中创建衣柜对象,而后会由代码进行保险箱的创建
  • 用异步加载是因为考虑到有大资源的情况下
  • 缺点:现在的这个只能放GameObject类型的资源


当音乐管理器需要把音频资源放入缓存池时,此时的缓存池不足以支持存取,因为此时只能存取GameObject类型的资源,需要进行修改,有两个办法:
1.将其变成泛型(1.用到泛型占位符,2.用到泛型约束)
2.将其重载

3.脚本

//缓存池管理器
public class BoxManager: SingleManager<BoxManager>
{
    //缓存池里面存保险箱
    public Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();

    private GameObject poolObj;


    public void GetObj(string name, UnityAction<GameObject> callBack)
    {
        //有箱子并且箱子里有东西
        if (poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0)
        {
            callBack(poolDic[name].GetObj());
        }
        else
        {
            //异步加载
            ResourceManager.GetInstance().LoadAsync<GameObject>(name, (o) =>
            {
                o.name = name;
                callBack(o);
            });
        }
    }

   //放东西进箱子
    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));
        }
    }

   //清空缓存池——在场景切换时
    public void Clear()
    {
        poolDic.Clear();
        poolObj = null;
    }
}

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

//缓存池保险箱
public class BoxData
{
    //保险箱的名字
    public GameObject fatherObj;
    //保险箱的容器
    public List<GameObject> poolList;

    public PoolData(GameObject obj, GameObject poolObj)
    {
        fatherObj = new GameObject(obj.name);
        fatherObj.transform.parent = poolObj.transform;
        poolList = new List<GameObject>() {};
        PushObj(obj);
    }

   //放进箱子
    public void PushObj(GameObject obj)
    {
        obj.SetActive(false);
        poolList.Add(obj);
        obj.transform.parent = fatherObj.transform;
    }

   //从箱子中取出
    public GameObject GetObj()
    {
        GameObject obj = null;
        obj = poolList[0];    //取出箱子容器中的第一个
        poolList.RemoveAt(0); //然后容器中移除       
        obj.SetActive(true);      
        obj.transform.parent = null;  //断开了父子关系
        return obj;
    }
}

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


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

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

相关文章

Servlet的两种部署方法

Servlet是实现动态页面的技术&#xff0c;是tomcat给Java提供的原生的进行web开发的api 第一个Servlet程序 写一个servlet程序&#xff0c;部署到tomcat上&#xff0c;通过浏览器访问&#xff0c;得到hello world字符串 1.创建项目 此处要创建的是maven项目 maven&#xf…

重磅官宣 | 第二届 OpenHarmony 技术峰会,邀您共启智联未来

"下一个技术未来在哪里&#xff1f;" 11 月 4 日 技术大咖齐聚北京为你解答 一场主论坛八大开源领域分论坛 探究终端操作系统十大技术挑战方向 与全球开源操作系统技术领袖、实践专家、一线导师携手 共绘 OpenHarmony 开源生态璀璨星图&#xff01; 点击链接&…

解决:无法打开Zotero数据库

在实验室电脑上面下载了Zotero和坚果云&#xff0c;一系列操作下来&#xff0c;我的笔记本上无法打开Zotero数据库了&#xff01;显示下面的界面&#xff1a; 于是网上找解决方法 1.https://www.zhihu.com/question/519740718 2.https://devpress.csdn.net/awstech/64e7311b…

Vue ref属性

Vue中的ref属性可以用来对HTML元素或者是对组件进行唯一标识。 一、设置ref属性 只需要在元素或者是组件后跟上如下语法即可&#xff1a; ref"标识名" 二、获取元素或对象 我们可以用如下方法获取我们设置ref的元素或组件&#xff1a; this.$refs.标识名 第一个输…

对批改网禁止复制粘贴问题的破解

首先进入到作文页面 右击鼠标显示弹窗选择检查 点击左上角图标 之后鼠标点击作文框&#xff0c;检查框会跳转到文本 点击鼠标右键选择文本&#xff0c;并选择编辑为HTML 在文本内写入内容点击空白处退出即可

JAVA设计模式全解(独家AI解析)

JAVA设计模式全解&#xff08;独家AI解析&#xff09; 一、JAVA介绍二、JAVA设计模式六大原则三、JAVA设计模式介绍四、JAVA设计模式详解4.1 单例模式4.1.1 懒汉式&#xff08;Lazy Initialization&#xff09;4.1.2 饿汉式&#xff08;Lazy Initialization&#xff09; 4.2 代…

Java中获取异常栈中的底层异常信息-分析Java异常栈

Java中获取异常栈中的底层异常信息-分析Java异常栈 首先&#xff0c;我们准备好一个多层异常栈堆叠的示例代码&#xff1a; public class ExceptionUtils {public static void main(String[] args) {try {buildMultiLayerExceptionStack();} catch (Exception e) {e.printSt…

RHCE---shell 条件测试

文章目录 目录 文章目录 前言 一.条件测试 概述&#xff1a; 文件测试 整数测试&#xff1a; 总结 前言 当我们完成某一命令的编写时&#xff0c;除了观察输出的内容&#xff0c;我们又如何得知命令是否执行成功呢&#xff1f; 这里&#xff0c;我们需要用到条件测试 一.条…

SEO内链优化的8个终极策略

网站SEO优化主要分为两个大类&#xff0c;一类是站外优化&#xff0c;另一类是站内优化。站内优化的内链建设优化是SEO优化工作的重中之重&#xff0c;可以视为网站内部的内功修炼之一。本文将介绍什么是内链以及如何通过内链优化来提升SEO排名。 什么是内链&#xff1f; 内链…

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系 List List是一个接口&#xff0c;不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList站在数据结构的角度看&#xff0c;List就是一个线性表。常见的线性表&#xff1a;顺序表、链表、栈、队列等 线性表 线性表是n个具有相…

解决SpringBoot整合Activiti引用JPA:缺少javax.persistence.EntityManagerFactory

系统接入工作流Activiti的时候&#xff0c;发现activiti初始化表&#xff0c;操作数据库使用的是jpa,我们这里解决办法就是引入spring-data-jpa-starter自动配置EntityManagerFactory。 首先把工作流sql文件执行 基础依赖jar引入 这里忽略Activiti的基础依赖&#xff0c;以下…

什么是云原生?土生土长?

“云原生”&#xff08;Cloud Native&#xff09;是一种构建和运行应用程序的方法&#xff0c;这种方法充分利用了云计算的优势。云原生应用程序是为云环境设计的&#xff0c;通常是在容器中运行&#xff0c;并被设计为在微服务架构中运行&#xff0c;这使得它们能够快速扩展和…

进公司第二天:绿盾+TFS拉取代码

1.配置绿盾 绿盾&#xff1a;一种安全软件 遇到的问题 TFS端口号&#xff1a;192.168.3.231 服务端口号&#xff1a;默认&#xff08;千万别瞎写啥的&#xff09; 2.配置TFS拉取代码 TFS利用插件 &#xff0c;输入公司给你的信息你的各种信息 拉取代码就行。 3.查看代码 —…

系统架构师备考倒计时12天(每日知识点)

1. 基于架构的软件设计&#xff08;ABSD) (ABSD方法是架构驱动&#xff0c;即强调由业务【商业】、质量和功能需求的组合驱动架构设计。ABSD方法有三个基础。第一个基础是功能的分解。在功能分解中&#xff0c;ABSD方法使用已有的基于模块的内聚和耦合技术&#xff1b;第二个基…

上位机通过Modbus转Profinet网关与变频器Modbus通讯配置案例

上位机与变频器Modbus通讯是通过Modbus转Profinet网关来实现的。这个网关可以理解为一个通信翻译器&#xff0c;负责将上位机通过Modbus协议发送的数据转换为Profinet协议&#xff0c;再通过Profinet网络与变频器进行通信。 上位机通过Modbus转Profinet网关与变频器Modbus通讯&…

一些基本图像预处理---将一个文件中的所有图片进行尺度归一化、查看每个像素的RGB值,将指定颜色切换为白色、将文件中所有图片从png到jpg的切换

目录 1.将一个文件中的所有图片进行尺度归一化 2. 查看一张图片的每个像素的RGB值 3.将指定颜色切换成其他颜色&#xff08;代码中将红色切换为白色&#xff09; 4.将一个文件中所有图片从png到jpg的切换 5.将一个文件夹中的所有图像重命名从1开始 1.将一个文件中的所有图…

java--switch语句

1.switch语句 是通过比较值来决定执行那条分支。 2.switch分支的执行流程 ①先执行表达式的值&#xff0c;再拿着这个值去与case后的值进行匹配。 ②与那个case后的值匹配为true就执行那个case块的代码&#xff0c;遇到break就跳出switch分支。 ③如果全部case后的值与之匹…

睿趣科技:抖音小店申请流程

随着移动互联网的发展&#xff0c;越来越多的人开始尝试通过开设网店来创业。抖音作为国内最受欢迎的短视频平台之一&#xff0c;也推出了自己的电商功能——抖音小店。那么&#xff0c;如何申请抖音小店呢?下面就为大家详细介绍一下抖音小店的申请流程。 首先&#xff0c;打开…

powerdesigner下载安装教程

1、什么是PowerDesigner PowerDesigner是Sybase公司的CASE工具集&#xff0c;使用它可以方便地对管理信息系统进行分析设计&#xff0c;它几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型&#xff08;ConceptualDataModel&#xff09;、…

从语言层面了解线程(std::thread)使用的里里外外

从语言层面了解线程(std::thread)使用的里里外外 使用 C标准库提供的 std::thread&#xff0c;配合 std::mutex、std::condition_variable 等工具可以很方便地编写并发程序。C标准库针对不同的操作系统中并发编程相关的系统调用做了很好的封装&#xff0c;提供了非常简洁易用的…