• 给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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

    ---@type CS.UnityEngine.Vector3
    local v3
    
    • 1
    • 2

    生成类型标注代码

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

    原理:通过反射一个类,查找这个类的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
  • 相关阅读:
    JavaScript 63 JavaScript 对象 63.5 JavaScript 对象访问器
    selenium等待元素加载、元素操作、执行js、切换选项卡、登录cnblogs(chrome)、抽屉半自动点赞
    java agent技术的注入利用与避坑点
    【Rust 日报】2022-09-18 Linus提议将Rust添加到Linux6.1内核
    啥?PS一秒成图?Adobe的逆天黑科技大公开
    计算机竞赛 深度学习LSTM新冠数据预测
    Mysql8创建用户以及赋权操作
    显示控件——字符显示之文本显示
    乐盟互动申请纳斯达克IPO上市,募资2000万美元
    Hololens开发-手势拖拽、旋转物体实现
  • 原文地址:https://blog.csdn.net/ak47007tiger/article/details/127940571