目录
一、 前言
AA包(Addressables Assets)相比于旧版AB包(Asset Bundle)<都是用于打包的>的优点:
- ① AA包不需要知道资源的地址,可以直接用名称引用;
- ② Unity提供AA包的资源管理可视化界面;
- ③ AA包能自动管理资源卸载(当资源引用计数为0时);
- ④ AA包能自动管理依赖关系:当资源1依赖于资源2时,AB包要求先将资源2加载,才能加载资源1;而AA包直接加载资源1,就能自动将依赖的资源2加载进来;
- ⑤ AA包支持远程资源加载以及热更新(热补丁)。
什么是热更新?
仅在游戏内部即可更新成功的那种更新!使开发者在不发布新版本的情况下修复bug和发布功能,绕开(苹果)审核机制,避免长时间的审核以及多次被拒绝造成的成本。
那种需要到软件商店进行的更新,是从安装包的本地获得的资源加载,而热更新是远程从服务器进行加载。
---- 以下演示使用的Unity版本为 2021.3.26 ----
二、 打包资源
1. 安装插件 Addressables
Window - Package Manager - 选择Packages:Unity Regitry - 查找Addressables进行安装
2. 在编辑器中分类游戏资源,准备打包
资源可以怎么分类?
- 1. 根据不同的游戏场景分
- 根据资源类型分
- 根据功能模块分
- ......
注:资源重复或分包过于细碎会本末倒置,导致包体变大、影响游戏流畅度、带来更多的维护成本,需谨慎设计。【第五章有如何检查重复的打包资源的方法】
3. 创建资源组
Window - Asset Managemen - Addressables - Groups
点击“Create Addressables Settings”创建资源配置文件,可以看到Asset下多了AddressablesAssetsData文件。
4. 将资源拖入资源组
资源组的设置:可右键根据需求添加资源组,并重命名。
资源的设置:将对应组内的资源预制体拖入,通过Simplify Addressables Names可以快速将资源名从路径改为文件名(如Assets/Prefabs/red.mat —> red)。
这一步可自行设置是否为远程资源,单击资源组,在Inspector窗口中将Build & Load Paths改为Remote。
另外要在Inspector窗口中检查Use Asset Bundle Cache有没有被勾选,有的话取消掉,不然后面调用资源会一直调用第一次调用时的资源,不会变化(血的教训我要用红色勾出来!!TT)。
如果遇到相同的明明资源的状态变了,但是调用时依然没变化的情况,可以找找类似的清除AA包缓存的方法,每个版本不同捏。
5. 打包资源
5.1. 打包:Build - New Build - Default Build Script
5.2. 查找打包后的路径:Tools - Window - Profiles
打开Profiles后可以看到我们本地资源与远程资源的打包路径(BuildPath)以及加载路径(LoadPath)。
5.2.1. 本地资源:
首先看本地的路径,这里的BuildPath所指的路径在哪?以及BuildTarget表示什么呢?
电脑文件夹中打开该项目文件(可以直接在编辑器中右键项目文件中的Packages,点击Show in Explorer),然后点击Library - com.unity.addressables - aa,这个路径即为BuildPath。
在这个目录下有一个Windows文件夹,这是因为我的项目用的是Windows平台,所以对应的该目录下也可能有安卓(渠道:小米、OPPO、vivo、华为......)、iOS平台的文件夹,每一个平台都可以根据需要打出独立的包,这就是BuildTarget,表示平台。
打开Windows文件夹后,再打开StandaloneWindows64,里面的文件就是我们打包出来的资源文件。
5.2.2. 远程资源:
在有了本地资源的了解下,远程资源的理解就简单多了。
同理,电脑文件夹中打开该项目文件,在打包远程资源后,可以看到项目文件下多了一个ServerData,点开StandaloneWindows64,里面就是我们的远程资源。
注意将远程资源的加载路径修改为正确能访问到的服务器的路径和端口,以便后续能正常获取到资源。【第五章有如何利用模拟服务器(Unity自带 & HFS)来配置这个加载路径的方法】
三、 调用资源
将资源打包后就可以在游戏中加载资源。
1. 脚本
1.1. 简介
脚本中先引用UnityEngine.AddressableAssets的命名空间
(1)如果AA版预制体是需要从编辑器中拖入卡槽的,那么可以直接从AA可视化面板中选择资源拖入
AA版预制体类型:AssetReference
本地里实现资源异步实例化:
Addressables.InstantiateAsync(AA版预制体, 位置, 旋转)
(2)如果选择在代码中引用,可以直接使用资源名
Addressables.InstantiateAsync(“资源名”, 位置, 旋转)
注:
场景对象实例化——InstantiateAsync
除对象外资源(图片、动画、模型....)加载——LoadAssetAsync
1.2. 批量加载
批量加载可以用到标签,通过给资源设置标签,在加载时填入标签名,即可一次性将所有相同标签的内容批量载入。
1.3. ☆☆☆ 示例☆☆☆:
//利用 资源名 单个加载
bgSprite = await Addressables.LoadAssetAsync<GameObject>("Block-0").Task;
card = await Addressables.LoadAssetAsync<GameObject>("Block-02").Task;
//利用 标签名 批量加载
IList<Sprite> sprites = await Addressables.LoadAssetsAsync<Sprite>("sprites", null).Task;
CardSprites = sprites.ToArray();
2. 场景运行
运行前要选择对应的资源加载模式,第一、二种是直接从我们的项目资源里加载,所以不打包也能正常运行,适合测试使用。但是在正式上线测试的时候一定要使用第三种,它是从真正打包好的文件中加载。
Use Asset Database (fastest) 直接加载文件而不打包,快速但Profiler获取的信息较少
Simulate Groups (advanced) 在不打包的情况下模拟AssetBundle的操作
Use Exising Build(requires built groups) 实际上是从AssetBundle打包和加载
四、 热更新
- 修改系统设定 Tools - Inspect System Settings
- 勾选打包远程的资源目录(Build Remote Catalog),并将路径设为Remote
----- 假设在这里进行了一些资源的修改,打算开始热更新 -----
3. 完成资源修改后,Build - Update a Previous Build - 打开Windows目录 - 打开bin文件
五、 Tips
1. 模拟服务器
(1)HFS
直接将本地文件拖到小房子斜杠上,选择Real folder,设置端口,复制路径到需要的地方(远程资源的加载路径)。
(2)Unity自带
Tools - Window - Hosting Services
Create - Local Hosting - 勾选Enable - 设置端口号 - 复制路径到需要的地方(远程资源的加载路径)。
2. 如何找到重复打包的资源
Tools - Window - Analyze - 展开Analyze Rules - 展开Fixable Rules - 右键Check Duplicate Bundle Dependencies - Run Analyze Rule
如果有重复的资源,就会显示在Check Duplicate Bundle Dependencies列表下。