AssetBundle上层框架

news/2024/10/5 17:27:07

项目地址:

YuanJinSen/Demo: Ghost Runner (github.com)

原因

Unity自带的AssetBundle拥有一个巨大的缺点:

比方说我只想要物体A,但A存在于一个巨大的AB包内,想加载A就必须下载一堆无关的东西。

因此有了该上层框架,可以做到,像Resource那样去加载物体,我只加载A。

加载:

卸载:

整体逻辑

打包时:

窗口工具:调用Builder.Build

Builder:选择平台,初始化BuildSetting打包设置,搜集打包对象,打包,回收多余对象,将Manifest文件打包

BuildSetting:根据策划的配置进行路径初始化和文件搜集,使用Directory.GetFiles获取给文件夹下所有的文件的Url,并存进HashSet<string> files中

Builder.Collect:根据上一步搜集到的所有路径进行操作/获取文件依赖,进行文件分类/搜集需要打的包/生成Manifest

  Resource:来自Dic<文件名,文件类型>,将files所有对象存进去,并生成ResourceTxt、ResourceByte文件

  Bundle:来自Dic<包路径,List<包内容文件>>,将包和包内容对应地存起来,并生成BundleTxt、BundleByte文件

  Dependency:来自Dic<文件名,List<文件依赖>>,将文件和文件依赖对应地存起来,并生成DependencyTxt、DependencyByte文件

Builder.ClearAssetBundle:获取所有打好的包,会有多余的依赖包,将这些包回收

Builder.BuildManifest:打包ResourceByte、BundleByte、DependencyByte进一个AB包,用于初始化时读取

初始化

某个Mono的Start:ResourceManager.Init()

ResourceManager:BundleManager.Init()

BundleManager:加载Manifest文件,所有的包都是该包的依赖,后续所有的包都从该文件中读取

ResourceManager:读取打包时最后一步打的Manifest包,将ResourceByte、BundleByte、DependencyByte解码出来,并存起来

运行时:

发起者:调用ResourceManager.Load,传递Url

ResourceManager:new一个AResource用于存放资源,调用AResource.Load,传递Url

AResource:根据Url查询AB包Url,并调用BundleManager.Load,传递AB包Url

BundleManager:new一个ABundle拥有存放AB包,调用AResource.Load,传递AB包Url

ABundle:根据AB包Url加载AB包,缓存,通过BundleManager返回包给AResource

AResource:在ABundle中加载目标Url对象,缓存,通过ResourceManager返回对象给发起者

--------------------------------------------------------------------------------------------------------------------------------------------------------

还有很多细节,比如说缓存、卸载、依赖、异步等等

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

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

相关文章

生产环境Nginx服务器双机热备部署以及配置内网域名转发

10.0.0.8和10.0.0.9部署nginx: 第一步:上传安装包 第二步:安装编译依赖(使用普通用户需要家sudo) yum install gcc gcc-c++ yum install zlib zlib-devel yum install pcre pcre-devel yum install openssl libssl-dev第三步:解压,编译安装: 解压命令: sudo tar -zxvf…

Java-云原生优化指南-早期发布--全-

Java 云原生优化指南(早期发布)(全)原文:zh.annas-archive.org/md5/df95e958a0ce92b3b5aecdf89067205b 译者:飞龙 协议:CC BY-NC-SA 4.0第一章:优化与性能定义 优化 Java(或任何其他类型的代码)的性能通常被视为黑魔法。关于性能分析有一种神秘感——它通常被视为一种…

计算机视觉会议

计算机视觉会议(CVPR,ECCV,ICCV,NIPS,AAAI,ICLR) 首先介绍的是三大顶会之一的CVPR,全称IEEE Conference on Computer Vision and Pattern Recognition,即IEEE国际计算机视觉与模式识别会议。该会议一般在6月举行,举办地是美国,是一年一次的会议。(电气与电子工程师…

jmeter中beanshell处理器

Jmeter工具中存在BeanShell 取样器,BeanShell预处理程序,BeanShell后置处理程序,那么这次详细整理下BeanShell 在 JMeter 的作用以及案例。 beanshell是什么: BeanShell是一个小型嵌入式Java源代码解释器,能够动态地执行java代码,不需要提前编译 JMeter在它的BeanShell中…

[BUUCTF_Misc]文件中的秘密

题目地址:BUUCTF文件中的秘密 主要工具:edge浏览器,HxD Hex Editor或其他十六进制编辑器下载安装包并解压,发现是一张开朗的路飞表面上什么都看不到,遂十六进制大法,搜索flag。 一无所获。 秘密藏在文件中?搜索secret。 颗粒无收。 大怒,快速上下滑动鼠标滚轮试图将答案…

npm install --legacy-peer-deps

问题:npm版本高无法解析依赖树导致依赖下载失败解决方法:执行npm install --legacy-peer-deps依赖对等 npm install xxxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以npm v4-v6的…

dp板子

01背包 f[x]表示装x重量时最大价值,f初值0; n物品数量,m最大重量。w表示容量,v时价值 for (int i = 1; i <= n; i++)//物品 { for(int j=m;j>=w[i];j--){//容量 f[j]=max(f[j],f[j-w[i]]+v[i]); } } 完全背包 for(int i=0;i<=m;i++){//背包容量 for(int j=1;j<…

【BERT】详解BERT

BERT,全称Bidirectional Encoder Representation of Transformer,首次提出于《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》一文中。简单来说,BERT是使用了Transformer的encoder(即解码器)部分,因此也可以认为BERT就是Transformer…