07
2019
03

Unity插件开发:使用ScriptedImporter优化Lua文件导入

        Lua作为Unity首选的热更新方式,现在基本上成了商业游戏的标配(iOS的机制)。同时不得不说的是,使用Lua,可以避开大型项目中长时间编译的问题(其实这个问题在新版本的Unity中已经解决)。还有一个好处是,服务器可以推送一段Lua代码到客户端,相当于做实时Patch,维护非常高效。但是又不得不提,Lua是一个坑,开发效率和游戏运行性能都会受到一定的影响。所以使用者一定要在适当的环境下使用,莫要一概而全。

lua20190307

       回到正题,这里处于个人习惯,使用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文件的样子

QQ截图20190307223538

       通过LuaImporter之后Unity将.lua文件识别为TextAsset,不仅图标变了,右侧还显示出了代码。

QQ截图20190307223705

       但是我们看C#代码的时候,细心的可以看到是这样的情况

QQ截图20190307223747

      那么我们是否也能实现的,答案是肯定的。Unity提供ScriptedImporterEditor来绘制自定义Importer的Import面板展现。

[CustomEditor(typeof(LuaImporter))]
public class LuaImporterEditor : ScriptedImporterEditor
{
    public override void OnInspectorGUI()
    {
    }
}


       其本质还是一个Editor,所以也可以按照自己的需求自定义Import面板。这里什么都不写,就是什么都不要。所以结果如下图所示

QQ截图20190307223857

       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

« 上一篇下一篇 »