这些目录包含着不同版本的资源文件,以及用于版本控制的Files.txt
,里面存放着资源文件的名称和md5码。
客户端版本号我们是4位来标识,假设是X.Y.Z.W
X:【巨大版本号】这一位其实就是1,没事一般不会动他,除非有太巨大的变化,目前反正还是1;
Y:【整包更新版本号】:我们游戏一般一个月会有一个比较大的版本迭代,这种版本会走商店,每次提交Y值+1;
Z:【服务器协议版本号】,一个月度版本周期内,万一SDK有问题或者C#层有发现bug,需要更新商店,这一位会+1,这里单独留一个Z处理这种商店版本号,是因为不想影响Y值,而商店提交新包要求版本号必须有增加,buildNum也是商店要求必须要升的;
W:【编译版本号\热更版本号】,每次热更都+1 。
【第2位加1之后,3、4位全部清0】
相对于Resources下的资源,AB包可以更好地管理资源,更灵活方便,更易于做热更新相关工作
AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。
AssetBundle对于可下载内容(DLC)、减少初始安装大小、加载针对最终用户平台优化的资产以及减少运行时内存压力都很有用
AssetBundle里面包含了什么?
Resources.Load
加载资源。System.File
类进行读写。在任意平台都可以使用AssetBundle.LoadFromFile
来从此文件夹读取加载ab包。将需要同时加载的资源放在同一个包里,各个包之间会保存相互依赖的信息
分组依据:
在管理Asset和AssetBundle时,最重要的一点是调用AssetBundle.unload
时的方式,unload参数为true或false。
此API将卸载正在调用的AssetBundle的包头信息。unload参数决定是否也卸载从此AssetBundle实例化的所有对象。如果设置为true,那么从AssetBundle创建的所有对象也将立即卸载,即使它们目前正在活动场景中被引用。
如果调用了AssetBundle.Unload(True)
,则M将从场景中移除,销毁并卸载。但是,如果调用AssetBundle.Unload(False)
,则AB的包头信息将被卸载,但M将保持在场景中,并且仍然是可用的。
调用AssetBundle.Unload(False)
破坏了M和AB之间的链接。如果AB稍后再次加载,则AB中包含的对象的新副本将会被加载到内存中。此后如果再次加载AB,将再次加载这个包头信息的新副本,但是M和这个包并不会重新建立连接。如果此时调用AssetBundle.LoadAsset()
来重新加载M,将会有两个相同的副本M在现场。
为了避免这种情况,应该使用AssetBundle.Unload(True)
,并来确保对象不被复制,具体做法是:
另一个问题是:如果AssetBundle卸载后重新加载一个对象,重新加载将失败,该对象将以(Missing)对象的形式出现在Unity编辑器的层次结构中,材质会呈现洋红色。主要会发生在Unity失去并试图恢复对其图形上下文的控制时,例如当移动应用程序被挂起或用户锁定他们的PC时
AssetBundles可以通过四个不同的API进行加载。但受限于两个标准,这四个API的行为是不同的。两个标准如下:
而四个API分别是:
AssetBundle.LoadFromMemory(Async optional)
:不要使用这个API,因为他会冗余多次AssetBundle.LoadFromFile(Async optional)
:用于从本地存储(如硬盘或SD卡)加载未压缩或LZ4压缩格式的AssetBundle。UnityWebRequest's DownloadHandlerAssetBundle
WWW.LoadFromCacheOrDownload
(on Unity 5.6 or older)一般来说,只要有可能,就应该使用AssetBundle.LoadFromFile
。这个API在速度、磁盘使用和运行时内存使用方面是最有效的。
Unity提供了三个不同的API从AssetBundles加载UnityEngine.Objects
,这些API都绑定到AssetBundle对象上,并且这些API具有同步和异步变体,这些API的同步版本总是比异步版本快至少一个帧(因为异步版本为了确保异步,都至少延迟了1帧):
LoadAsset (LoadAssetAsync)
LoadAllAssets (LoadAllAssetsAsync)
LoadAssetWithSubAssets (LoadAssetWithSubAssetsAsync)
加载多个独立的
UnityEngine.Objects
时应使用LoadAllAsset
。并且只有在需要加载AssetBundle中的大多数或所有对象时,才应该使用它。LoadAllAsset
比对LoadAsset
的多个单独调用略快一些
Object加载是在主线程上执行,但数据从工作线程上的存储中读取。任何不触碰Unity系统中线程敏感部分(脚本、图形)的工作都将在工作线程上转换。例如,VBO将从网格创建,纹理将被解压等等。当一个Object完成加载时,它的Awake回调将被调用,该对象的其余部分将在下一个帧中对UnityEngine可用。