本文由 NRatel 历史笔记整理而来,如有错误欢迎指正。

资源管理是Unity游戏开发中的重头工作之一。

以下按【编辑器下】和 【运行时】,共十多个步骤,一览总体流程(内容巨大,不细展开)。

一、资源导入Unity【编辑器下】

Unity资源导入设置方式选择-CSDN博客文章浏览阅读428次,点赞6次,收藏8次。​一种可保存和重复应用的资源导入配置模板。需先在 Inspector 窗口中为某种类型资源(如 Texture、Model、AudioClip)配置好所有导入设置后,将其保存为一个 .preset 文件。然后在 Inspector 窗口中手动拖拽或应用 Preset 到选中的资源(可多选资源批量应用)。支持只应用部分字段。可在 Edit -> Project Settings -> Preset Manager 中设置默认 Preset。 https://blog.csdn.net/NRatel/article/details/151068515

二、制作游戏【编辑器下】

        创建Unity内资源

        资源加工

三、资源分组【编辑器下】

1、一般分组策略

        ⑴、按逻辑实体分组

        ⑵、按类型分组

        ⑶、按并发内容分组

2、两种准备方式

        ⑴、设置ab标签(assetBundleName 和 assetBundleVariant)

                可以以/分隔的字符串作为标签,将成为ab的输出子路径

                unity设置ab标签时会统一转为小写

                后缀应设置为常规 .unity3d 或 .bundle,安卓 mainTemplate.gradle 中 aaptOptions 的 noCompress 的 BUILTIN_NOCOMPRESS默认为此两种后缀

        ⑵、自己利用特定规则构建 AssetBundleBuild[]

        ⑶、注意事项

                ①、无ab标签的资源被重复打入不同ab的问题

                        解决方式1:将X及依赖X的Y、Z资源,全打入一个ab中(可能使ab过大,后期可能还要拆分)

                        解决方式2:接能保证不被同时加载(只占硬盘不占内存,可忍)

                        解决方式3:提出公共依赖作为单独ab(彻底解决,但增加复杂度)

                ②、循环依赖问题

                ③、ab变体问题

                ④、图集打包问题

                ⑤、嵌套预设打包问题

                ⑥、Shader及其变体打包问题

                ⑦、压缩格式选择问题(LZMA、LZ4、不压缩)

四、资源打包【编辑器下】

1、两种AB打包方式

        ⑴、按照已设置的标签打 BuildPipeline.BuildAssetBundles(); 是增量的(已打过未变化的不会重新打)

        ⑵、按照自己构建的数组打 BuildAssetBundles(AssetBundleBuild[] builds);

2、BuildAssetBundleOptions 选项

        ⑴、BuildAssetBundleOptions.None 默认使用LZMA压缩

        ⑵、BuildAssetBundleOptions.StrictMode 有问题暴露出来

        ⑶、BuildAssetBundleOptions.DisableLoadAssetByFileName(从ab中加载资源时可以只传入文件名,而不用传入完整路径和后缀)BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension(从ab中加载资源时可以只传入文件名和后缀,而不传入完整路径)应该明确加载,所以统一按路径加载,禁用这两种快捷方式,以节省性能注意:unity设置ab标签时会统一转为小写,加载时win平台大小写不敏感,但移动平台敏感所以,应统一为小写。

        ⑷、AssetBundleStripUnityVersion 去掉,避免提升Unity小版本导致所有ab变化

        ⑸、DisableWriteTypeTree 建议不要动,向下兼容,省心,否则提升Unity版本之后必须记得将全部资源更新一次

3、生成/拷贝非AB资源,并加密&压缩

五、资源版本化【编辑器下】

1、 加载原始无版本化资源清单

2、创建版本化资源清单

3、设置摘要信息

4、处理每个资源文件(改名拷贝)

5、保存版本化清单文件

六、资源发布

1、上传资源到远程资源服务器(打包App时、热更时)

2、或内置资源到包内(打包App时)

七、App打包

见我其他打包相关文章

八、App上架

见我其他传包相关文章

九、App更新【运行时】

        强制更新(更新后才可进入,点击更新跳转到应用商店)

        非强制更新(可进入老版本)

十、资源更新(热更)【运行时】

