Unity Addressable热更系统尝试(一)
受启发: Addressable 增量包
Addressable Setting中勾选
制作资源
设置定好资源的热更
下面是检测更新代码和加载资源
1 [SerializeField] 2 private string _entryName = "Assets/Prefab/GameObject.prefab"; 3 4 public Text UpdateLb; 5 // Start is called before the first frame update 6 void Start() 7 { 8 //var _ = StartAsync(); 9 10 StartCoroutine(DoUpdateAddressadble()); 11 } 12 13 IEnumerator DoUpdateAddressadble() 14 { 15 AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync(); 16 yield return initHandle; 17 18 var checkHandle = Addressables.CheckForCatalogUpdates(false); 19 yield return checkHandle; 20 if (checkHandle.Result.Count > 0) 21 { 22 var updateHandle = Addressables.UpdateCatalogs(checkHandle.Result, false); 23 24 yield return updateHandle; 25 26 List<IResourceLocator> locators = updateHandle.Result; 27 foreach (var locator in locators) 28 { 29 List<object> keys = new List<object>(); 30 keys.AddRange(locator.Keys); 31 var sizeHandle = Addressables.GetDownloadSizeAsync(keys); 32 yield return sizeHandle; 33 long totalDownloadSize = sizeHandle.Result; 34 UpdateLb.text = UpdateLb.text + "\ndownload size : " + totalDownloadSize; 35 Debug.Log("download size : " + totalDownloadSize); 36 if (totalDownloadSize > 0) 37 { 38 var downloadHandle = Addressables.DownloadDependenciesAsync(keys); 39 while (!downloadHandle.IsDone) 40 { 41 float percentage = downloadHandle.PercentComplete; 42 Debug.Log($"已下载: {percentage}"); 43 UpdateLb.text = UpdateLb.text + $"\n已下载: {percentage}"; 44 yield return null; 45 } 46 Debug.Log("下载完毕!"); 47 UpdateLb.text = UpdateLb.text + "\n下载完毕" ; 48 Addressables.Release(downloadHandle); 49 } 50 } 51 Addressables.Release(updateHandle); 52 } 53 else 54 { 55 UpdateLb.text = UpdateLb.text + "\n没有检测到更新"; 56 } 57 Addressables.Release(checkHandle); 58 59 60 Load(); 61 } 62 void Load() 63 { 64 Addressables.LoadAssetAsync<GameObject>(_entryName).Completed += 65 (op) => 66 { 67 if (op.Status == AsyncOperationStatus.Succeeded) 68 { 69 Debug.Log(op.Result as GameObject); 70 var go = Instantiate(op.Result as GameObject, Vector3.zero, Quaternion.identity, transform); 71 go.transform.localPosition = Vector3.zero; 72 go.transform.localScale = Vector3.one; 73 } 74 }; 75 }
原文是打了Log,我为了方便查看加了一个Text
将Addressable资源build好上传远程
工程打包,这里我打了pc包
运行
======================================================================
好的,这里出了事故
第一次运行之后显示了加载更新4039,刚好和资源大小一致,但是我直接关了进程想看看第二次打开会不会更新,没有更新但是第一次的更新没截图= =
然后悲催的我想重新打个包应该就行了,结果是
我就不淡定了,我包是重新打了,讲道理应该会重新更新才对,
于是我把包又重新删掉,远程的资源也删了,按照上面的流程重新操作一遍
结果.... 只显示更新size 为0
裂开了.....我在重新尝试中.......
想到一个办法,我要坑同事了,哈哈哈..
果然,成功截图..
在我几次尝试后,有这么个疑问:
现象:更新过后,不管我是把包删除重新build,还是把远程资源都删掉,都会显示无更新
但是我把新加的资源和原有的资源(新打的),一起传到远程,他只会更新新加的,但是原有的资源也是可以正常加载出来的
问题:他是把资源更新加载到电脑内存里面吗,我重新打包和删除远程资源无效,是因为更新还在内存中吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构