Unity 热更新 之 一篇文章完全入门AssetBundle

本篇知识来源于unity官方手册以及siki学院的相关教程,链接如下,仅作学习分享

AssetBundle(创建打包)入门学习(基于Unity2017) - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程

目录

0.热更新是什么 

1.AssetBundle是什么

2.流程分析

 游戏运行时

 AssetBundle本身

 编辑器下

3.工作流程一览

0标记AB包对象

1.构建(上传)AssetBundle

​编辑

关于上传服务端

2.从服务器加载AssetBundle

3.从本地加载AssetBundle

4.卸载AssetBundle

4.必须知道的啸规则

打包压缩选项

依赖打包

目的

原理

加载依赖

关于完整性和安全性

5.究极杀器

旧版轻量化可视化AB包工具

新版极致方便AB包的再封装工具Addressables

 

0.热更新是什么 

        一言蔽之 就是你玩游戏的时候仍旧能下载资源,不需要把整个游戏重新下载 -安装 -打开

        常见于网络游戏更新,DLC等

1.AssetBundle是什么

        AssetBundle是Unity提供的热更新方案

         表现形式上是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)

AssetBundle - Unity 手册   ,其本质就是一个文件夹(或者压缩包),用来存储/加载重要资源

其包含了有两类文件

序列化文件

4fb6faadebbf47fcb1f1df2dae5a6bd8.png

源文件

ef32d69e3db647e5b23828ec0be213b8.png

2.抽象流程分析

9616b69f6c19469b8e4130767f484506.png

 游戏运行时

  • 加载 AssetBundle:从文件或服务器加载 AssetBundle
  • 加载 Asset:从 AssetBundle 中加载具体的资源
  • 卸载 AssetBundle 和 Asset:使用完资源后,卸载 AssetBundle 和资源以释放内存

 AssetBundle本身

  • AssetBundle:包含打包的资源文件
  • manifest:包含 AssetBundle 的元数据,用于管理依赖关系和版本控制

 编辑器下

  • 直接加载资源路径下的资源文件:在编辑器模式下,直接从资源路径加载资源文件
  • AssetDatabase 加载 Asset:使用 AssetDatabase API 加载资源
  • StreamingAssets 文件夹下的资源文件不做处理直接使用:StreamingAssets 文件夹中的资源文件在运行时直接使用,无需打包

3.工作流程一览

0标记AB包对象

例如我将一个cube和一个sphere放到了prefab文件夹下,其inspector最下面会有如下选项

261b2cdeecfc4b1a9a4a01d81529a30c.png180fb4df6f47466b965d9b7628ce658d.png

第一个None其实就是AB包的包名,其可以分类用斜线分割开

第二个None就是该包的后缀名,没错 指定任意后缀名

c04ccc949b884c18b77d2c6351849748.png7caa2b56fe624ddf890e74869f0e6241.png

 

db8bc98756b54429baac61fa550c4995.png

1.构建(上传)AssetBundle

将此脚本放到Editor文件夹下

2022.3版本 BuildAssetBundle方法已经弃用了,建议用加s的方法或者官网查询

using UnityEditor;
public class AB包 
{[MenuItem("AB包/上传")]public static void UpAB(){BuildPipeline.BuildAssetBundles("Assets/AssetBundles",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows);}
}

三个参数分别是 输出路径, 打包选项 , 打包平台 

8a512bc7db1543509f77a30e27505a02.png

a包 /方块后缀名 之中包含了Cube这个么一个物体,你可以将更多的物体放到这个包之中

5e1e3f41db824ef6a1cdfe2effba03ea.png

b包同理 

fd5e79231526439d89ea44e96624f6f3.png

关于上传服务端

怎么上传到网络端,需要移步网络知识处,我日后会在这里补充链接

保存到本地就非常简单了 [MenuItem("AB包/上传")]特性会执行构建并保存的静态方法

2.从服务器加载AssetBundle

StartCoroutine(LoadAB());}IEnumerator LoadAB(){string uri = @"http://localhost/AssetBundles/cubewall.unity3d";UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(uri);yield return www.SendWebRequest();AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);if(bundle!=null)Instantiate(bundle.LoadAsset<GameObject>("CubeWall"));}

代码进行了如下步骤: 