1、根据项目需要,两种方式选择

        方式1、直接下载到 Application.persistentDataPath

        方式2、先下载到 Application.temporaryCachePath,再 拷贝到 Application.persistentDataPath

2、适应性/优缺点对比

        优点:方便对资源进行自定义压缩/解压。像单机类型的还能不必要求他更新完成

        缺点:占硬盘(极限情况下2倍)、多了拷贝/解压过程(拖慢进入时间,多了运行时候io)

3、按版本资源清单增量下载/删除

        获取版本资源完整清单

        合并历史完成/未完成

        计算最新需下载清单

        按清单下载

4、下载方法

        下载普通文件

                UnityWebRequest.Get(string uri)

        下载 AB文件

                如果不是下载即用,可直接按普通文件下载

                UnityWebRequestAssetBundle.GetAssetBundle(string uri)

5、下载实现——异步单步任务(底层支持、独立模块)

                成功、失败回调

                可主动终止

        异步多步并行任务(底层支持、独立模块)

                成功、失败、进度回调

                可主动终止

        限制同时最多

        可选择失败时是否终止

        可设置优先级?

6、下载实现——单个文件下载器(异步单步任务的一个实现)(内部可能性全部提出为配置)

        url【传入配置】

        保存位置【传入配置】

        是否断点下载【传入配置】

                大文件需要断点续传

        重试次数【传入配置】

                默认0

        使用协程/子线程执行(先固定协程吧)

        成功、失败回调

7、下载实现——文件列表下载器(使用异步多步任务)

        整体下载完成后操作(完成回调中)

                如:整体完成后统一解压

        处理下载失败的情况(失败回调中)

                考虑:若是网络问题应该立即终止,若是文件问题可先下载其他文件

        单个文件下载完成后操作(进度回调中)

                计数

8、下载实现——多列表下载器(合并下载N个文件列表)(多个分包时)

        方式一:串行下载多个列表

        方式二:将多个列表合并为一个列表;再下载这个大列表

十一、加载AB到内存【运行时】

1、加载/创建方法

        ⑴、从内存区域创建 AssetBundle.LoadFromMemory(byte[] binary)

                可用于ab加密解密,但速度慢且内存会至少翻倍,不推荐使用

        ⑵、从本地硬盘加载 AssetBundle.LoadFromFile(string path)

                支持加载任意压缩类型的ab,LZMA格式将在内存中被解压

                在移动设备中,只会将 ab 的 头部数据加载进内存,其他的数据保留在磁盘中

                在 Unity 编辑器中,会将 ab 的全部数据加载进内存。这会使 Profiler 出现内存峰值,实际设备不会出现

        ⑶、AssetBundle.LoadFromStream(Stream stream)

                支持任意压缩类型,LZMA将在内存中解压,速度与LoadFromFile类似,可用于ab加密解密

2、支持可寻址加载

        一个自定义加载地址,无论资源在 Assets 下的任意子路径中(使资源可随意移动)

        一个自定义加载地址,无论ab在 Assets目录(编辑器下),还是在 stramingAssets 或 persistDataPath 目录,还是在远程(可不支持)

3、依赖处理

        递归加载其依赖项,以保证LoadAsset时无引用丢失

十二、加载AB内资源到内存【运行时】

加载方法        ab.LoadAsset(string name)

十三、创建游戏对象/组件实例【运行时】

根据资源类型不同,复制 或 引用资源

        Prefab:复制

        Texture、Shader:引用

        Mesh、Material :复制 或 引用Shared

十四、销毁游戏对象/组件实例【运行时】

1、销毁/解除引用资源

        销毁 GameObject.Destroy()

        以非附加方式加载场景,Application.LoadLevel()

                将销毁当前场景中的所有对象(部分对象除外)

                DontDestroyOnLoad 的对象不会被此方法销毁

                HideFlags 包含或是 DontSave 的对象不会被此方法销毁

        解除引用如 xxx.texture = null 等

十五、卸载内存中资源【运行时】

1、卸载方法

        Resources.UnloadAsset(Object assetToUnload)

        Resources.UnloadUnusedAssets()

                当内容较多时可能卡顿

                以非附加方式加载场景时,将销毁当前场景中的所有对象并自动调用本方法

                HideFlags 包含或是 DontUnloadUnusedAsset 的资源不会被此方法卸载(只能主动指定卸载)

