Lua IDE - IntelliJ IDEA+EmmyLua插件(2)

简介: Lua IDE - IntelliJ IDEA+EmmyLua插件

Unity API代码提示


现在Unity API代码提示是没有的,因为我们还没导入API描述的library。这个library根据你选择的Lua中间件不同而不同,所以建议是自己导出。我的Lua中间件是SLua。这里以SLua为例。

1.打开SLua官方自带的Unity项目,在Slua-Editor下面,新建一个SLuaApiExporter.cs脚本:

2.输入如下代码:

using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEditor;
using SLua;
using System.IO;
using UnityEngine;
namespace Slua
{
    public static class EmmyLuaApiExporter
    {
        [MenuItem("SLua/导出EmmyLuaApi", false, 14)]
        static void Gen()
        {
            string path = "./EmmyApi/";
            if (Directory.Exists(path))
            {
                Directory.Delete(path, true);
            }
            Directory.CreateDirectory(path);
            //UnityEngine
            GenAssembly("UnityEngine", path);
            //GenAssembly("UnityEngine.UI", path);
            GenCustom(path);
        }
        public static void GenAssembly(string name, string path)
        {
            List<string> excludeList;
            List<string> includeList;
            CustomExport.OnGetNoUseList(out excludeList);
            CustomExport.OnGetUseList(out includeList);
            Type[] types = Assembly.Load(name).GetTypes();
            foreach (Type t in types)
            {
                if (LuaCodeGen.filterType(t, excludeList, includeList))
                {
                    GenType(t, false, path);
                }
            }
        }
        public static void GenCustom(string path)
        {
            Type[] types = Assembly.Load("Assembly-CSharp-firstpass").GetTypes();
            foreach (Type t in types)
            {
                if (t.IsDefined(typeof(CustomLuaClassAttribute), false))
                {
                    GenType(t, true, path);
                }
            }
            types = Assembly.Load("Assembly-CSharp").GetTypes();
            foreach (Type t in types)
            {
                if (t.IsDefined(typeof(CustomLuaClassAttribute), false))
                {
                    GenType(t, true, path);
                }
            }
        }
        public static void GenType(Type t, bool custom, string path)
        {
            if (!CheckType(t, custom))
                return;
            //TODO System.MulticastDelegate
            var sb = new StringBuilder();
            if (!CheckType(t.BaseType, custom))
                sb.AppendFormat("---@class {0}\n", t.Name);
            else
                sb.AppendFormat("---@class {0} : {1}\n", t.Name, t.BaseType.Name);
            GenTypeField(t, sb);
            sb.AppendFormat("local {0}={{ }}\n", t.Name);
            GenTypeMehod(t, sb);
            sb.AppendFormat("{0}.{1} = {2}", t.Namespace, t.Name, t.Name);
            File.WriteAllText(path + t.FullName + ".lua", sb.ToString(), Encoding.UTF8);
        }
        static bool CheckType(Type t, bool custom)
        {
            if (t == null)
                return false;
            if (t == typeof(System.Object))
                return false;
            if (t.IsGenericTypeDefinition)
                return false;
            if (t.IsDefined(typeof(ObsoleteAttribute), false))
                return false;
            if (t == typeof(YieldInstruction))
                return false;
            if (t == typeof(Coroutine))
                return false;
            if (t.IsNested)
                return false;
            if (custom && !t.IsDefined(typeof(CustomLuaClassAttribute), false))
                return false;
            return true;
        }
        public static void GenTypeField(Type t, StringBuilder sb)
        {
            FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach(var field in fields)
            {
                if (field.IsDefined(typeof(DoNotToLuaAttribute), false))
                    continue;
                sb.AppendFormat("---@field public {0} {1}\n", field.Name, GetLuaType(field.FieldType));
            }
            PropertyInfo[] properties = t.GetProperties(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach (var pro in properties)
            {
                if (pro.IsDefined(typeof(DoNotToLuaAttribute), false))
                    continue;
                sb.AppendFormat("---@field public {0} {1}\n", pro.Name, GetLuaType(pro.PropertyType));
            }
        }
        public static void GenTypeMehod(Type t, StringBuilder sb)
        {
            MethodInfo[] methods = t.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            foreach (var method in methods)
            {
                if (method.IsGenericMethod)
                    continue;
                if (method.IsDefined(typeof(DoNotToLuaAttribute), false))
                    continue;
                if(method.Name.StartsWith("get_") || method.Name.StartsWith("set_"))
                    continue;
                sb.AppendLine("---@public");
                var paramstr = new StringBuilder();
                foreach (var param in method.GetParameters())
                {
                    sb.AppendFormat("---@param {0} {1}\n", param.Name, GetLuaType(param.ParameterType));
                    if (paramstr.Length != 0)
                    {
                        paramstr.Append(", ");
                    }
                    paramstr.Append(param.Name);
                }
                sb.AppendFormat("---@return {0}\n", method.ReturnType == null ? "void" : GetLuaType(method.ReturnType));
                if( method.IsStatic)
                {
                    sb.AppendFormat("function {0}.{1}({2}) end\n", t.Name, method.Name, paramstr);
                }
                else
                {
                    sb.AppendFormat("function {0}:{1}({2}) end\n", t.Name, method.Name, paramstr);
                }
            }
        }
        static string GetLuaType(Type t)
        {
            if (t.IsEnum
                //|| t == typeof(ulong)
                //|| t == typeof(long)
                //|| t == typeof(int)
                //|| t == typeof(uint)
                //|| t == typeof(float)
                || t == typeof(double)
                //|| t == typeof(byte)
                //|| t == typeof(ushort)
                //|| t == typeof(short)
                )
                return "number";
            if (t == typeof(bool))
                return "bool";
            if (t == typeof(string))
                return "string";
            if (t == typeof(void))
                return "void";
            return t.Name;
        }
    }
}

3.在Unity编辑器中点击SLua-导出EmmyLuaApi


image.png

4.看到Unity工程项目会多出一个EmmyApi文件夹

5.将其打包成zip文件(注意不能是rar、7z其它压缩格式!)

image.png


6.在IDEA中点击File-Project Structure,Modules-选择我们的Modules-Dependencies,+号-Library-Lua Zip Library,选择我们刚才打包的zip文件。然后一直OK保存就行了。


image.png



7.测试Unity API提示功能:

image.png


成功!


其它功能


代码跳转:

image.png


智能重命名:

image.png


后续


本教程就到这里结束了,但是该插件还有许多有用的功能,可以自行探索,也可以加入EmmyLua的官方QQ群:29850775。群里面有许多教程,本文所用的API导出代码也是从群文件里拿出来改的。


github: https://github.com/tangzx/IntelliJ-EmmyLua

oschina: http://git.oschina.net/tangzx/IntelliJ-Lua

IDEA Plugins : https://plugins.jetbrains.com/plugin/9768-emmylua


最后感谢EmmyLua的作者们无私开源编写了这个强大的插件。


相关文章
|
2月前
|
网络协议 Windows
两步带你解决IDEA 插件下载安装慢、超时、不成功问题
这篇文章提供了解决IDEA插件下载慢或超时问题的方案,通过查找国内插件节点IP地址并修改本地hosts文件来加速下载。
两步带你解决IDEA 插件下载安装慢、超时、不成功问题
|
15天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
66 6
|
2月前
|
Java
可直接编辑jar包的IDEA插件-JarEditor
IDEA自带的反编译插件虽可查看jar包中的class文件,但无法直接编辑。为解决此问题,作者开发了JarEditor插件,可在IDEA中直接编辑jar文件内的class及资源文件,无需解压或手动编译。点击Jar Editor可修改代码,通过Save/Compile保存并编译,Build Jar则将更改写回jar包。该插件简化了jar包编辑流程,提高了开发效率。
208 4
可直接编辑jar包的IDEA插件-JarEditor
|
4月前
|
IDE 程序员 开发工具
IDEA插件-IKun Progress 坤坤成IDEA进度条了
"IKun Progress"是一款适用于JetBrains IntelliJ IDEA等IDE的插件,该插件能够将标准的进度条替换为一个有趣且独特的篮球动画,其中的角色名为坤坤(Kun Kun)。它旨在为您的IDE使用过程增添一些娱乐和轻松的氛围。 该插件让您可以在执行IDE中的任务时享受到更加视觉上吸引人的进度指示器,例如构建、运行测试或其他涉及进度条的操作。相比传统的普通进度条,您将看到坤坤在打篮球,给您的开发工作流程增添了一份乐趣。
716 0
IDEA插件-IKun Progress 坤坤成IDEA进度条了
|
4月前
|
IDE 程序员 开发工具
IDEA插件-Mario Progress Bar马里奥进度条
"Mario Progress Bar"是一款适用于JetBrains IntelliJ IDEA等IDE的插件,它基于Dmitry Batkovitch开发的Nyan Progress Bar。该插件会将进度条样式变成马里奥游戏中的角色。基本的进度条显示为带有一些砖块的马里奥形象,而不确定状态的进度条显示为一个乌龟壳。一旦安装完成,您可以在IDE的设置中找到插件的配置选项(Settings > Tools > Mario Progress Bar),在此处选择您喜欢的角色形象。
274 0
IDEA插件-Mario Progress Bar马里奥进度条
|
1月前
|
Windows
IDEA如何查看已经安装的插件并删除
【10月更文挑战第1天】这段内容主要介绍了如何在IntelliJ IDEA中查看和删除已安装的插件。可以通过软件内的插件市场查看插件列表,包括插件名称、版本号和供应商等信息;也可以通过访问插件目录查看。删除插件则建议在插件市场中进行,包括禁用和卸载步骤,手动删除插件文件夹的方法不推荐,因为可能存在配置残留等问题。
569 11
|
1月前
|
人工智能 Java 数据库连接
IDEA开发 常用代码规范插件 常用辅助类插件
IDEA开发 常用代码规范插件 常用辅助类插件
52 0
|
1月前
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
72 1
|
1月前
|
IDE Java Maven
分享几个实用的IDEA插件,提高你的工作效率!
分享几个实用的IDEA插件,提高你的工作效率!
142 0
|
3月前
|
自然语言处理 JavaScript 算法
【插件】IDEA这款插件,爱到无法自拔
本文介绍了阿里云「通义灵码」这一强大IDEA插件,它不仅能够智能生成代码、解答研发问题,还支持多种编程语言和编辑器。文章详细展示了如何安装使用该插件,并通过多个实际案例说明其在代码解释、优化、生成注释及单元测试等方面的应用,助力开发者提高效率。强烈推荐尝试!
128 1
【插件】IDEA这款插件,爱到无法自拔

热门文章

最新文章

下一篇
无影云桌面