创建请求:使用 UnityWebRequestAssetBundle.GetAssetBundle(url) 创建一个请求对象

发送请求:使用 SendWebRequest 方法发送请求并等待响应

检查结果:检查请求结果,如果成功,使用 DownloadHandlerAssetBundle.GetContent 获取 AssetBundle

加载资源:使用 LoadAsset 方法从 AssetBundle 中加载资源并实例化

c2ec3adea055428988b055e5bbd421da.png

 

3.从本地加载AssetBundle

注意!要是绝对路径还好说,相对路径需要完整路径,也就是说后缀名也要加进来

本地同步加载

   // Start is called before the first frame updatevoid Start(){string path = "Assets/AssetBundles/a包/方块.后缀名";AssetBundle asset = AssetBundle.LoadFromFile(path);if(asset!=null){Instantiate( asset.LoadAsset<GameObject>("Cube"));}}

23f1f29f427a49bdac65c4b67fbd5fd3.png

本地异步加载,我直接改了Start函数,仅供参考

只需要知道Ienumerator ,yield return 和 AssetBundleCreateRequest ,LoadFromFileAsync方法配合即可

using UnityEngine;
using System.Collections;public class LoadAssetBundleAsync : MonoBehaviour
{// Start is called before the first frame updateIEnumerator Start(){string path = "Assets/AssetBundles/a包/方块.后缀名";AssetBundleCreateRequest bundleRequest = AssetBundle.LoadFromFileAsync(path);yield return bundleRequest;AssetBundle assetBundle = bundleRequest.assetBundle;if (assetBundle != null){AssetBundleRequest assetRequest = assetBundle.LoadAssetAsync<GameObject>("Cube");yield return assetRequest;GameObject prefab = assetRequest.asset as GameObject;Instantiate(prefab);assetBundle.Unload(false);}}
}

4.卸载AssetBundle

// 卸载 AssetBundle 但保留已加载的资源 
// 参数未true时将会卸载所有资源
assetBundle.Unload(false);// 卸载未使用的资源
Resources.UnloadUnusedAssets();

4.必须知道的啸规则

打包压缩选项

Unity - 脚本 API: BuildAssetBundleOptions - Unity 文档

其实就是一些压缩算法或者不压缩处理

31d8d3014c484406bd1cda4b8449f7dd.png

依赖打包

目的

比如我上述的a包中的方块和b包的求 如果都加载了同一个材质

764e0cf3b23d4c06bb84941af3db4982.pngf6d2d07c3c6544df90de24a41ad1d01d.png

那么我为了将打包出去的资源进行大小优化,就会单独将创建一个c包里面放该材质

这就叫做依赖打包

b6992cea21b84b2aab09895ab03cda7f.png

81ba44536d2f486fa99202d6c24d8820.png

原理

但是,加载的时候我怎么知道哪个是被依赖的包呢?

请看下图:

每一个AB包中都会有AssetBundles.manifest文件

其中在Info_n下会有Dependence,其中就是依赖包

c6c406b50dcb4d469341c87694fd379a.png

你只需要将依赖和被依赖包加载出来,unity将会通过自动处理该依赖关系

7e284e4230af416c83c30124be833b43.png

加载依赖

首先来看看没有加载依赖包的情况

即使你本地有该材质也不行,因为AB包就是走AB包的路径,和本地没有关系

using UnityEngine;public class LoadFromAB : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){string[] bundlePath ={"Assets/AssetBundles/a包/方块.后缀名","Assets/AssetBundles/b包/球.后缀名","Assets/AssetBundles/c包/材质.后缀名"};AssetBundle assets1 = AssetBundle.LoadFromFile(bundlePath[0]);Instantiate(assets1.LoadAsset<GameObject>("Cube"));AssetBundle assets2 = AssetBundle.LoadFromFile(bundlePath[1]);Instantiate(assets2.LoadAsset<GameObject>("Sphere"));}}

e2e2452b87534c769fd1574d1befe1fe.png

添加一句加载依赖包的代码 

   AssetBundle assets = AssetBundle.LoadFromFile(bundlePath[3]);

很有精神 

89ec97e9255345a2a9b97231721dd300.png

关于完整性和安全性

AssetBundle 下载的完整性和安全性 - Unity 手册