十六、卸载AB【运行时】

1、卸载方法

        ab.Unload(bool unloadAllLoadedObjects)

                参数指定true时:卸载ab header,同时卸载所有从ab内加载的资源对象(即使正在场景中被使用)(应尽量使用此方式)

                参数指定false时:只卸载ab header,被引用的ab内资源将驻留(该资源将和ab无关)(后续可使用Resources.UnloadUnusedAssets清理)

        AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects);

2、ab引用计数,代理卸载

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel vs Resilience4j vs Bucket4j:分布式限流方案对比与实战

Sentinel vs Resilience4j vs Bucket4j:分布式限流方案对比与实战 在高并发微服务架构中,合理的限流策略是保护系统稳定性与可用性的关键。本文将从问题背景入手,对 Sentinel、Resilience4j 和 Bucket4j 三种常见的分布式限流方案进行对比&am…

Spring Boot 3.5.3 集成 Log4j2 日志系统

在 Spring Boot 3.5.3 中&#xff0c;要将默认的 Logback 替换为 Log4j2&#xff0c;需要以下步骤&#xff1a;1. 添加 Log4j2 依赖在 pom.xml中排除默认的 Logback 依赖并添加 Log4j2 依赖&#xff1a;<dependencies><!-- 排除默认的 Logback --><dependency&g…

ADB图片上传轮播

可以通过ADB在机器中进行上传照片&#xff0c;进行其他图片播放 当前系统架构分析 1. 现有组件结构 ImageCarouselActivity: 主要的轮播Activity&#xff0c;继承自BaseBindingActivity 实现全屏显示和沉浸式体验使用ViewPager2进行图片轮播支持自动轮播&#xff08;5秒间隔&…

异常处理小妙招——2.代码的韧性:如何实现操作的原子性回滚

一、核心思想&#xff1a;什么叫“失败原子性”&#xff1f; 想象一下你在玩一个闯关游戏&#xff0c;有一关需要你连续跳过三个平台。 不具有原子性&#xff1a;你跳过了第一个和第二个平台&#xff0c;但在跳第三个时失败了、掉下去了。结果你不仅没过关&#xff0c;连之前跳…

Crawl4AI:为LLM而生的下一代网页爬虫框架

在当今AI驱动的信息处理时代&#xff0c;从网页中高效提取高质量、结构化的数据已成为连接互联网与大语言模型&#xff08;LLM&#xff09;的关键桥梁。Crawl4AI作为一款开源的LLM友好型网页爬虫与刮板工具&#xff0c;正迅速成为开发者处理这一任务的首选解决方案。本文将深入…

输出一个爱心

输出效果&#xff1a;代码实现&#xff1a;#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int main() {int n;cin>>n;char a[8] {I,L,O,V,E,Y,O,U};int j 1;int k n*21;int o n*2-2;int aa 0; for(int i 0;i&…

深度集成Dify API:企业级RAG知识库管理平台解决方案

&#x1f3af; 需求和概述 当前基于Dify实现企业级的智能问答系统需求日益增长&#xff0c;Dify的低代码开发框架和功能完整、灵活适应各种需求的特色得到广大大模型和RAG开发着的欢迎。但是Dify在落地企业级应用时候&#xff0c;也面临不少的问题&#xff0c;最突出的就是Dif…

C++循环越界问题

for (int i 0; i < historyTableList.size() - 1; i) {historyList2.push_back(historyTableList[i]); } historyList.size()0时&#xff0c;为什么会异常historyTableList.size() 返回的是 size_t 类型&#xff08;无符号整数&#xff09;当 size() 0 时&#xff0c;size…

MongoDB 从零到入门:实用指南

什么是 MongoDB&#xff1f; MongoDB 是一个流行的非关系型数据库&#xff08;NoSQL&#xff09;&#xff0c;它使用类似 JSON 的文档来存储数据&#xff0c;而不是传统的表格形式。这使得 MongoDB 非常灵活&#xff0c;特别适合处理半结构化数据和快速迭代的开发场景。 核心概…

WebRTC音频QoS方法五(音频变速算法之Expand算法实现)

