博客站点静态镜像

0%

TinaX Framework 自动化构建实践

刚才有小伙伴问,TinaX在构建母包之前都得手动打包资源,那么如果要放在DevOps工具中,应该如何让它自动打包呢?

其实这个不是什么复杂的事情,我们自己的项目中一直在使用Unity Cloud Build Service来自动化构建TinaX项目。而实现这一点也只需要自己在工程中写一个脚本,让其在执行构建之前运行,自动执行一些准备操作即可。

那么,直接贴代码如下:

using UnityEngine;
using TinaXEditor.VFSKit;
using TinaX.VFSKit;

namespace ExampleEditor
{
public static class CloudBuildHandle
{

    /// <summary>
    /// 处理iOS的编译
    /// </summary>
    public static void Build\_iOS\_Handle()
    {
        var xPlatform = TinaX.Const.PlatformConst.E_Platform.iOS;
        var uPlatform = UnityEditor.BuildTarget.iOS;

        Debug.Log("开始 云编译前置处理工作");
        // 加一个步骤,生成Xlua代码
        Debug.Log("清理Xlua代码");
        CSObjectWrapEditor.Generator.ClearAll();
        Debug.Log("重新生成Xlua代码");
        CSObjectWrapEditor.Generator.GenAll();

        //第一步,打AB包
        Debug.Log("资源打包工作");

        var packPath = $"{TinaX.Setup.Framework\_AssetSystem\_Pack_Path}/{xPlatform.ToString().ToLower()}/";
        var packer = new XVFSPacker();  //构建一个打包对象
        packer.AddPackPlan(new VFSPackPlan()    //添加打包计划
        {
            Platform = uPlatform,
            XPlatform = xPlatform,
            ClearOutputFolders = false, //反正云构建有Clear选项
            CopyToStreamingAssets = true,   //这儿直接会复制进去,就不需要手动操作了
            OutputPath = packPath,
            AssetCompressType = VFSPackPlan.CompressType.LZ4
        });

        //开始打包
        packer.StartPacker(TinaX.Config.GetTinaXConfig<VFSConfigModel>(TinaX.Conf.ConfigPath.vfs).GetPerfect());
        Debug.Log("流程执行结束");

    }
}

}

如果使用TinaX 6.4.x及以前版本,处理代码如下(有点乱):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TinaXEditor;

namespace ExampleEditor
{
///


/// 云编译系统处理
///

public static class CloudBuildHandle
{
//要处理其他平台的话,直接复制一份改,不要做封装

    /// <summary>
    /// 处理windows64的编译
    /// </summary>
    public static void Build\_Windows64\_Handle()
    {
        Debug.Log("开始 云编译前置处理工作");
        // 加一个步骤,生成Xlua代码
        Debug.Log("清理Xlua代码");
        CSObjectWrapEditor.Generator.ClearAll();
        Debug.Log("重新生成Xlua代码");
        CSObjectWrapEditor.Generator.GenAll();

        //第一步,打AB包
        Debug.Log("资源打包工作");

        var packMgr = new AssetPackageMgr();
        var packPath = TinaX.Setup.Framework\_AssetSystem\_Pack\_Path + "/" + TinaX.Const.PlatformConst.E\_Platform.Windows64.ToString().ToLower() + "/";
        Debug.Log("资源打包路径:" + packPath);
        packMgr.PackGlobal(packPath, TinaX.Platform.GetBuildTarget(TinaX.Const.PlatformConst.E_Platform.Windows64), true, true, false, false, true);


        //执行复制流程
        var pathInStreamingAssets = "Assets/StreamingAssets/vfs/" + TinaX.Const.PlatformConst.E_Platform.Windows64.ToString().ToLower();

        Debug.Log("执行移动流程,从" + packPath + "  到  " + pathInStreamingAssets);

        var target_path = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), pathInStreamingAssets);
        System.IO.Directory.CreateDirectory(System.IO.Directory.GetParent(target_path).ToString());
        Debug.Log("新建目录:" + System.IO.Directory.GetParent(target_path).ToString());
        System.IO.Directory.Move(System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), packPath), target_path);

        Debug.Log("流程执行结束");

    }

}

}

之后,以Unity Cloud Build Service为例,在Build Config的 Advanced Options 中,将之前写好的代码填入 Pre-Export Method选项中,格式为“命名空间.类名.方法名”,如 ExampleEditor.CloudBuildHandle.Build_iOS_Handle

同样的,在Jenkins中,我们也可以使用类似的方法,在命令行启动Unity的时候启动对应的处理脚本。


注意:2019年10月7日,Bug修正:在TinaX 6.5.x的案例代码中,我们通过TinaX.Config.GetTinaXConfig(TinaX.Conf.ConfigPath.vfs) 这一行代码拿到TinaX VFS配置文件的对象。

这个写法之前是没问题的,但是在TinaX6.5.x中,我们拿到的这个配置文件是不完整的——它只有开发者自己的配置。而实际上TinaX内部也会有一个写死的配置文件,比如在我们使用Lua时,TinaX需要将自己内部的Lua代码一起打包。

而如果直接使用TinaX.Config.GetTinaXConfig(TinaX.Conf.ConfigPath.vfs) 传给XVFSPacker的话,XVFSPacker就只会对开发者定义的部分资源进行打包,而忽略了框架内部的资源,这样打出来的包就会缺失部分资源导致无法使用。

所以需要改成如下写法

TinaX.Config.GetTinaXConfig(TinaX.Conf.ConfigPath.vfs).GetPerfect();

后面多出来的.GetPerfect()是一个扩展方法,将框架内部定义的配置与开发者定义的配置合并之后,返回合并后的结果。

除了扩展方法之外,还有另一种写法:

using TinaX.VFSKit

var final_conf = VFSConfHelper.GetPerfectConfig(TinaX.Config.GetTinaXConfig(TinaX.Conf.ConfigPath.vfs));