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,还是把远程资源都删掉,都会显示无更新

但是我把新加的资源和原有的资源(新打的),一起传到远程,他只会更新新加的,但是原有的资源也是可以正常加载出来的

问题:他是把资源更新加载到电脑内存里面吗,我重新打包和删除远程资源无效,是因为更新还在内存中吗?

 

posted @ 2021-01-28 14:01  lovewaits  阅读(2775)  评论(1编辑  收藏  举报