(转 )Unity对Lua的编辑器拓展
转 http://blog.csdn.net/ZhangDi2017/article/details/61203505
- 当前版本的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获 得):
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 > )
{
text = Path.GetFileName(assetPath);
}
else
{
text = luaFile;
if (text.Length > )
{
text = text.Substring(, ) + "...\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:
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编辑器拓展
		
[ExecutelnEditMode] 在EditMode下也可以执行脚本,Unity默认情况下,脚本只有运行时被执行,加上此属性后,不运行程序也能执行.与PlayMode不同的是函数不会不停 ...
 - tolua#是Unity静态绑定lua的一个解决方案
		
tolua#代码简要分析 2017-04-16 23:02 by 风恋残雪, 98 阅读, 1 评论, 收藏, 编辑 简介 tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信 ...
 - 图形验证插件,百度编辑器拓展功能,NodeJs消息机制以及聊天室
		
图形验证插件 网上找了很多图形验证插件,比较推荐verify.js <link rel="stylesheet" type="text/css" href ...
 - 修改Unity中Lua文件的默认打开程序
		
项目中引用了XLua,而Lua文件又是以txt文件结尾的,当修改系统的扩展脚本编辑器为vs后双击lua文件(xx.txt)默认也使用vs打开了,无提示的黑白文本编辑 昨办? -. 后来看到网上有写Un ...
 - 整理Lua和Unity和Lua交互文章链接
		
重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4. ...
 - Unity、c#中的拓展方法讲解
		
很早以前看过这个东西,但是没有真正的用到过,希望之后会用到上面的方法, 大概的意思是这样的c#中尤其在用Unity的时候,已有的框架提供给我们一些固定的方法,但是有时我们想对这些方法进行修改, 这时我 ...
 - ZeroBrane Lua脚本编辑器代码自动补全
		
简介 ZeroBrane Studio是一款支持代码提示.语法高亮.远程调试.代码分析.调试等功能的轻量级Lua IDE工具.可以去官网studio.zerobrane.com进行下载 ...
 - Unity进阶----Lua语言知识点(2018/11/08)
		
国内开发: 敏捷开发: 集中精力加班堆出来第一个版本 基本没啥大的bug 国外开发: 1).需求分析: 2).讨论 3).分模块 4).框架 5).画UML图(类图class function)(e- ...
 - [Unity插件]Lua行为树(一):BehaviorDesigner源码分析
		
BehaviorDesigner是Unity上的一款行为树插件,不过这个插件是用C#编写的,编写出来的行为树也是依赖于C#的,不利于热更,所以有必要写一个lua版本的. 首先下载BehaviorDes ...
 
随机推荐
- CH 5302 金字塔(区间DP)
			
CH 5302 金字塔 \(solution:\) 很神奇的一道题目,当时看到还以为是一道字符串求回文子串的题目.但是数据范围很小,而且只知道回文串也不好做.但是我们观察可得,如果是深度搜索便利,那么 ...
 - 做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)
			
代码: #include <stdio.h> #include <string.h> #include <string> #include <vector&g ...
 - ios蓝牙开发(四)BabyBluetooth蓝牙库介绍
			
BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你 ...
 - JRE System Library 与Java EE Libraries的区别
			
JRE System Library是只要做java开发都需要的完整的.标准的库. Java EE5 Libraries只是java三个方向中做java EE所需要的库.如果做Web方面的开发的话就 ...
 - 【转载】浅谈Excel开发:一 Excel 开发概述
			
博客园就是好,想要什么都给总结了,多谢 原文转载:http://www.cnblogs.com/yangecnu/p/Excel-Develpment-Introduction.html 做Offic ...
 - 【矩阵---求A的1到N次幂之和】
			
引例: Matrix Power Series: 题目大意,给定矩阵A,求A^+A^+A^+...A^N. 题解:已知X=a,可以通过以下矩阵求出ans=a^+a^+...a^=矩阵^(n+)后右上格 ...
 - 【204】显示3D大球球
			
1. 光滑球 From Jan 28, 2016 2. 大球球 https://www.revolvermaps.com/?target=enlarge&i=0xoqkxnu52c&a ...
 - 清理c盘的文件
			
C:/Users/用户名/AppData里面默认有三个文件夹,分别是Local,LocalLow,Roaming,简单地来说,都是用来存放软件的配置文件和临时文件的,里面有很多以软件公司或者软件名称命 ...
 - 任务12:Bind读取配置到C#实例
			
将json文件的配置转换成C#的实体 新建项目: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definition ...
 - 用ffmpeg命令将264裸码流封装成mp4(转载)
			
转自:http://bbs.csdn.net/topics/370256130 ffmpeg -f h264 -i source.264 -vcodec copy out.mp4