编写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的代码提示