zoukankan      html  css  js  c++  java
  • (转 )Unity对Lua的编辑器拓展

    转 http://blog.csdn.net/ZhangDi2017/article/details/61203505

    • 当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀为lua的文件,将lua文件导入到项目中后,其会被识别为类型为DefaultAsset的文件,即不被Unity原生支持。此外在编辑器模式下也无法直接创建lua文件,需要在文件夹中手动进行创建。经过一番探索,简单实现了在编辑器中创建lua文件和预览lua文件的功能。

      一.在编辑器下创建Lua文件

    • 打开Unity安装目录下的EditorDataResourcesScriptTemplates,可以看到如下文本:
    • 可以猜测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) + "...
    
    <...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尽快支持吧~

  • 相关阅读:
    云服务器迁移的那些事之一
    《编译原理》(第二版)第一章的学习笔记(一)
    vs 实用扩展
    SQL多的是,你不知道的事
    Entity Framework 批量插入 提速
    oracle 回收已删除的表
    发现一个奇怪的问题!
    看到易办网的希望...
    asp.net不认为数据库字段的空值为null
    什么是伪url?
  • 原文地址:https://www.cnblogs.com/kanekiken/p/7567775.html
Copyright © 2011-2022 走看看