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
{
    /// <summary>
    /// 云编译系统处理
    /// </summary>
    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<VFSConfigModel>(TinaX.Conf.ConfigPath.vfs).GetPerfect();

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

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

using TinaX.VFSKit

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

yomunsam

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

推荐ヾ(•ω•`)o