当前位置: 首页 > article >正文

【Unity3D】Addressables使用流程

Package Manager - 搜索  Addressables 安装

Window ->  Asset Management -> Addressables 打开窗口

New -> 新建Packed Assets  资源组 
默认资源组Default xxx (Default)
将资源,如预制体直接拖拽进资源组

Build -> New Build -> Default Build Script 打包资源组

注意:打包资源位置都是在工程Assets目录外面的,不是在工程内的...

打包后的资源在
Addressables Groups面板 : Tools -> Window -> Profiles 打开 Addressable Profiles窗口 (调整本地路径)
具体默认在 工程目录\Library\com.unity.addressables\aa\WebGL  [WebGL是项目平台名,根据不同平台有不同目录,例如Andorid , Window64

远程打包:
Addressables Groups面板:调整Play Mode Script 使用第三个 Use Existing Build (WebGL) 默认是第一个使用项目内的资源,一般测试用第二个用本地的资源组模拟加载(必须做这一步 否则测试加载时会用本地的,即使资源组全都被删了 也能加载)

Addressables Groups面板 : Tools -> Inspect  System  Settings 面板 
勾选Build Remote Catalog , Build & Load Paths 改为Remote (必须设置后才去Build 远程包,否则无法正常热更包)
Update a Previous Build 的 Content State Build Path 改为 Remote.LoadPath 即指定到远程目录 http://localhost:6800/ServerData/WebGL
远程目录:http://ip:port/ServerData/[BuildTarget]     其中BuildTarget会自动随Unity工程环境决定
【注意:如果是本地服务器,必须使用http://localhost:6800  而不是http://192.168.x.x:6800   因为192.168.x.x明文ip无法识别的】

双击需要远程打包的资源组,在Inspector面板 修改其文件属性 :Build&Load Paths 从Local 改为 Remote 远程打包
再重新Build,其打包出的资源位于:工程目录\ServerData\WebGL   [WebGL是项目平台名,同里其他平台有不同目录名]

使用HFS创建本地服务器  localhost:6800
如果发现仍然加载不到,看提示的报错加载路径url   可能是端口不同
Tools -> Window -> Profiles 打开 Addressable Profiles窗口 (调整远端路径) 【调整路径后必须重新打包 否则会找不到】
Remote -> 改为Custom自定义路径
Remote.LocalPath 改为 http://ip:port/[BuildTarget]  例如:http:localhost:6800/[BuildTarget] (不过我的默认就是对的)
[BuildTarget]例如WebGL 或 StandaloneWindows64 必须指定到目录,否则会找不到remote包而加载失败

默认是:http://[PrivateIpAddress]:[HostingServicePort]       
真实项目情况还要改为正常的服务器ip:port 

{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]

热更包流程:
 将需要修改的远程包资源修改之后, 打开Addressables Groups面板 : Build -> Update a Previous Build(更新上一个包)
旧版需要选择一下你要更新的包,如:Assets/AddressableAssetsData/WebGL(BuildPlatformName)/addressables_content_state.bin
新版不需要选择更新包,会自动更新所有这次要更新的包。


Addressable API
1. Addressables.InstantiateAsync  异步实例化物体(是实体 不是预制体)
    使用async  await简化代码 获取物体
 async void Load()
{
    //加载之前的逻辑正常执行完
    GameObject go = await Addressables.InstantiateAsync("xxx", pos, rotate).Task;  //类似协程yield return 等待这个任务完成
    //加载出go之后进行后续逻辑    
}
2. Addressables.ReleaseInstance  释放实例化物体(是实体 不是预制体)
3. Addressables.LoadAssetAsync (异步加载资源 贴图 图集 等等)  //同上也可以使用async  await  
4. Addressables.Release (卸载资源)

Packed Assets 文件内容:

Content Update Restriction
决定了资源是全量更新还是增量更新。

Can Change Post Release 后续更新资源的话全量更新(直接替换旧资源)【默认】
Cannot Change Post Release 后续更新资源的话增量更新(不改变旧资源包,使用新资源包加载改变的内容)【增量更新,需要每次更新前(Update a Previous Build之前)进行Tools->Check Update文件,弹出的窗口有变化就点击Apply 再去进行Update a Previous Build

由于Unity不支持Task多线程加载资源,改用 UniTask 2.1.0 版本可适用GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.

UniTask基本用法:
async void Load(){
    GameObject go = await Addressables.InstantiateAsync(name, Random.insideUnitSphere * 3, Quaternion.identity).ToUniTask();
    Material mat = await Addressables.LoadAssetAsync<Material>("ArrowMat").ToUniTask();
}

其他还有收集List<UnitTask<T>> list  再进行 await UniTask.WhenAll(list) 或 WhenAny(list)(一般是WhenAll等全部加载完毕 再进行后续流程)详细的可以百度

坑点:

WebGL环境下,Addressables 使用 InstantiateAsync加载出的物体,材质的shader会丢失,编辑器下启用Use Existing Build 会丢失,其他2个模式不会。

解决思路:在物体上挂载一个脚本,获取物体的材质球重新捆绑shader

例如:material.shader = Shader.Find(material.shader.name);

WebGL打包后,会丢失shader,需要将shader放于常驻shader列表内,即Project Settings -> Graphics -> Always Included Shaders 拖拽你丢失的shader。(注意不要拖拽Standary,会导致包体过大,打包速度变慢,一般情况下都不要使用这个着色器,即使使用也要是阉割版的 将不必要的东西删掉 减少变体)


http://www.kler.cn/a/590510.html

相关文章:

  • 使用Electron Forge打包serialport模块的详细指南
  • Go语言的智能合约
  • PlainUSR|LIA: 追求更快的卷积网络实现高效的超分辨率重建
  • 在用Docker配置Redis哨兵节点的时候出现的错误及其解决办法
  • 【Python 算法零基础 1.线性枚举】
  • DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战
  • ISP--Gamma Correction
  • 搞定python之八----操作mysql
  • 【SpringMVC】常用注解:@SessionAttributes
  • Qt QML解决SVG图片显示模糊的问题
  • @RequestBody注解解释
  • 服务创造未来 东隆科技携多款产品亮相慕尼黑
  • 【网络协议】基于UDP的可靠协议:KCP
  • Git 使用指南
  • 【多线程】单例模式
  • Unity学习之Shader总结(一)
  • Docker入门篇2:查看容器、运行容器、启动和停止容器、删除容器
  • Android PC 要来了?Android 16 Beta3 出现 Enable desktop experience features 选项
  • 【STM32】NVIC(嵌套向量中断控制器)
  • Android之RecyclerView列表拖动排序