日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity 3D模型展示框架篇之资源打包、加载、热更(二)

發布時間:2023/12/10 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity 3D模型展示框架篇之资源打包、加载、热更(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本項目將整合之前Unity程序基礎小框架專欄在Unity 3D模型展示項目基礎上進行整合,并記錄了集成過程中對原腳本的調整過程。增加了Asset Bundle+ILRuntime熱更新技術流程。

本篇文章介紹如何對更新進行代碼檢測以及使用更新資源服務器進行資源熱更新。
創建登錄UI預制體LoginUI.prefab,主要功能按鈕如圖所示:
添加項目啟動腳本ProLaunch.cs,主要進行熱更資源檢測、下載更新操作。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.SceneManagement; using UnityEngine.UI;public class ProLaunch : MonoBehaviour {/// <summary>/// 顯示下載狀態和進度/// </summary>public Text UpdateText;public Text DownText;public Button btnCheckAndUpdate;public Button btnUpdate;public Button btnDown;public Button btnLogin;public Slider Slider;//滑動條組件private List<object> _updateKeys = new List<object>();// Start is called before the first frame updatevoid Start(){//retryBtn.gameObject.SetActive(false);btnCheckAndUpdate.onClick.AddListener(() =>{StartCoroutine(DoUpdateAddressadble());});btnUpdate.onClick.AddListener(() =>{UpdateCatalog();});// 默認自動執行一次更新檢測//StartCoroutine(DoUpdateAddressadble());btnDown.onClick.AddListener(() =>{DownLoad();});btnLogin.onClick.AddListener(() =>{SceneManager.LoadScene(1);//StartCoroutine(LoadScene("Test2"));});}// Update is called once per framevoid Update(){ }public async void UpdateCatalog(){//初始化Addressablevar init = Addressables.InitializeAsync();await init.Task;//開始連接服務器檢查更新var handle = Addressables.CheckForCatalogUpdates(false);await handle.Task;Debug.Log("check catalog status " + handle.Status);if (handle.Status == AsyncOperationStatus.Succeeded){List<string> catalogs = handle.Result;if (catalogs != null && catalogs.Count > 0){foreach (var catalog in catalogs){Debug.Log("catalog " + catalog);}Debug.Log("download catalog start ");UpdateText.text = UpdateText.text + "\n下載更新catalog";var updateHandle = Addressables.UpdateCatalogs(catalogs, false);await updateHandle.Task;foreach (var item in updateHandle.Result){Debug.Log("catalog result " + item.LocatorId);foreach (var key in item.Keys){Debug.Log("catalog key " + key);}_updateKeys.AddRange(item.Keys);}Debug.Log("download catalog finish " + updateHandle.Status);UpdateText.text = UpdateText.text + "\n更新catalog完成" + updateHandle.Status;}else{Debug.Log("dont need update catalogs");UpdateText.text = "沒有需要更新的catalogs信息";}}Addressables.Release(handle);}public void DownLoad(){StartCoroutine(DownAssetImpl());}public IEnumerator DownAssetImpl(){var downloadsize = Addressables.GetDownloadSizeAsync(_updateKeys);yield return downloadsize;Debug.Log("start download size :" + downloadsize.Result);UpdateText.text = UpdateText.text + "\n更新文件大小" + downloadsize.Result;if (downloadsize.Result > 0){var download = Addressables.DownloadDependenciesAsync(_updateKeys, Addressables.MergeMode.Union);yield return download;//await download.Task;Debug.Log("download result type " + download.Result.GetType());UpdateText.text = UpdateText.text + "\n下載結果類型 " + download.Result.GetType();foreach (var item in download.Result as List<UnityEngine.ResourceManagement.ResourceProviders.IAssetBundleResource>){var ab = item.GetAssetBundle();Debug.Log("ab name " + ab.name);UpdateText.text = UpdateText.text + "\n ab名稱 " + ab.name;foreach (var name in ab.GetAllAssetNames()){Debug.Log("asset name " + name);UpdateText.text = UpdateText.text + "\n asset 名稱 " + name;}}Addressables.Release(download);}Addressables.Release(downloadsize);}IEnumerator LoadScene(string senceName){// 異步加載場景(如果場景資源沒有下載,會自動下載),var handle = Addressables.LoadSceneAsync(senceName);if (handle.Status == AsyncOperationStatus.Failed){Debug.LogError("場景加載異常: " + handle.OperationException.ToString());yield break;}while (!handle.IsDone){// 進度(0~1)float percentage = handle.PercentComplete;Debug.Log("進度: " + percentage);yield return null;}Debug.Log("場景加載完畢");}IEnumerator DoUpdateAddressadble(){AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync();yield return initHandle;// 檢測更新var checkHandle = Addressables.CheckForCatalogUpdates(false);yield return checkHandle;if (checkHandle.Status != AsyncOperationStatus.Succeeded){OnError("CheckForCatalogUpdates Error\n" + checkHandle.OperationException.ToString());yield break;}if (checkHandle.Result.Count > 0){var updateHandle = Addressables.UpdateCatalogs(checkHandle.Result, false);yield return updateHandle;if (updateHandle.Status != AsyncOperationStatus.Succeeded){OnError("UpdateCatalogs Error\n" + updateHandle.OperationException.ToString());yield break;}// 更新列表迭代器List<IResourceLocator> locators = updateHandle.Result;foreach (var locator in locators){List<object> keys = new List<object>();keys.AddRange(locator.Keys);// 獲取待下載的文件總大小var sizeHandle = Addressables.GetDownloadSizeAsync(keys);yield return sizeHandle;if (sizeHandle.Status != AsyncOperationStatus.Succeeded){OnError("GetDownloadSizeAsync Error\n" + sizeHandle.OperationException.ToString());yield break;}long totalDownloadSize = sizeHandle.Result;UpdateText.text = UpdateText.text + "\ndownload size : " + totalDownloadSize;Debug.Log("download size : " + totalDownloadSize);if (totalDownloadSize > 0){// 下載var downloadHandle = Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, false);//yield return downloadHandle;while (!downloadHandle.IsDone){if (downloadHandle.Status == AsyncOperationStatus.Failed){OnError("DownloadDependenciesAsync Error\n" + downloadHandle.OperationException.ToString());yield break;}// 下載進度float percentage = downloadHandle.PercentComplete;Debug.Log($"已下載: {percentage}");DownText.text = $"已下載: {Mathf.Round(percentage * 100)}%";Slider.value = percentage;if (percentage >= 0.9f)//如果進度條已經到達90%{Slider.value = 1; //那就讓進度條的值編變成1}yield return null;}yield return downloadHandle;if (downloadHandle.Status == AsyncOperationStatus.Succeeded){Debug.Log("下載完畢!");DownText.text = DownText.text + " 下載完畢";}}}}else{UpdateText.text = UpdateText.text + "\n沒有檢測到更新";}// 進入游戲EnterPro();}// 進入游戲void EnterPro(){// TODOUpdateText.text = UpdateText.text + "\n進入游戲場景";Debug.Log("進入游戲");}private void OnError(string msg){UpdateText.text = UpdateText.text + $"\n{msg}\n請重試! ";}}

注意使用代碼更新時,需要修改熱AddressableAssetSettings更新設置否則代碼將無法檢測攔截更新信息。
做完以上工作,進行熱更Groups的設置與修改。創建一個遠程更新組并命名為RemoteGroup,按照圖中所示進行熱更資源配置。
配置熱更資源服務器,web服務器為IIS,如何創建應用程序這里不做贅述,有不懂的小伙伴留言。這里注意將熱更新資源.bundle、.hash加入到應用程序的MIME中使得Unity項目可以訪問到,否則404無法訪問資源。

配置好IIS服務器后訪問地址 http://www.btlfxx.cn/unity_cmj/tempas,沒毛病!!!

Unity項目中配置遠程更新服務器
配置信息
配置完成后New Build 一下,重新生成一下.bin文件。
構建成功信息

打開本地構建熱更資源的文件夾,看到如下文件信息。這些就是需要Copy到服務器上的熱更文件,Copy服務器之后在進行如下配置。

確定項目熱更新的工作模式
運行Unity項目
點擊檢測并更新
點擊登錄后跳轉場景
下面做熱更操作,將Switch預制體中的模塊隱藏掉。重新構建資源熱更包,將熱更包Copy到服務器上。


運行項目,下面做一個能下載資源的熱更包。

將RemoteGroup組中的Switch中的主體添加一個3D物體,重新打包。可以發現3個更新文件,組remotegroup新生成一個資源包,只需要Copy這3個文件到服務器上。

演示效果

Unity AA熱更新

總結

以上是生活随笔為你收集整理的Unity 3D模型展示框架篇之资源打包、加载、热更(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。