Skip to content

hubluesky/VersionUpdateBundle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

VersionUpdateBundled

这是一个集合Unity的AssetBundlesBrowserAssetBundleDemo,只是对AssetBundleManager做了太多修改,并且也对AssetBundlesBrowser做了代码侵入修改,再加入了版本更新功能。

特性

  1. 使用Unity AssetBundlesBrowser来打Bundle,这个工具的好处就不用我再多说了,有兴趣可以超链接过去看看。
  2. 资源加载透明。使用Bundle之后,加载文件方式就变成了需要程序先加载Bundle,使用Bundle再加载文件,跟Resources.Load接口的文件路径不一样,然后再跟AssetDatabase.LoadAssetAtPath接口的文件路径又不一样,这简直就是搞事情,增加使用者的劳动成本。所以VersionUpdateBundle使用统一接口来加载Bundle,不管是在PC上还是手机平台上,都是一样的接口,都是一样的文件路径。文件路径跟AssetDatabase.LoadAssetAtPath接口一样,默认从Assets目录开始,包含Assets目录。加载示例:
    AssetBundleManager.Instance.LoadSceneAsync("Assets/VersionUpdateBundle/Examples/BundleAssets/Tanks/Scenes/TanksExample.unity", LoadSceneMode.Single)
    AssetBundleManager.Instance.LoadAssetAsync("Assets/VersionUpdateBundle/Examples/Background/Background.prefab")
    AssetBundleManager.Instance.LoadAsset<GameObject>("Assets/VersionUpdateBundle/Examples/Background/Background.prefab")
  3. 模拟模式。这是AssetBundleManager一个非常好用的功能,用来加载Bundle和本地文件时,都是一样的方法,这么好的功能,当然一并继承下来。模拟模式就是方便开发人员,在开发过程中,不必每添加一个资源,就打一次Bundle,然后才能使用Bundle把它Load出来。而是只要放到Unity的工程Assets目录下,使用文件目录进行加载,开启模拟模式,就可以在PC不用打Bundle包,就Load到了资源,其结果跟打完Bundle效果完全一样,非常方便开发和测试。
  4. 打Bundle跟程序开发完全分离。有了资源加载透明功能,有了模拟模式开发功能,开发人员完全可以对于Bundle是怎么打的,Bundle的资源都是怎么分的,Bundle的资源都是一日改了几次的所有这些问题,没有一点关系,打Bundle的事,完全可以在开发的任何一个阶段,由任意一个开发人员使用AssetBundlesBrowser去操作,而不用担心会使代码的资源加载出现问题。夸张一点说,你的Bundle是爱打成一个,还是打成N个,跟程序开发没有关系,程序开发只需要按资源在项目的Assets目录下加载即可。
  5. 版本更新。说到版本更新,其实就是增量更新,发布完应用后,需要新增、删除、修改原来的资源。这个时候就是版本更新要干的事了。VersionUpdateBundled支持增量更新,支持多个版本一起更新,支持自动打出增量包。(有兴趣请看下方的原理介绍。)

快速上手

  1. 打开Assets/VersionUpdateBundle/Examples/Scenes/Scens.unity场景
  2. 开启模拟模式。在菜单栏上选择AssetBundles/Simulation Mode
  3. 点击Play运行Unity,就可以看到这个示例了。示例内容

    在进入游戏时,快速显示一个背景,而不是长时间黑屏无响应的资源加载。然后就是资源更新检查的进度条显示,最后才是加载和切换场景。

