给XLua生成Unity Api的EmmyLua代码提示

Posted T.D.C

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给XLua生成Unity Api的EmmyLua代码提示相关的知识,希望对你有一定的参考价值。

问题背景

编写Lua代码时使用Unity的Api没有代码提示影响效率,需要一个类型系统和代码提示,下面来解决这个问题

支持类型系统

Lua是动态语言,不支持声明变量类型,需要从语言外入手。有个插件叫EmmyLua,可以使用添加特殊注释的方式构建类型系统,形如

---@class CS.UnityEngine.Vector3 : CS.System.ValueType
---@field kEpsilon number
---@field kEpsilonNormalSqrt number
---@field x number
---@field y number
---@field z number
---@field zero CS.UnityEngine.Vector3
---@field one CS.UnityEngine.Vector3
---@field forward CS.UnityEngine.Vector3
---@field back CS.UnityEngine.Vector3
---@field up CS.UnityEngine.Vector3
---@field down CS.UnityEngine.Vector3
---@field left CS.UnityEngine.Vector3
---@field right CS.UnityEngine.Vector3
---@field positiveInfinity CS.UnityEngine.Vector3
---@field negativeInfinity CS.UnityEngine.Vector3
---@field Item number
---@field normalized CS.UnityEngine.Vector3
---@field magnitude number
---@field sqrMagnitude number
CS.UnityEngine.Vector3 = 
---@overload fun(x : number, y : number, z : number) : CS.UnityEngine.Vector3
---@param x number
---@param y number
---@return CS.UnityEngine.Vector3
function CS.UnityEngine.Vector3.New(x, y) end

如果源码的文件夹中有这个内容的文件,代码中就可以使用下面的方式指定类型,然后使用emmylua提示出方法和属性

---@type CS.UnityEngine.Vector3
local v3

生成类型标注代码

因为类型标注代码手写是不现实的,所以选择反射批量生成。

原理:通过反射一个类,查找这个类的field,method,根据emmylua的类型标注语法,生成对应的类型标注,最后输出到一个lua文件

在github上找到一个开源的支持ToLua生成代码提示的git工程https://github.com/LagField/EmmyLuaTypeGenerator

改造一波用来生成xlua的代码提示

这里主要的修改如下
  • 使用命名空间过滤查找到所有需要支持的UnityApi或者第三方Api。如果想减少这个提示文件的大小,可以优化成使用XLua的导出类型列表配置来生成对应代码提示
  • 导出的类型使用.连接namespace和class
  • 保持和XLua的类型一致,使用CS.UnityEngine.xxx的形式

一些需要注意的地方

  • 要增加一个命名空间CS = 的定义,用于代码提示
  • 处理泛型的名称,过滤掉非字母数字下划线
  • 如果没有使用Lua写Editor代码的需要,去掉UnityEditor下类型导出
  • 同样,Burst下的类型也去掉了

源码连接

  • 支持xlua的emmylua类型标注导出工具:https://github.com/ak47007tiger/EmmyLuaXLuaSnippetGenerator

XLua系列讲解_使用VsCode来书写Lua代码

1.首先在 “扩展面板” 中输入“EmmyLua”插件并安装。

2.使用VsCode打开Unity中的Lua脚本文件时候,默认也会出现 “**.lua.meta” 的文件,我们在 “管理->设置->文本编辑器->文件->Files:Exclude” 中通过配置方式过滤掉该类型文件(如下图)。

以上是关于给XLua生成Unity Api的EmmyLua代码提示的主要内容,如果未能解决你的问题,请参考以下文章

XLua系列讲解_使用VsCode来书写Lua代码

XLua系列讲解_使用VsCode来书写Lua代码

XLua系列讲解_使用VsCode来书写Lua代码

Unity 游戏用XLua的HotFix实现热更原理揭秘

xlua中hotfix简单实用

xLua 调试