UnityAddressable Assets System学习笔记

Posted 不如詩啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UnityAddressable Assets System学习笔记相关的知识,希望对你有一定的参考价值。

【Unity】Addressable Assets System

寻址式资源管理系统学习笔记

  • 教学视频网址: https://www.bilibili.com/video/BV1N4411q7NA?from=search&seid=9501846827487133762

学习内容:

  1. 如何设计游戏资源加载的迭代设计
  2. 如何设计安装包和资源包或DLC的拆离设计
  3. 如何设计可切换的高清包和省电包等不同分辨率的纹理包
  4. 如何通过本系统设计换皮功能
  5. 如何检查资源是否下载并加载完成
  6. 如何制作后面添加的资源扩充包
  7. 如何在本地端模拟服务器加载资源包的流程

什么是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学习笔记

android studio创建assets目录并且利用webView加载其html

如何在 ios 上从 Qt 访问 assets 文件夹

从适配器中的assets文件夹添加SVG图像

怎么获取assets文件夹的路径??