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

  • 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获    得):

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.IO;
  4. [CanEditMultipleObjects, CustomEditor(typeof(DefaultAsset))]
  5. public class LuaInspector : Editor
  6. {
  7. private GUIStyle m_TextStyle;
  8. public override void OnInspectorGUI()
  9. {
  10. if (this.m_TextStyle == null)
  11. {
  12. this.m_TextStyle = "ScriptText";
  13. }
  14. bool enabled = GUI.enabled;
  15. GUI.enabled = true;
  16. string assetPath = AssetDatabase.GetAssetPath(target);
  17. if (assetPath.EndsWith(".lua"))
  18. {
  19. string luaFile = File.ReadAllText(assetPath);
  20. string text;
  21. if (base.targets.Length > 1)
  22. {
  23. text = Path.GetFileName(assetPath);
  24. }
  25. else
  26. {
  27. text = luaFile;
  28. if (text.Length > 7000)
  29. {
  30. text = text.Substring(0, 7000) + "...\n\n<...etc...>";
  31. }
  32. }
  33. Rect rect = GUILayoutUtility.GetRect(new GUIContent(text), this.m_TextStyle);
  34. rect.x = 0f;
  35. rect.y -= 3f;
  36. rect.width = EditorGUIUtility.currentViewWidth + 1f;
  37. GUI.Box(rect, text, this.m_TextStyle);
  38. }
  39. GUI.enabled = enabled;
  40. }
  41. }

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

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

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

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.IO;
  4. [System.Serializable]
  5. public class SGTextAsset
  6. {
  7. public Object textAsset;
  8. private string text = string.Empty;
  9. private TextAsset asset = null;
  10. public string Text
  11. {
  12. get
  13. {
  14. if (textAsset is DefaultAsset)
  15. {
  16. if (string.IsNullOrEmpty(text))
  17. {
  18. text = File.ReadAllText(AssetDatabase.GetAssetPath(textAsset));
  19. }
  20. return text;
  21. }
  22. else if (textAsset is TextAsset)
  23. {
  24. if (asset == null)
  25. {
  26. asset = textAsset as TextAsset;
  27. }
  28. return asset.text;
  29. }
  30. else
  31. {
  32. return null;
  33. }
  34. }
  35. }
  36. }

最终效果如下:

其实在真实的项目中,一般使用Assetbundle进行更新,一般将lua文件后缀改为txt来生成TextAsset对象,进而被打包成AssetBundle。某些平台不支持直接使用IO相关的API直接访问SteamingAssets(如Android),只能使用www,而www只能加载Unity原生支持的对象,这时候如果不更改lua的后缀,就无法被正确的加载了。好消息是,Unity官网上有很多开发者都在请求TextAsset支持lua文件,希望Unity尽快支持吧~

Lua------------------改善Unity编辑器对Lua文件的支持的更多相关文章

  1. 整理Lua和Unity和Lua交互文章链接

    重点文章: 1.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 2.[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中) 3.Lua和C++交互详细总结 4. ...

  2. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

  3. 在Unity中使用Lua脚本

    前言:为什么要用Lua首先要说,所有编程语言里面,我最喜欢的还是C#,VisualStudio+C#,只能说太舒服了.所以说,为什么非要在unity里面用Lua呢?可能主要是闲的蛋疼.....另外还有 ...

  4. unity发布安卓lua路径不存在问题

    项目用的是xlua 采用自定义加载方式 使用File去读取路径下的文件,lua文件本来放在了StreamingAssets路径下 PC运行无问题,发布安卓后,居然提示路径不存在. 查了下资料后发现,F ...

  5. Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...

  6. Lua学习笔记9:多文件

    一 终端中运行多个文件:-l 增加在文件一中定义了一个变量,在还有一文件里输出这个变量.代码例如以下: --file1.lua num = 100 --file2.lua print(num) 终端输 ...

  7. 用好lua+unity,让性能飞起来——关于《Unity项目常见Lua解决方案性能比较》的一些补充

    <Unity项目常见Lua解决方案性能比较>,这篇文章对比了现在主流几个lua+unity的方案 http://blog.uwa4d.com/archives/lua_perf.html ...

  8. ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用

    前言 这节说一下多个文件调用 多个文件之间变量调用 准备两个文件 init.lua other.lua 开始 模块默认一开始调用的是init.lua 咱让init.lua调用 other.lua 很简 ...

  9. flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

    1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...

随机推荐

  1. ubuntu 16.04 root 初始密码设置

    ()默认root密码是随机的,即每次开机都有一个新的root密码.我们可以在终端输命令 sudo passwd,然后输入当前用户的密码,enter ()终端会提示我们输入新的密码并确认,此时的密码就是 ...

  2. std::bind技术内幕

    引子 最近群里比较热闹,大家都在山寨c++11的std::bind,三位童孩分别实现了自己的bind,代码分别在这里: 木头云的实现 mr.li的实现 null的实现,null的另一个版本的实现 这些 ...

  3. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  4. Android环境搭建问题的解决: Connection to http://dl-ssl.google.com refused

    第一次搭建Android环境,遇到这个问题: Fetching http://dl-ssl.google.com/android/repository/addons_list-1.xmlFailed  ...

  5. 读取本地已有的.db数据库

    public class MyDB extends SQLiteOpenHelper { // 数据库的缺省路径 private static String DB_PATH ; private sta ...

  6. 【机器学习】粗糙集(Rough Set Approach)

    粗糙集理论是一种研究不精确,不确定性知识的数学工具. 粗糙集理论的知识表达方式一般采用信息表或称为信息系统的形式,它可以表现为四元有序组K=(U,A,V,P).其中U为对象的全体,即论域:A是属性全体 ...

  7. 第22章 RTX 低功耗之停机模式

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 停机模式介绍 本章节我们主要讲解停机模式,停机模式是在 Cortex™-M3 的深睡 ...

  8. 秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现

    Reference:  http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...

  9. 3. DNN神经网络的正则化

    1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考 ...

  10. [转]oracle存储过程中update不成功的一个原因

    原文地址:http://lin49940.iteye.com/blog/466626 今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会 ...