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尽快支持吧~
相关文章推荐
- 改善Unity编辑器对Lua文件的支持
- Unity编辑器对Lua文件的支持
- lua------------------Unity3D研究院编辑器之打开unity不可识别的文件(十三)
- UnityProject面板中右键创建新的Lua脚本以及修改文件默认打开方式的编辑器
- Unity 3D - 编辑器扩展之创建lua文件模版
- 使编辑器CuteEditor支持按上传文件的时间排序上传文件
- 修改Unity中Lua文件的默认打开程序
- [Unity编辑器]通过拖拽获取文件路径
- 在Unity.ulua环境下如何生成lua的protobuf文件
- 让VS2005编辑器支持着色器语法高亮 (其他高亮如lua脚本同理)
- ckeditor编辑器插件- “插入音乐(支持显示歌词)”、“插入HTML代码”、“插入文件图标
- 文件编码、charset、sublime编辑器支持GBK等问题
- UnityWebRequest下载网络资源,支持断点续传、多文件同时下载
- Unity JSON文件的写入(序列化)与读取(反序列化)、以及自定义JSON编辑器
- Unity Project面板右键菜单创建lua文件
- 让ATOM编辑器的EMMET插件支持VUE文件的方法
- Unity 3D - 编辑器扩展之导入文件自动设置Packing Tag
- komodo编辑器go语言支持文件
- Unity支持的模型文件
- Unity LZMA GZIP 压缩、解压文件 和 打包文件夹 (支持进度回调)