生成 CRC 校验和: 在构建 AssetBundle 时,Unity 会生成一个 32 位的 CRC 校验和,并记录在 .manifest 文件中。你可以使用 BuildPipeline.GetCRCForAssetBundle 方法来获取这个校验和

下载和校验 AssetBundle: 使用 UnityWebRequestAssetBundle.GetAssetBundle 方法下载 AssetBundle 时,可以传入预期的 CRC 值进行校验。如果下载的 AssetBundle 的 CRC 与预期值不匹配,则不会加载该 AssetBundle

5.究极杀器

旧版轻量化可视化AB包工具

Unity-Technologies/AssetBundles-Browser: Editor tool for viewing and debugging asset bundle contents before and after builds

6c8bb1db867f4d618ea9bf1cf2706e1d.png

但是我不去做介绍,因为官方已经停止更新了,取而代之......

新版极致方便 自动管理AB包的再封装工具Addressables

【游戏开发探究】Unity Addressables资源管理方式用起来太爽了,资源打包、加载、热更变得如此轻松(Addressable Asset System | 简称AA)_unity aa-CSDN博客

Addressables 软件包 |Addressables 可寻址 |2.3.1

我会更新此工具的文章,来日方长

 

 

 

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

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

相关文章

图片怎么去水印?5个简单好用的图片去水印方法分享!

在日常生活中&#xff0c;图片水印的去除需求时常涌现&#xff0c;无论是出于个人兴趣还是工作需求&#xff0c;掌握去水印技巧能让我们更自由地利用图片资源。今天&#xff0c;我们为您精心挑选并介绍五种实用的图片去水印方法&#xff0c;让您轻松上手&#xff0c;即刻提升图…

半导体测试领域CP和KGD的区别

在半导体测试领域&#xff0c;KGD&#xff08;Known Good Die&#xff09;和 CP&#xff08;Chip Probing 或 Chip Test&#xff09;是两个重要的概念&#xff0c;它们分别代表了不同阶段的测试和验证过程。下面详细解释这两者的区别&#xff1a; CP&#xff08;Chip Probing …

人机融合智能中的系统与还原

一、人工智能中的系统与还原 人工智能&#xff08;AI&#xff09;作为现代科技的重要组成部分和应用涉及多个学领域&#xff0c;包括计算机科学、学、神经科学等人工智能的研究中系统的概念至关重要。系统不仅仅是简单的组件集合&#xff0c;更多地体现为各个部分之间的相互作用…

这可能是2024年看过最全最详细的Java面试八股文

前言: 本文收集整理了各大厂常见面试题 N 道&#xff0c;你想要的这里都有内容涵盖&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈&#xff0c;希望大家都能找到…

010_SSH_Sqlserver多媒体技术与应用课程网(学习资料+前台考试)_lwplus87

目 录 摘 要... III Abstract V 第1章 概述... 1 1.1 课题背景... 1 1.2 课题意义... 2 1.3开发工具及技术... 2 1.3.1 MyEclipse. 2 1.3.2 Tomcat 2 1.3.3 SqlServer 3 1.3.4 JSP. 3 1.4国内外现状... 4 第2章 可行性分析及总体设计原则... 5 2.1可行性分析…

免费数字孪生平台打造物流数据可视化大屏,助力消费跑出加速度

在当今快速发展的时代&#xff0c;物流行业已成为连接生产与消费的重要桥梁。2024年&#xff0c;中国物流行业再次刷新纪录&#xff0c;8月13日&#xff0c;我国第1000亿件快递已顺利产生&#xff0c;比2023年提前了71天&#xff0c;这一速度令人惊叹。而在这背后&#xff0c;物…

Navict15 过期处理删除注册表

1.winR 注册表输入regedit 2.搜索输入HKEY_CURRENT_USER\Software\PremiumSoft\Navicat 3.输入HKEY_CURRENT_USER\Software\Classes\CLSID&#xff0c;找到只有一个info的&#xff0c;把包含info的这个文件夹删了。

计算机网络:运输层 —— TCP/IP运输层中的两个重要协议

