经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
EmmyLua 注解功能
来源:cnblogs  作者:SouthBegonia  时间:2021/12/17 11:27:23  对本文有异议

前言

网上配置 EmmyLua 的方法很多,此处就不做赘述(因此前提是你已经安装配置完EmmyLua)

本文仅是对 EmmyLua插件注解功能 用法的代码演示。因为网上大部分EmmyLua配置教程中都没对此部分进行讲解,而实际lua开发时EmmyLua的注解功能几乎必不可缺,故作此文

注解的目的

我们在编写C#脚本时,IDE的相关插件能提示各类方法或成员以及描述:

但Lua内,即便安装完EmmyLua,不写注解的话,也就没有任何提示(灰色提示仅表示刚有写过该参数而已,完全不知道是成员变量或方法):

因此EmmyLua注解功能就是为了解决该问题:模拟实现OOP编程中代码提示

注解用法

类的声明

基本格式:--@class MY_TYPE[:PARENT_TYPE] [@comment]

  1. ---@class Person
  2. Person = {};
  3. ---@class Gamer : Person 玩家
  4. Gamer = {};

类的额外属性

即使该类未持有某属性,也可以通过添加注解,在提示内出现(PS:其实EmmyLua实现UnityAPI的提示也是基于此的)

基本格式:---@field [public|protected|private] field_name FIELD_TYPE[|OTHER_TYPE] [@comment]

  1. ---@class Person
  2. ---@field public Name string 名字
  3. ---@field private m_Age number 年龄
  4. Person = {
  5. Name = "",
  6. };

变量的类型

基本格式:---@type MY_TYPE[|OTHER_TYPE] [@comment]

PS:按上述官方用法,comment描述应当放在末尾,但我这试了下type不大行,可以放在顶部

  1. ---@type number 我的ID
  2. myId = 1;
  3. ---玩家的表
  4. ---@type table<number, Gamer>
  5. gamersTable = {};
  6. ---@type Person Person实例
  7. personA = Person:Create();
  8. ---@type Gamer Gamer实例
  9. gamerA = Gamer:Create();

函数

  • 标记函数定义参数的类型:---@param param_name MY_TYPE[|other_type] [@comment]
  • 标记函数的返回值类型:---@return MY_TYPE[|OTHER_TYPE] [@comment]
  1. ---取得台词
  2. ---@param isCN boolean 是否是中文
  3. ---@param id number 台词字典ID
  4. ---@return string 台词
  5. function GetLines(isCN, id)
  6. local str = ""; -- do something
  7. return str;
  8. end

备注

在IDEA下,对目标使用Alt+Enter快捷键(或点小灯泡),可较方便自动补全注解:

完整示例

现有Person基类,Gamer类继承自Person,在Main.lua内实现两个类的创建及使用(直接粘到本地跑就行):

Main.lua:

  1. require("Person");
  2. require("Gamer");
  3. ---@type Person
  4. local pa = Person:Create("joker", 18);
  5. pa:ShowInfo();
  6. pa:ReName("Joker");
  7. pa:ShowInfo()
  8. ---@type Gamer
  9. local ga = Gamer:Create("fox", 19, nil, nil);
  10. ga:ShowInfo();
  11. ga:ReName("Fox");
  12. ga:ReGamerInfo("123", "456");
  13. ga:ShowInfo();

Person.lua:

  1. ---@class Person 人类型
  2. ---@field public Name string 名字
  3. ---@field private m_Age number 年龄
  4. Person = {
  5. Name = "",
  6. m_Age = 0,
  7. };
  8. Person.__index = Person;
  9. ---Create
  10. ---@param name string
  11. ---@param age number
  12. function Person:Create(name, age)
  13. ---@type Person
  14. local t = {};
  15. setmetatable(t, Person);
  16. t:ReName(name);
  17. t:ReAge(age);
  18. return t;
  19. end
  20. ---ReName
  21. ---@param newName string
  22. ---@public
  23. function Person:ReName(newName)
  24. self.Name = newName;
  25. end
  26. ---ReAge
  27. ---@param newAge number
  28. ---@private
  29. function Person:ReAge(newAge)
  30. self.m_Age = newAge;
  31. end
  32. ---ShowInfo
  33. ---@public
  34. function Person:ShowInfo()
  35. print("Name = " .. self.Name .. ", Age = " .. self.m_Age);
  36. end

Gamer.lua:

  1. require("Person")
  2. ---@class Gamer : Person 玩家
  3. ---@field private SW string SW
  4. ---@field private SteamId string Steam链接
  5. Gamer = {
  6. SW = "",
  7. SteamId = "",
  8. };
  9. Gamer.__index = Gamer;
  10. setmetatable(Gamer, Person);
  11. function Gamer:Create(name, age, sw, steamId)
  12. ---@type Gamer
  13. local t = {};
  14. t = Person:Create(name, age);
  15. setmetatable(t, Gamer);
  16. t:ReGamerInfo(sw, steamId);
  17. return t;
  18. end
  19. ---ReGamerInfo
  20. ---@param sw string
  21. ---@param steamId string
  22. ---@public
  23. function Gamer:ReGamerInfo(sw, steamId)
  24. self.SW = sw or "0";
  25. self.SteamId = steamId or "0";
  26. end
  27. ---ShowInfo
  28. ---@public
  29. function Gamer:ShowInfo()
  30. print("Name = " .. self.Name .. ", Age = " .. self.m_Age .. ", SW = " .. self.SW .. ", SteamId = " .. self.SteamId);
  31. end

PS:可以用 在Lua中实现面向对象特性——模拟类、继承、多态 - 马三小伙儿 大佬这篇的代码练手

参考文章

原文链接:http://www.cnblogs.com/SouthBegonia/p/15692025.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号