热更新工具--lua文件迁移脚本学习笔记

一.简介

  在Unity中,使用AssetBundle Browser打包时,这个工具无法识别.lua后缀的文件,lua代码无法直接打包。我们可以为lua文件添加上后缀.txt以修改lua文件格式的方式解决这个问题,文件内容不会修改。但是对于一个项目,lua文件非常多,这时显然一个一个修改太过于麻烦,因此这个脚本让我们可以在Unity中一键复制所有的lua文件到一个新文件夹中,并将这些lua文件添加到名称为lua的AB包中,迁移后直接使用AssetBundle Browser打包即可。

二.代码:

public class LuaCopyEditor : Editor
{        
    //lua文件路径
    private static string luaPath = Application.dataPath + "/Lua/";
    //存储的txt文件路径
    private static string txtPath = Application.dataPath + "/LuaTxt/";


    [MenuItem("XLua//Copy lua to txt file")]
    public static void CopyLuaToTxtFile(){

        //校验新路径文件是否存在
        if(!Directory.Exists(txtPath))
        //不存在创建
            Directory.CreateDirectory(txtPath);
        else{
            //存在清空文件夹
            string[] oldFiles = Directory.GetFiles(txtPath);
            for(int i = 0;i < oldFiles.Length;i ++)
                File.Delete(oldFiles[i]);
        }
        //调用根据地址复制并打包的方法
        CopyLuaToTxtFile(luaPath);

        //刷新Unity
        AssetDatabase.Refresh();

        //修改AB包打包
        string[] txtFilePaths = Directory.GetFiles(txtPath);
        for(int i = 0;i < txtFilePaths.Length;i ++){
            AssetImporter importer = AssetImporter.GetAtPath(txtFilePaths[i].Substring(txtFilePaths[i].IndexOf("Assets")));
            if(importer != null)
                importer.assetBundleName = "lua";
        }
    }

    /// <summary>
    /// 根据地址复制lua文件的方法
    /// </summary>
    /// <param name="path"></param>
    private static void CopyLuaToTxtFile(string path){
        //校验路径是否存在
        if(!Directory.Exists(path))
            return;

        //找一找当前文件夹中是否还有文件夹,有的话递归
        string[] directories = Directory.GetDirectories(path);
        if(directories.Length > 0){
            for(int i = 0;i < directories.Length;i ++){
                CopyLuaToTxtFile(directories[i]);
            }
        }

        //得到每个lua文件路径
        string[] luaFiles = Directory.GetFiles(path,"*.lua");

        //遍历拷贝
        string tempPath = "";
        if(luaFiles.Length > 0)
            for(int i = 0;i < luaFiles.Length;i++){
                //先遍历修改以下路径名,GetFiles得到的路径是拼接的,有的/有的\
                StringBuilder builder = new StringBuilder(luaFiles[i]);
                for (int j = 0;j < builder.Length;j ++)
                    if(builder[j].Equals('\\'))
                        builder[j] = '/';
                string correctPath = builder.ToString();
                //得到新路径
                tempPath = txtPath + correctPath.Substring(correctPath.LastIndexOf("/")+1) + ".txt";
                File.Copy(correctPath,tempPath);
            }
    }
}

 

三.注意事项

  这个脚本在运行时如果xlua生成的代码没有清空会报错,记得清除所有xlua生成的脚本,在迁移完成后重新生成代码。

posted @ 2021-04-09 18:18  movin2333  阅读(374)  评论(0编辑  收藏  举报