【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.mzph.cn/diannao/73537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s serviceaccount在集群内指定apiserver时验证错误的问题

在主机上&#xff0c;找到TOKEN&#xff0c;可以直接指定apiserver使用 rootubuntu-server:/home# kubectl auth can-i --list --server https://192.168.85.198:6443 --token"eyJhbGciOiJSUzI1NiIsImtpZCI6IlFlMHQ3TzhpcGw1SnRqbkYtOC1NUWlWNUpWdGo5SGRXeTBvZU9ib25iZD…

Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器

Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器 一&#xff0c;pinctrl 和 gpio 子系统1.pinctrl子系统2.GPIO子系统 二&#xff0c;并发和竞争1.原子操作2.自旋锁3.信号量4.互斥体 三&#xff0c;按键实验四&#xff0c;内核定时器1.关于定时器的有关概念1.…

数据库的高阶知识

目录 一、case when二、几种常见的嵌套查询2.1 比较运算符2.2 ANY/ALL 关键词2.3 in 关键词2.4 EXISTS关键词2.5 in和exists的异同点 三、开窗函数 数据库的基本知识 数据库的高阶知识 一、case when 在实际工作中&#xff0c;经常会涉及以下两类问题&#xff1a; 数据的映射…

【Kubernetes】Service 的类型有哪些?ClusterIP、NodePort 和 LoadBalancer 的区别?

在 Kubernetes 中&#xff0c;Service 是一种抽象的方式&#xff0c;用于将一组 Pod 进行连接并暴露给外部或集群内部访问。它的主要目的是通过提供稳定的 IP 地址和端口来允许其他服务或客户端与一组 Pod 进行通信。 Service 类型 Kubernetes 中 Service 有四种主要类型&…

MapReduce处理数据流程

&#xff08;一&#xff09;Shuffle MapReduce中的Shuffle过程指的是在Map方法执行后、Reduce方法执行前对数据进行分区排序的阶段 &#xff08;二&#xff09;处理流程 1. 首先MapReduce会将处理的数据集划分成多个split&#xff0c;split划分是逻辑上进行划分&#xff0c;…

OrioleDB: 新一代PostgreSQL存储引擎

PostgreSQL 12 引入了可插拔式的表存储方法接口&#xff0c;允许为不同的表选择不同的存储机制&#xff0c;例如用于 OLTP 操作的堆表&#xff08;HEAP、默认&#xff09;、用于 OLAP 操作的列式表&#xff08;Citus&#xff09;&#xff0c;以及用于超快速搜索处理的内存表。 …

电脑自动关机故障维修案例分享

电脑基本配置&#xff1a; C P U: AMD A10 9700 内存&#xff1a;8G 硬盘&#xff1a;金邦512G固态硬盘 主板&#xff1a;华硕 A320M-F 显卡&#xff1a;集成&#xff08;核心显卡&#xff09; 操作系统&#xff1a;Win10专业版 故障描述&#xff1a; 使用一段时间会黑屏…

JVM垃圾收集器相关面试题(1)

垃圾收集与内存管理摘要 一.核心垃圾收集算法对比 算法原理优点缺点适用场景标记-清除两次遍历&#xff08;标记存活对象→清除未标记对象&#xff09;实现简单内存碎片化、双遍历效率低老年代&#xff08;结合整理&#xff09;标记-复制内存对半分&#xff0c;存活对象复制到…

栈(LIFO)算法题

1.删除字符串中所有相邻的重复字符 注意&#xff0c;我们需要重复处理&#xff0c;而不是处理一次相邻的相同元素就结束了。对示例来说&#xff0c;如果只进行一次处理&#xff0c;结果为aaca&#xff0c;但是处理之后又出现了相邻的重复元素&#xff0c;我们还得继续处理&…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称&#xff0c;python后边的根据自己的需要&#xff0c;选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

Python基于深度学习的多模态人脸情绪识别研究与实现

一、系统架构设计 A[数据采集] --> B[预处理模块] B --> C[特征提取] C --> D[多模态融合] D --> E[情绪分类] E --> F[系统部署] F --> G[用户界面] 二、数据准备与处理 1. 数据收集 - 视频数据&#xff1a;FER2013&#xff08;静态图像&#xff0…

synchronized与 Java内置锁(未写完)

文章目录 一、 synchronized 关键字二、Java对象结构1. 对象头2. 对象体3. 对齐字节4. 对象头中的字段长度5. Mark Word 的结构信息6. 使用 JOL 工具查看对象的布局 三、Java 内置锁机制3.1 内置锁的演进过程1. 无锁状态2. 偏向锁状态3. 轻量级锁状态4. 重量级锁状态 一、 sync…

LLM(3): Transformer 架构

Transformer 架构是当前大语言模型的主力架构和基础技术&#xff0c;本文以通俗易懂的方式&#xff0c;对此作简要介绍。 1.4 介绍 Transformer 架构 大多数现代的大规模语言模型&#xff08;LLMs&#xff09;依赖于 Transformer 架构&#xff0c;这是一种在 2017 年的论文《…

11.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--整合日志

网关作为微服务架构的入口&#xff0c;承载着各服务间的请求转发与安全校验&#xff0c;其日志信息尤为关键。通过整合网关日志&#xff0c;可以将分散在不同系统中的访问记录、错误提示和异常信息集中管理&#xff0c;为问题排查提供全景视角。在排查故障时&#xff0c;统一日…

88.HarmonyOS NEXT 性能监控与调试指南:构建高性能应用

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 性能监控与调试指南&#xff1a;构建高性能应用 文章目录 HarmonyOS NEXT 性能监控与调试指南&#xff1a;构建高性能应用1. 性能监…

012---状态机的基本知识

1. 摘要 文章为学习记录。主要介绍状态机概述、状态转移图、状态编码、状态机写法、状态机代码示例。 2. 状态机概述 状态机 &#xff08;Finite State Machine&#xff09;&#xff0c;也称为同步有限状态机&#xff0c;用于描述有先后顺序或时序规律的事情。 “同步”&…

deepseek+kimi做ppt教程记录

1.首先注册deepseek和kimi deepseek官网&#xff1a;https://chat.deepseek.com/ kimi官网&#xff1a;https://kimi.moonshot.cn/ 以下以一篇工作总结报告为例 2.使用deepseek生成ppt大纲 让deepseek生成kimi生成ppt所需要的内容时&#xff0c;需要注意提示词内容&#xff0c;…

Java Module介绍

Java模块系统自Java 9开始引入&#xff0c;旨在提供更强大的封装机制、清晰的依赖关系定义以及可靠的配置。Java平台本身也被模块化了&#xff0c;提供了多个核心模块以及其他用于支持不同功能的模块。以下是一些重要的Java标准模块&#xff1a; java.base - 这是最基础的模块…

SOME/IP:用Python实现协议订阅、Offer、订阅ACK与报文接收

文章目录 前言一、代码层次二、详细代码1. eth_scapy_sd.py2、eth_scapy_someip.py3、network_define.py4、packet_define.py5、unpack_define.py6、someip_controller.py 前言 1、需要pip安装scapy库 2、需要修改根据实际情况配置network_define.py 3、执行someip_controller…

【Linux内核系列】:文件系统收尾以及软硬链接详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 世界上只有一种个人英雄主义&#xff0c;那么就是面对生活的种种失败却依然热爱着生活 内容回顾 那么在之前的学习中&#xff0c;我们…