zoukankan      html  css  js  c++  java
  • 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

    个人博客请访问:http://www.cnblogs.com/CodeGize/
  • 相关阅读:
    C 语言
    How does Chrome Extension crx Downloader work? ——— From crxdown.com
    做作业时看到的 Demo
    IDEA 插件收集
    [E] Shiro 官方文档阅读笔记 The Reading Notes of Shiro's Offical Docs
    烦人的 Python 依赖
    机器学习之路--Numpy
    机器学习之路--朴素贝叶斯
    机器学习之路--决策树
    机器学习之路--KNN算法
  • 原文地址:https://www.cnblogs.com/CodeGize/p/10493278.html
Copyright © 2011-2022 走看看