您的位置:首页 > 移动开发 > Unity3D

Lua------------------改善Unity编辑器对Lua文件的支持

2017-10-31 18:49 369 查看

原创 2017年03月10日 18:44:22

标签:

Unity /

lua /

编辑器

952

当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀为lua的文件,将lua文件导入到项目中后,其会被识别为类型为DefaultAsset的文件,即不被Unity原生支持。此外在编辑器模式下也无法直接创建lua文件,需要在文件夹中手动进行创建。经过一番探索,简单实现了在编辑器中创建lua文件和预览lua文件的功能。

一.在编辑器下创建Lua文件

打开Unity安装目录下的Editor\Data\Resources\ScriptTemplates,可以看到如下文本:



可以猜测Unity在启动时会根据这里的文件构建编辑器里的菜单(这一点可以反编译UnityEditor.dll进行验证):

仿造标题格式添加一个87-Lua Script-NewLuaScript.lua.txt的文件,文件内容可随意,其中#SCRIPTNAME#会被替换为创建时输入的名字。重启Unity,可以发现在创建菜单里已经有了这个Lua Script:



点击创建后会走创建脚本一样的流程:



这样就能在项目中正常的创建Lua文件了。

二.在编辑器下预览Lua文件

由于lua文件会被识别为DefaultAsset,我们可以通过重写DefaultAsset的Inspector面板来实现预览,这里直接抄了一下TextAssetInspector的代码(反编译UnityEditor.dll获 得):

[csharp] view plain copy

using UnityEngine;

using UnityEditor;

using System.IO;

[CanEditMultipleObjects, CustomEditor(typeof(DefaultAsset))]

public class LuaInspector : Editor

{

private GUIStyle m_TextStyle;

public override void OnInspectorGUI()

{

if (this.m_TextStyle == null)

{

this.m_TextStyle = "ScriptText";

}

bool enabled = GUI.enabled;

GUI.enabled = true;

string assetPath = AssetDatabase.GetAssetPath(target);

if (assetPath.EndsWith(".lua"))

{

string luaFile = File.ReadAllText(assetPath);

string text;

if (base.targets.Length > 1)

{

text = Path.GetFileName(assetPath);

}

else

{

text = luaFile;

if (text.Length > 7000)

{

text = text.Substring(0, 7000) + "...\n\n<...etc...>";

}

}

Rect rect = GUILayoutUtility.GetRect(new GUIContent(text), this.m_TextStyle);

rect.x = 0f;

rect.y -= 3f;

rect.width = EditorGUIUtility.currentViewWidth + 1f;

GUI.Box(rect, text, this.m_TextStyle);

}

GUI.enabled = enabled;

}

}

效果如下,超过7000字部分或被省略(见上述代码),其实这里也可以直接做成TextBox的形式,即时编辑等等......



三.实现Inspector面板的拖拽功能

其实读取lua文件时,我们一般直接使用相关的IO操作API,如果要实现编辑器面板上的拖拽,代码就比较丑陋,这里尝试进行了一次封装,使得拖拽支持DefaultAsset和TextAsset:

[csharp] view plain copy

using UnityEngine;

using UnityEditor;

using System.IO;

[System.Serializable]

public class SGTextAsset

{

public Object textAsset;

private string text = string.Empty;

private TextAsset asset = null;

public string Text

{

get

{

if (textAsset is DefaultAsset)

{

if (string.IsNullOrEmpty(text))

{

text = File.ReadAllText(AssetDatabase.GetAssetPath(textAsset));

}

return text;

}

else if (textAsset is TextAsset)

{

if (asset == null)

{

asset = textAsset as TextAsset;

}

return asset.text;

}

else

{

return null;

}

}

}

}

最终效果如下:



其实在真实的项目中,一般使用Assetbundle进行更新,一般将lua文件后缀改为txt来生成TextAsset对象,进而被打包成AssetBundle。某些平台不支持直接使用IO相关的API直接访问SteamingAssets(如Android),只能使用www,而www只能加载Unity原生支持的对象,这时候如果不更改lua的后缀,就无法被正确的加载了。好消息是,Unity官网上有很多开发者都在请求TextAsset支持lua文件,希望Unity尽快支持吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: