YooAsset-资源构建与部署(二)


参数介绍

Build Output

构建输出的目录,会根据Unity编辑器当前切换的平台自动划分构建结果。目前是固定的Assets/Bundles

Build Pipeline 构建管线

/// <summary>
/// 构建管线类型
/// </summary>
public enum EBuildPipeline
{
    /// <summary>
    /// 传统内置构建管线
    /// </summary>
    BuiltinBuildPipeline,
    
    /// <summary>
    /// 可编程构建管线
    /// </summary>
    ScriptableBuildPipeline,
}

Build Mode 构建模式

    /// <summary>
    /// 资源包流水线的构建模式
    /// </summary>
    public enum EBuildMode
    {
        /// <summary>
        /// 强制重建模式,会删除指定构建平台下的所有构建记录,重新构建所有资源包。
        /// </summary>
        ForceRebuild,

        /// <summary>
        /// 增量构建模式,以上一次构建结果为基础,对于发生变化的资源进行增量构建。
        /// </summary>
        IncrementalBuild,

        /// <summary>
        /// 演练构建模式,在不生成AssetBundle文件的前提下,进行演练构建并快速生成构建报告和补丁清单。
        /// </summary>
        DryRunBuild,

        /// <summary>
        /// 模拟构建模式,在编辑器下配合EditorSimulateMode运行模式,来模拟真实运行的环境。
        /// </summary>
        SimulateBuild,
    }

Build Version 构建的资源包版本。

private string GetBuildPackageVersion()
{
    int totalMinutes = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
    return DateTime.Now.ToString("yyyy-MM-dd") + "-" + totalMinutes;
}

Build Package 构建的资源包名称。

private List<string> GetBuildPackageNames()
{
    List<string> result = new List<string>();
    foreach (var package in AssetBundleCollectorSettingData.Setting.Packages)
    {
        result.Add(package.PackageName);
    }
    return result;
}

Encryption 加密类列表。

加密需要,在Editor目录下实现一个继承IEncryptionServices接口的类。内置的有

  • EncryptionNone 通过文件内存来解密加载
  • FileOffsetEncryption 通过文件偏移来解密加载。
  • FileStreamEncryption 通过文件流来解密加载。
private List<Type> GetEncryptionServicesClassTypes()
{
    return EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
}

Compression 资源包的压缩方式。

/// <summary>
/// AssetBundle压缩选项
/// </summary>
public enum ECompressOption
{
    Uncompressed = 0,
    LZMA,
    LZ4,
}

Output Name Style 输出的资源包文件名称样式

/// <summary>
/// 输出文件名称的样式
/// </summary>
public enum EOutputNameStyle
{
    /// <summary>
    /// 哈希值名称
    /// </summary>
    HashName = 1,

    /// <summary>
    /// 资源包名称 + 哈希值名称
    /// </summary>
    BundleName_HashName = 4,
}

Copy Buildin File Option 首包资源文件的拷贝方式

/// <summary>
/// 首包资源文件的拷贝方式
/// </summary>
public enum ECopyBuildinFileOption
{
    /// <summary>
    /// 不拷贝任何文件
    /// </summary>
    None = 0,

    /// <summary>
    /// 先清空已有文件,然后拷贝所有文件
    /// </summary>
    ClearAndCopyAll,

    /// <summary>
    /// 先清空已有文件,然后按照资源标签拷贝文件
    /// </summary>
    ClearAndCopyByTags,

    /// <summary>
    /// 不清空已有文件,直接拷贝所有文件
    /// </summary>
    OnlyCopyAll,

    /// <summary>
    /// 不清空已有文件,直接按照资源标签拷贝文件
    /// </summary>
    OnlyCopyByTags,
}

构建

点击构建按钮会开始构建流程,构建流程分为多个节点顺序执行,如果某个节点发生错误,会导致构建失败。错误信息可以在控制台查看。


其他概念

补丁包

构建成功后会在输出目录下找到补丁包文件夹,该文件夹名称为本次构建时指定的资源版本号Build Version

补丁包文件夹里包含

  • 补丁清单文件,DemoManifest开头命名的文件。DemoManifest为全局配置ManifestFileName
  • 资源包文件
  • 构建报告文件等

