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,會導致包體過大,打包速度變慢,一般情況下都不要使用這個著色器,即使使用也要是閹割版的 將不必要的東西刪掉 減少變體)