zoukankan      html  css  js  c++  java
  • 热更新工具--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生成的脚本,在迁移完成后重新生成代码。

  • 相关阅读:
    Http方法:Get请求与Post请求的区别
    udev和rules使用规则
    c++中的动态内存分配
    c++中重载运算符
    c++中静态成员函数
    c++中值传递,址传递,引用传递
    c++中实现单例模式singleton class
    [Windows篇] 在windows 10上源码编译gtest 并编写CMakeLists.txt
    [Ubuntu篇] 在ubuntu上源码编译gtest,编写gtest-config.cmake并测试
    使用boost data_time模块来获取毫秒级时间并转换为string字符串
  • 原文地址:https://www.cnblogs.com/movin2333/p/14638335.html
Copyright © 2011-2022 走看看