UnityAddressable Assets System学习笔记
Posted 不如詩啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UnityAddressable Assets System学习笔记相关的知识,希望对你有一定的参考价值。
【Unity】Addressable Assets System
寻址式资源管理系统学习笔记
- 教学视频网址: https://www.bilibili.com/video/BV1N4411q7NA?from=search&seid=9501846827487133762
学习内容:
- 如何设计游戏资源加载的迭代设计
- 如何设计安装包和资源包或DLC的拆离设计
- 如何设计可切换的高清包和省电包等不同分辨率的纹理包
- 如何通过本系统设计换皮功能
- 如何检查资源是否下载并加载完成
- 如何制作后面添加的资源扩充包
- 如何在本地端模拟服务器加载资源包的流程
什么是Addressables?
- 可以取代Asset Bundle的高阶管理系统
- 天涯海角都会追踪到的信标(Address)
- 自动化仓储管理
- 本地或是异地都可以追踪
- 大多数形态资源都可以追踪
- 只加载有关联的资源
- 运行阶段优良的内存管理
- 迭代便利
Instantiate()
- 同步实例化
- 资源已在本地端
- 会等到工作结束后才继续运行
- 大量加载容易造成卡顿
- 如何使用Addressable优化? 代码如下:
//public GameObject prefab; 改为:
public AssetRefrence prefab;
//Instantiate(prefab); 改为:
prefab.InstantiateAsync(); //异步加载
LoadAssetAsync()
- 异步加载
- 资源可以在本地也可以在远端服务器
public List<AssetReference> prefabs; //使用List存储预制体
bool assetsReady = false; //是否已经加载完毕, 准备实例化
int toLoadCount; //需要加载的数量
int prefabIndex = 0;
void Start()
{
toLoadCount = prefabs.Count;
foreach(var prefab in prefabs)
{
//由于不知道资源是否在本地还是异地, 因此使用LoadAssetAsync来加载
//如果加载完成, 则执行OnPrefabAssetLoaded
prefab.LoadAssetAsync<GameObject>().Completed += OnPrefabAssetLoaded;
}
}
public void SpawnPerfab(int prefabType)
{
if(assetReady)
{
//异步实例化
prefabs[prefabType].InstantiateAsync();
}
}
void OnPrefabAssetLoaded()
{
toLoadCount--;
if(toLoadCount <= 0)
{
assetsReady = true;
}
}
AssetLabel的使用
public IList<GameObject> prefabs;
public AssetLabelReference prefabLabel;
public Button[] prefabCards;
void Start()
{
//把带有prefabLabel的所有Asset全部加载(所有包)
Addressables.LoadAssetsAsync<GameObject>(prefabLabel, null).Complete += OnResourcesRetrieved;
}
private void OnResourcesRetrieved(AsyncOperationHandle<List<GameObject>> obj)
{
prefabs = obj.Result;
foreach(var prefabCard in prefabCards)
{
prefabCard.interactable = true;//将卡片变为可用状态
}
}
public void InstantiatePrefab(int index)
{
if(prefabs != null)
{
Instantiate(prefabs[index]);
}
}
查询机制 LoadResourceLocationsAsync(Label)
该函数会根据Label获得一个清单IResourceLocation, 再依据清单中的内容过滤哪些内容需要加载.
Play Mode Script
- Fast Mode: 打包和加载都在本地端模拟, 速度很快. (适合研发阶段测试)
- Virtual Mode: 在本地段模拟服务器端.
- Packed Play Mode: 必须先打包, 模拟服务器环境. (适合拿到服务器之前测试)
本地/远端打包设置
- 可以生成许多不同的设置: 测试服、正式服、VIP服等等
- Local Build Path - 本地端打包路径
- Local Load Path - 本地端加载路径
- Remote Build Path - 远端打包路径
- Remote Load Path - 远端加载路径
安装包与加载包设置
- 从App Store下载最小的App
- 第一次启动时开始加载资料包
利用Label设计换皮与各种功能包
- 换皮
- 低清纹理包
- 高清纹理包
- DLC
- 等等…
public Renderer referenceMaterial;
public void SwitchToHighDef()
{
LoadTexture("ArcherSkin", "Skin2"); //根据情况切换纹理
}
void LoadTexture(string key, string label)
{
Addressables.LoadAssetsAsync<Texture2D>(new List<object>{ key, label }, null, Addressables.MergeMode.Intersection).Completed += TextureLoaded;
}
void TextureLoaded(AsyncOperationHandle<IList<Texture2D>> obj)
{
referenceMaterial.material.mainTexture = obj.Result[0];
}
做一些小的更改后, 不需要Build Player Content全部重新打包, 只需要Prepare For Content Update选择原始设置做渐进式的加载, 之后再Build For Content Update建立更新包
一些观念
- Addressables不是只有加载或是实例化, 你可以查询该物件在哪里
- 系统会帮你处理关联性
- Build Script可以让你自己写打包流程
- Addressables是基于Asset Bundle架构做的高阶流程
- 未来会朝以Addressables为主
旧系统如何转移: 直接转移
- public GameObject XXX 改为 public AssetReference XXX;
- Instantiate() 改为 AssetRefName.InstantiateAsync();
- 加载用LoadAssetAsync<GameObject>();
旧系统如何转移: Resources
- 当一个Resources文件夹内的资源被标记为Addressable时, 系统会自动将它从Resources文件夹移除到Resources_moved的新文件夹
- 默认的关联位置会指向原来的旧路径
- 原本的加载代码会从Resources.LoadAsync<GameObject>(“map/city.prefab”) 变成 Addressables.LoadAssetAsync<GameObject>(“map/city.prefab”);
旧系统如何转移: Asset Bundles
- 当工程有Asset Bundles设置时, 第一次打开Addressables菜单会询问是否要啊全部转入Addressables群组
- Addressables是基于Asset Bundles系统的延伸, 你可以吧Asset Bundles视为手动管理, Addressables视为自动管理
- 你是可以完全只采用Addressables的
- 虽然说Addressables和Asset Bundles可以混用, 但官方的目标并非两者共存, 而是王Addressables能处理一切相关工作为目标
以上是关于UnityAddressable Assets System学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
UnityAddressable Assets System学习笔记
UnityAddressable Assets System学习笔记