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 update
   void 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 update
    IEnumerator 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 update
    void 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

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

 

 

 

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

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

相关文章

思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉啊“ (**)

Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 这里提出使用 vi / vim 进行简单的编辑操作的原因&#xff0c;主要是在容器镜像中&#xff0c;普遍都是使用这个。 在 linux 服务器应用场景&#x…

【网络安全 | 甲方建设】DDOS 防范教程

未经许可,不得转载。 文章目录 前言DDoSDDoS种类针对DDoS CC攻击的防护备份网站拦截HTTP请求带宽扩容使用CDN隐藏服务器真实IP关闭不必要的服务或端口限制SYN/ICMP流量启用反向代理前言 假设你是一个电商平台的管理员,网站每天都处理大量的用户请求,比如用户浏览商品、加入…

【WRF模拟】全过程总结:WPS预处理及WRF运行

【WRF模拟】全过程总结:WPS预处理及WRF运行 1 数据准备1.1 嵌套域设置(Customize domain)-基于QGis中gis4wrf插件1.2 静态地理数据1.2.1 叶面积指数LAI和植被覆盖度Fpar(月尺度)1.2.2 地面反照率(月尺度)1.2.3 土地利用类型+不透水面积1.2.4 数据处理:geotiff→tiff(W…

【青牛科技】 GC6153——TMI8152 的不二之选,可应用于摇头机等产品中

在电子工程领域&#xff0c;不断寻求性能更优、成本更低的解决方案是工程师们的永恒追求。今天&#xff0c;我们要为广大电子工程师带来一款极具竞争力的产品 —— GC6153&#xff0c;它将成为 TMI8152 的完美替代之选。 一、产品背景 随着科技的飞速发展&#xff0c;电子设备…

Openstack9--安装etcd分布式键-值对存储系统

只需在控制节点安装 yum -y install etcd 编辑配置文件 配图画线处需要更改&#xff0c;如果改行被#注释请删掉# 以取消注释 vi /etc/etcd/etcd.conf 修改的 ETCD_LISTEN_PEER_URLS"http://192.168.10.10:2380" ETCD_LISTEN_CLIENT_URLS"http://192.168.1…

Go语言开发基于SQLite数据库实现用户表增删改查项目搭建(一)

背景 前几天我们不是写了个关于go语言解决rtsp协议只播放部分的问题(业务问题)这个么 里面用到了mysql&#xff0c;但不够轻量级&#xff0c;如果有的项目地需要的话&#xff0c;我们还需要部署mysql 其实这个项目就使用了一个表&#xff0c;没必要搞mysql&#xff0c;那有没有…

论文阅读-Event-based Visible and Infrared Fusion via Multi-task Collaboration

一、前言 可见光图像与红外图像融合&#xff08;VIF&#xff09;通过结合热红外图像与可见光图像的丰富纹理&#xff0c;提供了一个全面可靠的场景描述。然而&#xff0c;传统的VIF系统可能在极端光照和高动态运动场景中捕获过曝或欠曝的图像&#xff0c;进而导致融合结果下降…

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统&#xff0c;旨在提供一致的设计语言和视觉…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器&#xff0c;并且可以进行双向迭代。list的底层是一个双向链表&#xff0c;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下&#xff0c;某个局域网中&#xff0c;只有路由器的ip是公网的&#xff0c;局域网中的设备都是内网ip&#xff0c;内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用&#xff1f; 对于开启了NAT功能的局域网…

两个方法,取消excel数据隐藏

Excel文件中制作了数据表格&#xff0c;因为有些数据不方便显示但是又不能删掉&#xff0c;大家可能会选择隐藏数据&#xff0c;那么&#xff0c;excel隐藏的部分如何显示出来&#xff1f;今天分享两个方法给大家。 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&a…

【JavaEE进阶】Spring 事务和事务传播机制

目录 1.事务回顾 1.1 什么是事务 1.2 为什么需要事务 1.3 事务的操作 2. Spring 中事务的实现 2.1 Spring 编程式事务(了解) 2.2 Spring声明式事务 Transactional 对比事务提交和回滚的日志 3. Transactional详解 3.1 rollbackFor 3.2 Transactional 注解什么时候会…

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…

【靶点Talk】BCMA疗法能否成为下一个掘金点?

BCMA是一种极其重要的B细胞生物标志物&#xff0c;广泛存在于MM细胞表面&#xff0c;近年来已成为MM和其他血液系统恶性肿瘤的一个非常热门的免疫治疗靶点。今天靶点科普给大家带来BCMA作用机制和临床研究进展&#xff1a; 1 BCMA的“简历” B细胞成熟抗原(BCMA&#xff0c;又…

Linux 网络编程

网络编程&#xff1a;OSI 七层模型、TCP 协议、UDP 协议、三次握手、四次挥手、socket编程及编程实战 // 掌握网络编程&#xff0c;TCP、UDP等&#xff0c;socket函数编程 前置知识&#xff1a; 网络通信 网络通信本质上是一种进程间通信&#xff0c;是位于网络中不同主机上的进…

中文核心期刊论文模板免费下载

大家好&#xff0c;今天我要和大家分享一个对学术研究人员非常有帮助的资源——中文核心期刊论文模板。这个模板严格遵循中文核心期刊的出版标准&#xff0c;旨在帮助作者按照期刊的基本格式和内容要求撰写论文&#xff0c;确保论文结构清晰、规范&#xff0c;从而提高投稿效率…

Linux之DNS服务器

一、DNS 简介 定义与作用&#xff1a;DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;作为将域名和 IP 地址相互映射的分布式数据库&#xff0c;使人更方便地访问互联网。使用 53 端口&#xff0c;通常以 UDP 查询&#xff0c;未查到完整信息…

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后&#xff0c;用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…

物联网低功耗广域网LoRa开发(一):LoRa物联网行业解决方案

一、LoRa的优势以及与其他无线通信技术对比 &#xff08;一&#xff09;LoRa的优势 1、164dB链路预算 、距离>15km 2、快速、灵活的基础设施易组网且投资成本较少 3、LoRa节点模块仅用于通讯电池寿命长达10年 4、免牌照的频段 网关/路由器建设和运营 、节点/终端成本低…