打bundle的操作流程

  1. 在菜单栏上选择AssetBundles/VersionUpdatePackage,会打开以下这个窗口。说一下各项的意思

    Alt text

    • Version Update Folder 这是在初次对一个平台打Bundle时需要指定的路径,然后点击Create Version Update Folder按钮,将会创建该平台的Bundle打包和发布路径。示例图中就是打包PC版本Bundle的路径。点击创建按钮以后,会在文件夹下生成三个文件夹,分别是AssetBundles、LastManifest、Publish,不同的平台需要创建不同的路径。
    • Version Update Path 版本更新使用的文件夹,也就是上面所创建的文件夹。
    • Last Manifest Path 就是上面创建的文件夹,用来打增量版本时,存放旧的Manifest文件
    • Asset Bundles Path 上面创建的文件夹,用来存放项目打包的AssetBundle,如果是手机平台,这些资源需要再拷贝到项目Assets/StreamingAssets下面,这项操作在AssetBundlesBrowser Build的时候,会有一个Copy to StreamingAssets的选项。
    • Publish Path 上面创建的文件夹,用来存放项目打发布Bundle包时,需要放到服务器提供给客户端更新的资源,资源会被打成zip,还有一个VersionUpdateTable.json文件。
    • Last Version Number 打更新包时,读取LastManifestPath下旧资源的版本号
    • New Version Number 打更新包时,读取AssetBundlesPath下新资源的版本号
    • Copy To LastManifest 打更新包时,自动把旧资源的Mainifest和版本文件拷贝到LastManifest文件夹下
    • Create Version Package 把所有Bundle都打成更新包,在PublishPath下生成一个以版本号命名的zip文件,并创建或者更新PublishPath下的VersionUpdateTable.json文件。
    • Generate Incremental Package 打增量更新包,读取LastManifestPath下的旧版本Manifest文件,再读取AssetBundlesPath新的Bundle文件,进行Bundle对比,把新增的,改动的Bundle打成一个更新包放在PublishPath下,以版本号命名的zip文件,并创建或者更新PublishPath下的VersionUpdateTable.json文件。
    • 以下是各文件生成后存放资源的示意图:

    Alt text Alt text Alt text Alt text

  2. 创建完Bundle路径后,就可以打开AssetBundlesBrowser,开始打Bundle了。在菜单栏上选择Windows/AssetBundle Browser,会打开以下这个窗口。这是Unity的官方工具,具体使用情况,请看官方说明。这是传送门https://github.com/Unity-Technologies/AssetBundles-Browser

Alt text

  • 要记得Build Target要跟你创建版本更新的名字一样,不同平台,对应不同的版本更新目录,Output Path也是对应到版本更新创建的AssetBundles目录
  • 建议勾上Clear Folders。如果是要发布一个完整手机安装包的,记得勾Copy to StreamingAssets,这样打出来的Bundle才和安装包一起。

部分代码的原理与配置

  1. AssetBundlesBrowser侵入式修改代码位置。有需要自己更新AssetBundlesBrowser的同学,请看此处

    • 首先,所有的AssetBundlesBrowser文件都存放在Assets/VersionUpdateBundle/AssetBundelsBrowser下

    • 和AssetBundlesBrowser交互的脚本文件是BundleAssetsMapMenuItems,在Assets/VersionUpdateBundle/VersionUpdateManager/Editor/BundleAssetsMapMenuItems.cs该文件有一共两个函数,一个是PrepareBundleAssetsMap,一个是BuildBundleCompleted。这两个都是需要修改AssetBundlesBrowser的AssetBundleBuildTab文件的。

      • PrepareBundleAssetsMap 是在点击Build按钮时调用的,用于收集项目的所有Bundle以及Bundle里面的所有资源,然后记录下每个资源的路径以及对应的Bundle,这样就可以使用完全透明的路径加载方式了。
      • BuildBundleCompleted 做一些收尾工作,删除临时创建的Bundle。
      • 下面图片是修改AssetBundleBuildTab文件的两处地方。

      Alt text Alt text

  2. 增量打包原理

    • 增量打包是记录下上个版本的Manifest文件,然后用新的Manifest文件,从中获得所有Bundle,对Bundle的Hash进行对比,如果发现Hash不同,或者这个Bundle是新增,则这个Bundle会被打到更新包里,所以增量打包是需要先打出所有的Bundle,然后才能进行对比。
  3. VersionUpdateTable.json文件解析

    • 这个文件是每次打增量包都会生成的文件,如果是多次打包,这个文件是会自动合并的。
    • 此文件和打完包后的zip文件需要一起放到服务器上,客户端在版本更新检查时,会下载服务器的VersionUpdateTable.json文件,进行版本号对比,如果当前客户端版本低于服务器,则会下载并更新。
    • 下面是文件格式,这里面有两个版本,一个是1000,一个是10001,分别有1000.zip更新包和1001更新包,removeList是指该版本更新时需要删除的本地Bundle文件,这是在打增量包时,对比Manifest,如果新版本没有该Bundle,则会在此removeList里,等更新后,客户端本地的该Bundle文件将会被删除。
    {
        "versions": [
            {
                "versionNumber": 1000,
                "packageList": [
                    "1000.zip"
                ],
                "removeList": []
            },
            {
                "versionNumber": 1001,
                "packageList": [
                    "1001.zip"
                ],
                "removeList": []
            }
        ]
    }
    
  4. 关于SharpZibLib插件。使用这个插件主要是用来打增量包时,把Bundle打成Zip时使用。也是在版本更新时,从服务器上下载Zip文件,解压到本地时使用。

License

Copyright (c) hubluesky Personal. All rights reserved.

Licensed under the MIT License.

About

AssetBundle And Version Update For Unity

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages