Unity插件開發:使用ScriptedImporter優化Lua文件導入

        Lua做爲Unity首選的熱更新方式,如今基本上成了商業遊戲的標配(iOS的機制)。同時不得不說的是,使用Lua,能夠避開大型項目中長時間編譯的問題(其實這個問題在新版本的Unity中已經解決)。還有一個好處是,服務器能夠推送一段Lua代碼到客戶端,至關於作實時Patch,維護很是高效。可是又不得不提,Lua是一個坑,開發效率和遊戲運行性能都會受到必定的影響。因此使用者必定要在適當的環境下使用,莫要一律而全。html

lua20190307

       回到正題,這裏處於我的習慣,使用tolua#(簡稱tolua)。tolua打包lua代碼時有個流程,十分不友好。它會將.lua文件複製到temp文件夾下,並更名爲.byte文件,而後將這些.byte文件打包成AssetBundle。可是若是咱們開發了不少文件,就會在項目中生成大量的無用的.byte文件。究其緣由,是由於unity沒法識別.lua文件,因此沒法打包到Assetbundle中。git

       因此咱們要作的是藉助ScriptedImporter幫助Unity識別.lua文件。github

       ScriptedImporter是Unity2017.1引入的功能,使用它,咱們可讓Unity識別不少它沒法識別的文件,好比Excel(.xlsx)文件,自定義的一些後綴的文件。見《Unity插件開發:ScriptedImporter和AssetImporter》服務器

       根據上文中提到的形成tolua生成的緣由,咱們只要把.lua文件識別爲一個TextAsset就能解決問題,由於.byte文件自己就被Unity識別爲TextAsset。因此咱們能夠寫一個LuaImporter,繼承於ScriptedImporter,讀取文件的文本生成一個TextAsset做爲被識別的物體便可ide

       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文件的樣子lua

QQ截圖20190307223538

       經過LuaImporter以後Unity將.lua文件識別爲TextAsset,不只圖標變了,右側還顯示出了代碼。spa

QQ截圖20190307223705

       可是咱們看C#代碼的時候,細心的能夠看到是這樣的狀況插件

QQ截圖20190307223747

      那麼咱們是否也能實現的,答案是確定的。Unity提供ScriptedImporterEditor來繪製自定義Importer的Import面板展示。3d

[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

相關文章
相關標籤/搜索