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

【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,会导致包体过大,打包速度变慢,一般情况下都不要使用这个着色器,即使使用也要是阉割版的 将不必要的东西删掉 减少变体)

相关文章:

  • S32K144入门笔记(十一):PDB的解读
  • 深度学习处理时间序列(1)
  • Unity物理射线滤除某层
  • FPGA中级项目1——IP核(ROM 与 RAM)
  • 黑马JUC学习笔记-上
  • LabVIEW烟气速度场实时监测
  • 路径问题(greedy):地下城游戏
  • Word 小黑第40套
  • 微服务无状态服务设计
  • token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)
  • 数据结构第一轮复习--第二章线性表(包含课程作业代码)
  • 设计模式 二、创建型设计模式
  • Harmony NEXT开发之创建自定义组件
  • API 返回的PDF是一串字符,如何转换为PDF文档
  • ruoyi-vue部署2
  • Java学习——数据库查询操作
  • PHP工程师转向Java开发定制的教材及教程信息,结合两种语言的差异点进行针对性推荐
  • 搭建opensbi+kernel+rootfs及基本设备驱动开发流程
  • java使用(Preference、Properties、XML、JSON)实现处理(读写)配置信息或者用户首选项的方式的代码示例和表格对比
  • 基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)
  • 平安资管总经理罗水权因个人工作原因辞职
  • 解放日报:上海深化改革开放,系统集成创新局
  • 马上评丨又见酒店坐地起价,“老毛病”不能惯着
  • “五一”假期倒计时,节前错峰出游机票降价四成
  • 十四届全国人大常委会举行第四十三次委员长会议 ,听取有关草案和议案审议情况汇报
  • 杭州6宗涉宅用地收金125.76亿元,萧山区地块楼面价冲破5万元/平米