在这里我想吐槽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官方估计也是觉得没有什么固定方案就交给了开发者,对于一些入门或者图快捷的开发者不算友好