[uLua]关于ulua打包到安卓后无法加载Global的简易解决方法



在这里我想吐槽ulua自己网站上的(非官方)回答,那根本不能叫回答,说什么熟悉打包的人都会知道,我只想说既然知道为何不顺便科普一下或者拿出解决方案。


下面开始唧唧歪歪,不像麻烦的直接看这里 

http://pan.baidu.com/s/1kTP9sTD   使用前记得先gen lua wrap file


实际上熟悉Unity的人确实会知道是怎么回事,但是就算知道解决起来不简单很方便。

这里说明一下原因和思路,简单来说Unity只会打包已经被引用的东西,然而ulua的脚步显然是没有被任何东西引用,你代码的路径看起来是引用了但是Unity还没有智能到那个程度,Unity的一个解决方案就是StreamingAssets目录,这个目录下的东西会无条件打包,想必这点大部分人也都知道了。但是如果放在这个目录ulua的LuaScriptMgr将无法识别,其实如果看过ulua 的SimpleFramework就会发现其实改下目录就好

在Util类里改

 public static string LuaPath(string name) {
        //修改为默认使用streamingAssetsPath,不管是编辑器还是真机都方便调试
        string path = Application.streamingAssetsPath;
        string lowerName = name.ToLower();
        if (lowerName.EndsWith(".lua")) {
            int index = name.LastIndexOf('.');
            name = name.Substring(0, index);
        }
        name = name.Replace('.', '/');
        return path + "/lua/" + name + ".lua";
    }

于是又引来新的问题就是需要自己拷脚本过去,为了自动一些我修改了bindwrap的代码


var targetPath = Application.streamingAssetsPath + "/lua";
        var uluaPath = Application.dataPath + "/ulua/lua";
        if (!Directory.Exists(targetPath)) {
            if(!Directory.Exists(Application.streamingAssetsPath))
                Directory.CreateDirectory(Application.streamingAssetsPath);
            FileUtil.CopyFileOrDirectory(uluaPath, targetPath);
        } else {
            FileUtil.ReplaceFile(uluaPath + "/system/wrap.lua", targetPath + "/System/Wrap.lua");
        }

具体添加地方自己从前面提供的链接下载去看,知道原理的不用说也知道添加在哪了

然后以上改造是不够的,当打包成apk,一样是无法加载,因为StreamingAssets会被打包成一个apk,而原版ulua都是用File进行读取,apk实际上是一个zip文件,所以读不到。所以有些方案是把脚本都打包成zip,然后再考到persistentDataPath目录解压后使用,看起来挺简单实际操作仍然麻烦,需要引入第三方zip库,需要实现解压或者直接zip读取,而我个人从简单实现的角度,直接使用的方法是用WWW读取StreamingAssets。

由于ulua通过实现一个Loader来读取文件,所以只需要修改这个Loader即可

        string lowerName = name.ToLower();
        if (lowerName.EndsWith(".lua")) {
            int index = name.LastIndexOf('.');
            name = name.Substring(0, index);
        }
        var path = Application.persistentDataPath + "/" + name+".lua";
        if (File.Exists(path)) {
            str = File.ReadAllBytes(path);
        } else {
            path = Util.LuaPath(name);
            if (path.Contains("://")) {//用于判断是否有打包
                var www = new WWW(path);
                while (!www.isDone) ;
                if (!string.IsNullOrEmpty(www.error))
                    UnityEngine.Debug.LogError("Loader:" + www.error);
                else
                    str = www.bytes;
            } else {

                if (File.Exists(path)) {
                    str = File.ReadAllBytes(path);
                }
            }
        }
这里可以做很多灵活性修改,但是出于不过度实现,我只实现了我需要的功能,我感觉应该足够了,就算你想玩出更多花样,简单修改一下就可以


总结一下

1 Unity的脚本打包问题,用StreamingAssets解决

2 StreamingAssets的读取问题,用www解决

3 ulua路径问题,修改Loader可以解决所有路径问题,可以自己实现各种路径的包含,或者使用lua内置的路径方案,也需要配合loader


另外我这个只是一种简陋解决办法,不喜勿槽,毕竟ulua官方估计也是觉得没有什么固定方案就交给了开发者,对于一些入门或者图快捷的开发者不算友好

猜你喜欢

转载自blog.csdn.net/fg5823820/article/details/50731578