【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.pswp.cn/diannao/73537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73537.shtml
英文地址,請注明出處:http://en.pswp.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;我們…