身为一个码农,写代码没有提示是最难受最影响效率的吧,偏偏lua就是这样的。目前,大多数的Unity游戏开发者都已经开始使用IntelliJ IDEA来写lua代码,很重要的一个原因就是IDEA中的EmmyLua插件(EmmyLua插件下载地址:https://emmylua.github.io/),使用这个插件可以极大的提高我们的开发效率。
我们自己写的业务逻辑添加emmylua注解很简单,但是如何在项目中生成带注解的proto提高我们的开发效率呢?这时我们就需要一个像导表工具一样的根据proto导出emmylua注解文件的工具。
写工具的时候我想到了两种使用方式:
1、用lua代码来写,然后通过bat来执行lua脚本
2、用C#来实现,写到项目统一的工具类里,方便其他人维护跟移植项目
基于我们项目的需求,我选择了方法2来实现。首先放上效果图:
测试用的proto:
import "commons.proto";
package com.gy.server.packet;
option java_package = "com.gy.server.packet";
option java_outer_classname = "PbActivity";
// -------------------------------测试注释-------------------------------
//战斗状态
enum BattleStatus {
NO_START = 1; //未开启
BATTLE = 2; //战斗状态,允许玩家自由争夺位置
SETTLEMENT = 3; //结算状态,做一系列结算操作,不允许玩家战斗
RESET = 4; //重置状态
SLEEP = 5; //休眠状态,只有控制器能唤醒
CHANGE = 6; //切换状态
}
//这是一段ActivityInfo 前置测试注释1
message ActivityInfo {//这是一段ActivityInfo 前置测试注释2
optional ActivityModule module = 1;
optional ActivityData data = 2;
optional int64 startTime = 3; //活动开启时间
optional int64 endTime = 4; //活动结束时间
//这是一个注释
optional BattleStatus battleStatus = 5; //枚举测试
}//这是一段ActivityInfo 后置测试注释
// ***************************测试注释***************************
message ActivityModule {
//这是一段测试注释
optional int32 type = 1;//类型
optional int32 activityId = 2;
optional TaskActivityModule task = 10;
}
message ActivityData {
optional TaskActivityData tasks = 8; //任务活动
}
//任务活动
message TaskActivityModule {
repeated int32 receivedIds = 1; //已领取的奖励ID集合
repeated TaskActivity tasks = 2; //任务进度
repeated int32 receivedTaskIds = 3; //已接取任务ID集合
message TaskActivity {
optional int32 id = 1; //条目ID
optional int64 curProgress = 2; //当前进度
optional int64 totalProgress = 3; //总进度
}
}
//任务活动数据
message TaskActivityData {
repeated TaskActivityItem items = 1;
message TaskActivityItem {
optional int32 id = 1;
optional int32 goalId = 2; //目标ID
repeated PbReward rewards = 3; //常规奖励
optional int32 vipLimit = 4; //vip等级限制
optional string jump = 5; //跳转数据
optional bool isSelectReward = 6; //是否选择奖励
optional int32 resetFrequency = 7; //重置频率,1每日,2每周,3每月
}
}
生成的注解文件:
-- -------------------------------测试注释-------------------------------
-- 战斗状态
---@class BattleStatus : nil
BattleStatus= {
NO_START = "NO_START"; --未开启
BATTLE = "BATTLE"; --战斗状态,允许玩家自由争夺位置
SETTLEMENT = "SETTLEMENT"; --结算状态,做一系列结算操作,不允许玩家战斗
RESET = "RESET"; --重置状态
SLEEP = "SLEEP"; --休眠状态,只有控制器能唤醒
CHANGE = "CHANGE"; --切换状态
}
-- 这是一段ActivityInfo 前置测试注释1
-- 这是一段ActivityInfo 前置测试注释2
---@class ActivityInfo : nil
---@field public module ActivityModule
---@field public data ActivityData
---@field public startTime number@-- 活动开启时间
---@field public endTime number@-- 活动结束时间
-- 这是一个注释
---@field public battleStatus BattleStatus@-- 枚举测试
local ActivityInfo = {}
-- ***************************测试注释***************************
---@class ActivityModule : nil
-- 这是一段测试注释
---@field public type number@-- 类型
---@field public activityId number
---@field public task TaskActivityModule
local ActivityModule = {}
---@class ActivityData : nil
---@field public tasks TaskActivityData@-- 任务活动
local ActivityData = {}
-- 任务活动
---@class TaskActivityModule_TaskActivity : nil
---@field public id number@-- 条目ID
---@field public curProgress number@-- 当前进度
---@field public totalProgress number@-- 总进度
local TaskActivityModule_TaskActivity = {}
---@class TaskActivityModule : nil
---@field public receivedIds number[]@-- 已领取的奖励ID集合
---@field public tasks TaskActivityModule_TaskActivity[]@-- 任务进度
---@field public receivedTaskIds number[]@-- 已接取任务ID集合
local TaskActivityModule = {}
-- 任务活动数据
---@class TaskActivityData_TaskActivityItem : nil
---@field public id number
---@field public goalId number@-- 目标ID
---@field public rewards PbReward[]@-- 常规奖励
---@field public vipLimit number@-- vip等级限制
---@field public jump string@-- 跳转数据
---@field public isSelectReward boolean@-- 是否选择奖励
---@field public resetFrequency number@-- 重置频率,1每日,2每周,3每月
local TaskActivityData_TaskActivityItem = {}
---@class TaskActivityData : nil
---@field public items TaskActivityData_TaskActivityItem[]
local TaskActivityData = {}
话不多说,直接把源码贴出来