在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Lua作为Unity首选的热更新方式,现在基本上成了商业游戏的标配(iOS的机制)。同时不得不说的是,使用Lua,可以避开大型项目中长时间编译的问题(其实这个问题在新版本的Unity中已经解决)。还有一个好处是,服务器可以推送一段Lua代码到客户端,相当于做实时Patch,维护非常高效。但是又不得不提,Lua是一个坑,开发效率和游戏运行性能都会受到一定的影响。所以使用者一定要在适当的环境下使用,莫要一概而全。 回到正题,这里处于个人习惯,使用tolua#(简称tolua)。tolua打包lua代码时有个流程,十分不友好。它会将.lua文件复制到temp文件夹下,并改名为.byte文件,然后将这些.byte文件打包成AssetBundle。但是如果我们开发了很多文件,就会在项目中生成大量的无用的.byte文件。究其原因,是因为unity无法识别.lua文件,所以无法打包到Assetbundle中。 所以我们要做的是借助ScriptedImporter帮助Unity识别.lua文件。 ScriptedImporter是Unity2017.1引入的功能,使用它,我们可以让Unity识别很多它无法识别的文件,比如Excel(.xlsx)文件,自定义的一些后缀的文件。见《Unity插件开发:ScriptedImporter和AssetImporter》 根据上文中提到的造成tolua生成的原因,我们只要把.lua文件识别为一个TextAsset就能解决问题,因为.byte文件本身就被Unity识别为TextAsset。所以我们可以写一个LuaImporter,继承于ScriptedImporter,读取文件的文本生成一个TextAsset作为被识别的物体即可 LuaImporter.cs using System.IO; using UnityEditor; using UnityEditor.Experimental.AssetImporters; using UnityEngine; [ScriptedImporter(1, "lua")] public class LuaImporter : ScriptedImporter { public override void OnImportAsset(AssetImportContext ctx) { var text = File.ReadAllText(ctx.assetPath); var asset = new TextAsset(text); ctx.AddObjectToAsset("main obj", asset); ctx.SetMainObject(asset); } } 将LuaImporter.cs放在工程的Editor文件夹下,编译完成后,项目会自动重新导入所有的.lua文件。通过下图我们可以看到无法识别.lua文件的样子 通过LuaImporter之后Unity将.lua文件识别为TextAsset,不仅图标变了,右侧还显示出了代码。 但是我们看C#代码的时候,细心的可以看到是这样的情况 那么我们是否也能实现的,答案是肯定的。Unity提供ScriptedImporterEditor来绘制自定义Importer的Import面板展现。 [CustomEditor(typeof(LuaImporter))] public class LuaImporterEditor : ScriptedImporterEditor { public override void OnInspectorGUI() { } } 其本质还是一个Editor,所以也可以按照自己的需求自定义Import面板。这里什么都不写,就是什么都不要。所以结果如下图所示 OK至此就完成了.lua的识别工作。 至于打包的方法就很简单了,直接打包这些.lua文件即可。 如果你项目中有那些需要识别但是Unity无法识别的文件的话,使用ScriptedImporter吧。 参考文档 https://docs.unity3d.com/Manual/ScriptedImporters.html https://docs.unity3d.com/ScriptReference/Experimental.AssetImporters.ScriptedImporter.html https://docs.unity3d.com/ScriptReference/Experimental.AssetImporters.ScriptedImporterEditor.html tolua#开源库 https://github.com/topameng/tolua |
请发表评论