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 ...
随机推荐
- [Windows Azure] Getting Started with Windows Azure SQL Data Sync
Getting Started with Windows Azure SQL Data Sync In this tutorial, you learn the fundamentals of Win ...
- iOS开发如何学习前端(1)
iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...
- iOS开发-应用管理
// // ViewController.m // 21-应用管理-1 // // Created by hongqiangli on 2017/8/2. // Copyright © 201 ...
- WebSocket通信协议 API简介
WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从ch ...
- js实现手机摇一摇
//手机摇一摇 ---------------------------------------------------------- init();var SHAKE_THRESHOLD = 3000 ...
- python.pandas read and write CSV file
#read and write csv of pandasimport pandas as pd goog =pd.read_csv(r'C:\python\demo\LiaoXueFeng\data ...
- java算法---五家共井
古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠, ...
- kafka0.10
整理kafka相关的常用命令创建主题(4个分区,2个副本)bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-f ...
- me909e-821 拨号流程
第一次: at+cereg=1 OK ...
- Android—— Animation动画(很详细)
链接: http://www.360doc.com/content/13/0102/22/6541311_257754535.shtml http://www.cnblogs.com/aimeng/a ...