文章目录 TCP 协议工作方式建立连接&#xff08;三次握手&#xff09;释放连接&#xff08;四次挥手&#xff09; 首部格式 UDP 协议首部格式适用场景 TCP 与 UDP 的对比无连接的UDP和面向连接的TCP对单播、多播和广播的支持情况对应用层报文的处理对数据传输可靠性的支持情况U…

OpenCV4.8 开发实战系列专栏之 13 - 图像翻转(Image Flip)

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a;图像翻转(Image Flip) 图像翻转的本质像素映…

内网基本概念及知识

参考&#xff1a; 微信公众号&#xff1a;网络安全自修室 1. 内网概述 内网也指局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;&#xff0c;即在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理&#xff0c;应用软…

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目

wordpress搭建主题可配置json

网站首页展示 在线访问链接 http://dahua.bloggo.chat/ 配置json文件 我使用的是argon主题&#xff0c;你需要先安装好主题&#xff0c;然后可以导入我的json文件一键配置。 需要json界面配置文件的&#xff0c;可以在评论区回复&#xff0c;看见评论我会私发给你。~

员工利用公司资源做自己生意违法吗?怎么预防?答案揭秘:违法!只需这样做!

各位企业大佬们&#xff0c;你的员工有没有心怀不轨&#xff0c;试图利用职务之便&#xff0c;将公司的资源挪作私用&#xff0c;甚至做起自己的生意呢&#xff1f; 老板&#xff1a;这把心酸泪&#xff0c;我都不想说...... 那么&#xff0c;员工利用公司资源做自己生意是否违…

模型再训练软件环境部署说明

什么时候需要看这个文档&#xff1f; 使用exe在windows预测或者训练paddleClas模型时候&#xff0c;本地环境配置的时候。 主机要求 硬件 系统&#xff1a;windows10以上Nvidia显卡数量&#xff1a;1&#xff08;仅支持单卡&#xff09;内存容量&#xff1a;至少32G硬盘容量…

ubuntu系统没有/var/log/messages日志文件解决方法

高版本ubuntu系统默认没有 /var/log/messages&#xff0c;因为在 /etc/rsyslog.d/50-default.conf 文件中&#xff0c;将其注释掉了。如下图 所以需修改该配置文件&#xff0c;将注释放开。 然后重启rsyslog服务即可。 systemctl restart rsyslog.service进入 /var/log/ 目录下…

Activity 通过Bundle与Fragment通信

目录 基础夯实&#xff1a;一、Activity与Fragment的关系二、通信场景三、通信方式1. 通过接口回调2. 通过Bundle3. 其他方式 四、注意事项 效果展示&#xff1a;实现功能&#xff1a;核心代码&#xff1a;MainActivityBlankFragment 基础夯实&#xff1a; Activity与Fragment…

体育活动赛事报名马拉松微信小程序开发

功能描述 体育活动赛事报名马拉松微信小程序&#xff0c;该项目是一个体育活动报名小程序&#xff0c;主要功能有活动报名、扫码签到、签到积分、排行奖励、积分兑换等功能。 用户端&#x1f536;登录&#xff1a;◻️1.微信授权登录 ◻️2.手机号码授权 &#x1f536;首页&am…

管家婆ERP集成金蝶云星空(管家婆主供应链)

源系统成集云目标系统 金蝶云星空介绍 金蝶云星空是金蝶软件&#xff08;中国&#xff09;有限公司研发的新一代战略性企业管理软件&#xff0c;致力于为企业提供端到端的供应链整体解决方案&#xff0c;它可以帮助企业构建敏捷供应链体系&#xff0c;降低供应链成本&a…

信捷 PLC C语言 POU 指示灯交替灭0.5秒亮0.5秒(保持型定时器)

1.在全局变量表中定义2个定时器变量timer_1,timer_2 名称 类型 timer_1 TMR_A_FB False -- False False timer_2 TMR_A_FB False -- False False ot2 BOOL False -- False False ot2表示指示灯 …

一文了解Mamba和选择性状态空间模型 (SSM)

一文了解Mamba和选择性状态空间模型 (SSM 前言SSMSSM简介深度学习中的SSM定义离散化SSM的递归方法SSM梯形法的基本原理离散过程重新整理并推导离散更新公式离散化后的矩阵表示 SSM卷积基本原理分析第一个方程分析第二个方程 Mamba&#xff1a;一种深度学习架构&#xff0c;专注…