ToLua集成:2 .lua的打包和调用

发表于2016-03-11
评论3 8.9k浏览

  为了热更新,最后的lua肯定是打包到assetbundle里的。但是开发阶段,每次修改lua都打包又过于繁琐。所以将区分editor模式和版本模式下lua的调用是有必要的。

  一开始本打算跟其他资源一样, .lua先全部放resource目录下,editor直接读取。编版本的时候从resource中提取打包。但是发现unity有一点很坑爹,TextAsset是认后缀的,所以XXX.lua是没法用Resource.Load的。 可以直接改后缀为.txt 或.bytes 等,也可以用.lua编写,编译的时候拷贝并自动加后缀.txt。 tolua自带的方案是后者。尝试者踩了不少坑。

踩坑1:

  尝试使用了tolua 中带的Lua -> Build bundle files no jit,  会报错,unity不认那一堆文件,无法打包。

  一开始以为是因为用的老的4.0打包api 

BuildPipeline.BuildAssetBundle

  导致的,于是改成了5.0的方式

for (int i = 0; i < files.Length; i++) 
string objPath = files[i]; 
var importer = AssetImporter.GetAtPath(objPath); 
importer.assetBundleName = bundleName; 
importer.assetBundleVariant = "unity3d"
importer.SaveAndReimport(); 
AssetBundleBuild bundleBuild; 
bundleBuild.assetBundleName = bundleName; 
bundleBuild.assetBundleVariant"unity3d"
bundleBuild.assetNames = files; bundleList.Add(bundleBuild);

  虽然改动是有必要的,但是问题依然没解决。查了一下午, 发现原因比较奇怪。

  自带工具是把所有.lua 的文件拷贝到streamingAssets下的lua文件夹,并加后缀.bytes,然后打包。 理论上.bytes应该是被认做textasset的,但是没认出来。 最后查.meta文件,发现,所有的 .bytes的.meta都是“DefaultImporter”...  但假如把lua文件都加后缀拷贝到其他目录,.meta文件会显示正确导入了文本 (为什么?没查到相关的说明啊)



  于是先把,.lua 改成.bytes 拷到其他的临时文件夹。 然后打包,就没问题了。

二、踩坑2:

  Unity里面所遇的assetBundleName 打包时自动转小写, window(fat等)下跑无所谓,但是 linux(android)(ext)下就有问题了。

  所以读取包时,包名要用小写。

  ToLua插件里面的LuaFileUtils.cs里的ReadZipFile和例子里的Lua都要改成lua

三、踩坑3. ab包读取

  www读取ab包的时候, android的path应该直接用streamingPath + str

  而window下路径要用"file:///" + streamingPath 

  当然,把ab包放在streamingPath下,只能算临时方案。实际游戏,一般是游戏第一次运行是将streaming下的包拷到persistent目录下, 然后通过网络更新。 不过这一步还没实践。

  问题未必全列出来了。不过tolua总算能在项目中使用了,Bundle的例子能跑过了,编译出的pc和手机版都能跑了。

  因为只用了tolua的插件版,没有用作者的luaframework的完整框架。所以下一步还要弄个简单框架。不知道能不能真的简单(希望最后不要又成个大框架)

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引