• Addressable使用心得


    Addressable继承了assetbundle 在unity2017之后官方开发的资源验证流程,做到在游戏运行中读取和更新资源不用关心bundle以及hash。

     

    不是初级教程,初级教程网上很多,这里算是补全一些使用的重点和细节

    addressable group 这个工具 去bilibili看教程 很快就会了,这里主要是笔者自己的使用心得

     

    快速入门

    Addressables.InitializeAsync; 初始化

    Addressables.CheckForCatalogUpdates;检查网络端的资源表

    Addressables.UpdateCatalogs 下载对应资源表

     

    Addressables.GetDownloadSizeAsync 检查要下载的资源所在的bundle还有依赖的bunlde的大小

    Addressables.DownloadDependenciesAsync 下载资源和依赖的bundle

    Addressables. LoadAssetAsync 从加载资源(具体资源同步流程看资源表章节)

    AssetReference 可以直接用于选择加入addressable groups里的物体

     

    简单的资源加载和更新函数都列出来了,其他unload的资源管理的自己琢磨把,我也没琢磨过。

    下面是Addressable的新特性

     

    Catalogs 资源表

    Addressable好在catalogs,也难在catalogs, catalogs很重要,所有资源都围着catalogs.

    基本上如果出现了难以理解的错误,不是catalogs和资源对不上,就是catalogs没下到。

     

    官方将bundle的hash还有bundle里的依赖全写在catalogs里。

     

    Catalogs是一张资源表,它在你build bundle的时候创建,对整个Addressable极为重要.

     

    游戏在用Addressable加载资源的时候会根据资源地址检测资源在哪个bundle,然后看看当前bundle是否存在,不存在就上网下,然后检查bundle自身的hash直和catalogs里的是否一致,一致就直接读取本地资源,不一致就上网下,下不到就报错,你有老资源也不会读取。它只认资源表

     

    当你打开build remote catalogs,就支持了网络更新资源表。

    而不打开build remote catalogs, 可以下网络的资源但是不能热更,这里说的是出包的之后,就只能通过本地的catalogs下载固定的资源,并且下的时候还会校对hash,crc,你替换资源也没用,尝试关闭hash,crc会出错。所以不用想着用addressable系统去更新资源表里没有的资源了,要想那么做,只能另外用assetbundle

     

    如果你不激活disable catalog update on startup,那么每当你第一次初始化Addressable. InitializeAsync 的时候,(如果你不调用 InitalizeAsync,那你用Addressable的任意功能依然都会自动初始化)会自动上网拉取资源表,如果你关闭自动拉取,那么你得用CheckForCatalogUpdates和UpdateCatalogs去主动下载资源表。

     

     

    依赖

    GetDownloadSizeAsync和DownloadDependenciesAsync 里面参数是具体的资源地址而不是bundle的组名,网上教程都没说清楚。

     

    如果本地有依赖对应的资源,就算再其他bundle里,也不用你去主动去管理。直接实例化就行

    但是,如果那些依赖在本地没有资源,你不使用DownloadDependenciesAsync无法自动下载其他依赖的bundle

     

    DownloadDependenciesAsync多次使用也没效果,本地资源表和资源对的上它不会下东西

     

    Build Bundle的时候会自动将需要依赖的次级资源加入到对应的bundle里,比如,如果你一个group里有个cube.prefab,cube上有材质球和贴图,而你并没有将材质球和题图加入到bundle列表里。它打包的时候会自动将材质球和贴图加进去。如果你材质球和贴图已经在其他bundle group里了,那么不会重复,资源永远只有一份。所以你需要DownloadDependenciesAsync确保所有依赖的bundle都在本地。

     

     

     

    热更新

    热更新需要用到check for content update resdriction,你每次build bundle的时候它都会更新,当你需要热更新的时候,使用check for content update resdriction, 去选一个bin文件,它会告诉你相对上一次的改动,是否有本地资源在列,然后自动把本地资源提出来新建一个组,这时候你不用build,build是完全重新构建,你需要增量更新 update previous build 去选那个bin文件。运行一下它会打增量包。

     

     

    实例化

    不要直接InstantiateAsync 要先load出来再instantiate,不要因为异步的关系,有可能导致你关掉运行模式回到编辑模式后,实例化依然再继续,然后就出现在你场景里了

     

     

    Bug:1.7.4资源表如果开远程,那么就算设定了初始化不检测,依然会连一次网络检测;

    DownloadDependenciesAsync 有时候速度太快 它的task会变空,在await导致报错,要处理一下。

  • 相关阅读:
    Java虚拟机(第二版) 学习笔记之Class类文件的结构
    JVM之深入浅出之垃圾收集算法
    Java虚拟机(第二版) 学习笔记之OutOfMemoryError
    Java虚拟机(第二版) 学习笔记
    平滑加权轮询负载均衡(轮询)算法
    java AQS(AbstractQueuedSynchronizer)同步器详解
    mybatis Interceptor拦截器代码详解
    aspectj编程简介
    Java并发编程阅读笔记-Java监视器模式示例
    我们该怎么结合日志做优化
  • 原文地址:https://www.cnblogs.com/Persona/p/12611288.html
Copyright © 2020-2023  润新知