一、概述介绍在WebRTC中&#xff0c;存在两种扩展算法&#xff1a;PreemptiveExpand和Expand。尽管这两种算法的目标都是扩展音频信号&#xff0c;但它们的实现原理和应用场景却有所不同。PreemptiveExpand&#xff08;预防性扩张&#xff09;主动扩展策略&#xff0c;旨在防止…

【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题

解决pycharm“No Python interpreter configured for the project”问题 当你在 PyCharm 中遇到“No Python interpreter configured for the project”错误时&#xff0c;意味着你的项目没有配置 Python 解释器。以下是解决该问题的步骤。 示例 # 尝试运行代码时出现错误 prin…

Elasticsearch创建索引分片和副本大小建议

在Elasticsearch中&#xff0c;‌分片(shard)和副本(replica)‌ 的设置直接影响集群性能、容错能力和扩展性。以下是最佳实践指南&#xff1a;核心概念‌类型‌‌描述‌‌是否可修改‌‌主分片(Primary Shard)‌数据的最小存储单元&#xff0c;每个索引被拆分成多个主分片❌ 索…

“人工智能+虚拟仿真”开启新学期智慧学习之旅

在教育领域掀起数字化革新浪潮的今天&#xff0c;新学期的开启不仅意味着知识探索新征程的起步&#xff0c;更蕴含着教育模式深度变革的无限可能。虚拟仿真技术作为教育现代化的关键驱动力&#xff0c;正重塑学习体验&#xff0c;引领教育范式转移。人工智能与虚拟仿真技术的结…

Photoshop用户必看:让你的PSD像JPG一样可预览

软件介绍 Photoshop缩略图补丁插件3.8.0.96是一款实用的工具&#xff0c;它能够将PSD格式的文件&#xff08;Photoshop的专用格式&#xff09;以缩略图的形式显示出来。这一功能极大地提升了用户在管理和查找图像文件时的效率&#xff0c;使得看图、找图变得更加轻松便捷。该插…

idea2025.1.5安装+pj

写在前边&#xff1a;如果是卸载旧版本IDEA重装&#xff0c;一定记得之前的插件啥的&#xff0c;截个图。还有主题字体设置啥的 目录背景原因卸载原来版本安装教程背景原因 原来的2022.2不支持jdk21的语言版本 卸载原来版本 1、如何彻底卸载 IDE, 可参考这篇的文章&#xff…

(四)Python控制结构(条件结构)

程序中的语句默认会按照自上而下的顺序逐条执行&#xff0c;但通过一些特定的语句可以更改语句的执行顺序&#xff0c;使之产生跳跃、回溯等现象&#xff0c;进而灵活地控制程序的执行流程。控制结构是编程中用于控制程序执行流程的语句&#xff0c;程序的三种基本控制结构为&a…

血缘元数据采集开放标准:OpenLineage Guides 使用 Apache Airflow® 和 OpenLineage + Marquez 入门

OpenLineage 是一个用于元数据和血缘采集的开放标准&#xff0c;专为在作业运行时动态采集数据而设计。它通过统一的命名策略定义了由作业&#xff08;Job&#xff09;、运行实例&#xff08;Run&#xff09;和数据集&#xff08;Dataset&#xff09; 组成的通用模型&#xff0…

FPGA|Quartus II 中使用TCL文件进行引脚一键分配

在FPGA设计过程中&#xff0c;合理的引脚分配是确保硬件功能正确实现的关键步骤之一。Quartus II 提供了通过 TCL&#xff08;Tool Command Language&#xff09;脚本自动化引脚分配的功能&#xff0c;这不仅可以大大提高设计效率&#xff0c;还能够确保引脚分配的精确性和可重…

【Docker/Redis】服务端高并发分布式结构演进之路

目录 概述 常见概念 基本概念 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Module&#xff09;/ 组件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff09; 集群&#xff08;Cluster&#x…

【Excel】将一个单元格内​​的多行文本,​​拆分成多个单元格,每个单元格一行​​

​​所有文本都堆积在“prefix”列顶部的同一个单元格里&#xff08;很可能是B10单元格&#xff09;&#xff0c;并且它们是用空格分隔的&#xff0c;而不是换行符。​​因此&#xff0c;您不需要处理换行符&#xff0c;而是需要​​按“空格”进行分列&#xff0c;并且将分列后…