TestPkg 对应BuildPackage
└─ 0.0.1 对应BuildVersion
    ├─ DemoManifest_TestPkg_0.0.1.json 主要用于开发者预览信息
    ├─ DemoManifest_TestPkg_0.0.1.hash  记录了补丁清单文件的哈希值
    ├─ DemoManifest_TestPkg_0.0.1.bytes 主要用于程序内读取加载
    ├─ DemoManifest_TestPkg.version 记录了构建的版本号,这里是0.0.1
    ├─ OutputCache.manifest 
    ├─ OutputCache      
    ├─ BuildReport_TestPkg_0.0.1.json  构建报告文件等 
    ├─ 
    ├─ ...
    └─ de5bce1950d21e631454e0f76e07d3b0.bundle 资源包文件

Jenkins支持

如果需要自动化构建,可以参考如下代码范例:

使用内置构建管线来构建资源包。


private static void BuildInternal(BuildTarget buildTarget)
{
    Debug.Log($"开始构建 : {buildTarget}");
    // 构建参数
    string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
    BuildParameters buildParameters = new BuildParameters();
    buildParameters.OutputRoot = defaultOutputRoot;
    buildParameters.BuildTarget = buildTarget;
    buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
    buildParameters.BuildMode = EBuildMode.ForceRebuild;
    buildParameters.PackageName = "TestPkg";
    buildParameters.PackageVersion = "1.0";
    buildParameters.VerifyBuildingResult = true;
    buildParameters.ShareAssetPackRule = new DefaultShareAssetPackRule();
    buildParameters.CompressOption = ECompressOption.LZ4;
    buildParameters.OutputNameStyle = EOutputNameStyle.HashName;
    buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.None;
    
    // 执行构建
    AssetBundleBuilder builder = new AssetBundleBuilder();
    var buildResult = builder.Run(buildParameters);
    if (buildResult.Success)
    {
         Debug.Log($"构建成功 : {buildResult.OutputPackageDirectory}");
    }
    else
    {
        Debug.LogError($"构建失败 : {buildResult.FailedInfo}");
    }
}

// 从构建命令里获取参数示例
private static string GetBuildPackageName()
{
    foreach (string arg in System.Environment.GetCommandLineArgs())
    {
        if (arg.StartsWith("buildPackage"))
            return arg.Split("="[0])[1];
    }
    return string.Empty;
}

重要概念

  • 增量构建

增量构建是在Unity的帮助下实现的一种快速打包机制。主要是利用资源构建相关的缓存文件来避免二次构建,以此来提高打包效率。

  • 强制构建

强制构建是每次构建之前,都会清空之前构建的所有缓存文件,以此来重新构建资源包。

  • 首包资源

在构建应用程序的时候,我们希望将某些资源打进首包里,首包资源拷贝至StreamingAssets/BuildinFiles/目录下。首包资源如果发生变化,也可以通过热更新来更新资源。

  • 补丁包

无论是通过增量构建还是强制构建,在构建完成后都会生成一个以包裹版本(PackageVersion)命名的文件夹,我们把这个文件夹统称为补丁包。补丁包里包含了游戏运行需要的所有资源,我们可以无脑的将补丁包内容覆盖到CDN目录下,也可以通过编写差异分析工具,来筛选出和线上最新版本之间的差异文件,然后将差异文件上传到CDN目录里。

构建报告

构建补丁包时生成的BuildReport_xxx_xxx.json,通过菜单YooAsset/AssetBundleRepoter导入对应文件即可查看

  • 概览视图 Summary
  • 资源对象列表视图 AssetView
  • 资源包列表视图 BundleView

资源部署

CDN目录

CDN
└─android
    ├─v1.0(APP版本)
    ├─v1.1(APP版本)
    └─v2.0(APP版本)
└─iphone
    ├─v1.0(APP版本)
    ├─v1.1(APP版本)
    └─v2.0(APP版本)

版本说明

  • v1.0指的是App版本,不是资源构建版本。
  • 比如出了一个App版本v1.0,后续只是做资源更新,每次只需要把补丁包完全覆盖到v1.0目录
  • 如果有了新App,比如v2.0,新建一个v2.0文件夹,后续相对应的App补丁包上传到v2.0目录
  • 假如想回退版本,只需要把要回退的版本补丁包覆盖到对应版本目录

声明:有无之境|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - YooAsset-资源构建与部署(二)


有无之境