原创 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. [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 ...

  2. iOS开发如何学习前端(1)

    iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...

  3. iOS开发-应用管理

    // //  ViewController.m //  21-应用管理-1 // //  Created by hongqiangli on 2017/8/2. //  Copyright © 201 ...

  4. WebSocket通信协议 API简介

    WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如 Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从ch ...

  5. js实现手机摇一摇

    //手机摇一摇 ---------------------------------------------------------- init();var SHAKE_THRESHOLD = 3000 ...

  6. 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 ...

  7. java算法---五家共井

    古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠, ...

  8. kafka0.10

    整理kafka相关的常用命令创建主题(4个分区,2个副本)bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-f ...

  9. me909e-821 拨号流程

    第一次: at+cereg=1                                                                      OK              ...

  10. Android—— Animation动画(很详细)

    链接: http://www.360doc.com/content/13/0102/22/6541311_257754535.shtml http://www.cnblogs.com/aimeng/a ...