Lua------------------改善Unity编辑器对Lua文件的支持
原创 2017年03月10日 18:44:22
- 当前版本的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 > 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:
- 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尽快支持吧~
Lua------------------改善Unity编辑器对Lua文件的支持的更多相关文章
- 整理Lua和Unity和Lua交互文章链接
重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4. ...
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- 在Unity中使用Lua脚本
前言:为什么要用Lua首先要说,所有编程语言里面,我最喜欢的还是C#,VisualStudio+C#,只能说太舒服了.所以说,为什么非要在unity里面用Lua呢?可能主要是闲的蛋疼.....另外还有 ...
- unity发布安卓lua路径不存在问题
项目用的是xlua 采用自定义加载方式 使用File去读取路径下的文件,lua文件本来放在了StreamingAssets路径下 PC运行无问题,发布安卓后,居然提示路径不存在. 查了下资料后发现,F ...
- Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...
- Lua学习笔记9:多文件
一 终端中运行多个文件:-l 增加在文件一中定义了一个变量,在还有一文件里输出这个变量.代码例如以下: --file1.lua num = 100 --file2.lua print(num) 终端输 ...
- 用好lua+unity,让性能飞起来——关于《Unity项目常见Lua解决方案性能比较》的一些补充
<Unity项目常见Lua解决方案性能比较>,这篇文章对比了现在主流几个lua+unity的方案 http://blog.uwa4d.com/archives/lua_perf.html ...
- ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用
前言 这节说一下多个文件调用 多个文件之间变量调用 准备两个文件 init.lua other.lua 开始 模块默认一开始调用的是init.lua 咱让init.lua调用 other.lua 很简 ...
- flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去
1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...
随机推荐
- Linux系统磁盘满解决方案
1.查看磁盘使用率 df -lh 执行结果: 2.定位最大文件目录 du -h --max-depth=1 执行结果: 3.定位最大文件 ls -lhS 执行结果: 4.备注 配合du -h --ma ...
- 【ActiveMQ】Spring Jms集成ActiveMQ学习记录
Spring Jms集成ActiveMQ学习记录. 引入依赖包 无论生产者还是消费者均引入这些包: <properties> <spring.version>3.0.5.REL ...
- zoj 月赛B题(快速判断一个大数是否为素数)
给出一个64位的大数,如何快速判断其是否为素数 #include<algorithm> #include<cstdio> #include<cstring> #in ...
- 浅析notifyDataSetChanged内部工作流程
Reference: http://blog.csdn.net/hp910315/article/details/47174531 首先我们知道notifyDataSetChanged是Adater的 ...
- [转]mysql update case when和where之间的注意事项
原文地址:http://www.cnblogs.com/rwxwsblog/p/4512061.html 在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THE ...
- MYSQL优化9大法!
通常网站的性能瓶颈在数据库查询,如果你希望你的网站在一定阶段之内保持稳定,优化你的SQL和数据库是非常必要的一个优化环节.优化数据库是一个很大的话题,这里只是摘要一些比较关键的优化参考建议,并且需要具 ...
- 【C#】多线程解决UI界面卡死的问题
一个经典的例子: http://www.cnblogs.com/wangchuang/p/4485797.html 问题: 都说Invoke是同步的,BeginInvoke是异步的,但为何用Begin ...
- Winform仿制QQ微信聊天窗口气泡
因为公司业务原因,不能上传原始项目,这是简化版本. 临时设计的窗体和气泡样式,有需要可以重新设计.效果如下: 主要原理:一个TextBlock + 一个三角形 项目结构: -- Form1 窗体类 - ...
- JTree常用方法
private JTree jtNetDevice;//数组件申明private JScrollPane jspTree;//滚动面板申明 1.初始化 DefaultMutableTreeNo ...
- Java编程的逻辑 (48) - 剖析ArrayDeque
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...