jyx2/Assets/Mods/JYX2/Configs/README.md
配置文件使用Excel文件编写,文件名无要求,但建议使用容易理解的名字。编写好后,在编辑器中启动游戏的时候会自动读取并生成游戏内使用的Lua配置表。如果想要手动刷新,需到Unity编辑器中点击Mod根目录中的ModSetting文件,并在右侧Inspector面板中点击“生成配置表”按钮,即可重新生成Lua配置表。
Lua配置表为实际上在游戏中使用的配置表,但请不要手动修改。任何对Lua配置表的修改都会在下次启动游戏的时候被刷新覆盖,而且Lua配置表无法上传到项目的GitHub中。想要修改配置时修改对应的Excel即可。
示例如下表:
| Excel | A | B | C |
|---|---|---|---|
| 1 | LuaConfigGen | ConfigName | |
| 2 | 代号 | 名称 | 更多字段 |
| 3 | L_number | L_string | L_number[] |
| 4 | Id | Name | Other |
| 5 | 1 | 胡斐 | 1,3,5 |
A1单元格是固定的,用来标明这个表格是一个配置表。如果A1中的值不是LuaConfigGen,这个Excel将被直接忽略。B2单元格中填写这个配置表的名称。可以在游戏中使用这个名称来访问该配置表。例如,B2的值为Character,则可以在Lua脚本中使用Jyx2.ConfigMgr.Character访问该配置表。第二行目前只是为了让excel表容易理解,不会对配置表的功能产生影响。
数据类型分为基础型、复合型、列表型三种。
L_numberL_stringL_boolean,隔开,例如
L_number,L_stringL_number,L_boolean,L_number[],用来表示由多个该类型数据组成的列表,例如
L_number[]表示一个数字列表L_number,L_string[]表示一个复合型列表,列表中每个元素都是由一个数字和一个字符串组成的复合型数据Jyx2.ConfigMgr.Character[0].Name可获取配置表Character中第1条数据的Name字段的值。#开头,那这个字段就会被忽略,游戏中将无法获取这个字段的任何值。如果一个字段的数据类型是复合型列表,为访问方便,应当为字段中复合型数据的每一个元素起一个名字。例如配置表武功中的
Levels-Attack,SelectRange,AttackRange,AddMp,KillMp
是一个复合型列表字段的名称,对应的数据类型为:L_number,L_number,L_number,L_number,L_number[]。
其中Levels为字段的实际名称,Attack,SelectRange,AttackRange,AddMp,KillMp分别为Levels中元素的五个属性的名称。
也就是说,Levels实际上是一个嵌套进来的子表。其下有名为Attack,SelectRange等五个子字段。使用level0 = Jyx2.ConfigMgr.Skill[0].Levels即可将表中Id为0的数据的Levels字段存储到level0中。level0则是一个新的表,使用level0[1].Attack即可访问level0表中第一个元素的Attack字段的值。
Levels来作为字段名称,那么例子中的level0[1].Attack可以使用level0[1][1]来访问,但会缺乏可读性。Id字段的值可以用来访问这条数据,例如使用Jyx2.configMgr.Character[233]可以读取配置表Character中Id为233的那条数据。Id字段是空白的,或者使用#开头,那这条数据就会被忽略。,分隔复合型值的每一个元素。例如13,abc为一个L_number,L_string类型的值。|分隔列表中的每一个元素。例如13|14|16为一个L_number[]类型的值,13,abc|14,ef为一个L_number,L_string[]类型的值。生成的配置表会在游戏初始化时被读入Jyx2.ConfigMgr这个Lua 表中。在Lua脚本中使用如下代码可以访问Lua配置表,具体写法可以自由组合。
-- 可以直接调用
local roleName = Jyx2.ConfigMgr.Character[2].Name
-- 但推荐先获取配置表模块,以后用起来会比较方便
local configMgr = Jyx2:GetModule("ConfigMgr")
-- 获取名为 Character 的配置表,下面几种方式都可以
local cfg1 = configMgr:GetConfig("Character")
local cfg2 = configMgr["Character"]
local cfg3 = configMgr.Character
-- 读取名为 Character 的配置表中 Id 为 123 的一条数据
local item1 = cfg1[123]
local item2 = configMgr.Character[123]
local item3 = configMgr:GetItem("Character", 123)
-- 读取名为`Name`的字段
local value1 = item1["Name"]
local value2 = item1.Name
local value3 = configMgr.Character[123].Name
-- 注意,尽量不要修改Lua配置表中的值,容易引起其他读取该配置的模块的异常。
例如,想要为名称为Map的配置表中的每条数据增加一些功能性的函数,让他看起来像c#中的对象,可以建立Jyx2ConfigMgr/MapHelper模块,在其中定义相关的函数。例如其中的GetShowName函数,在Lua脚本中可以像对象的成员函数一样使用:
Jyx2.ConfigMgr.Map[1]:GetShowName()访问Map表中Id为1的那条数据的GetShowName函数。
具体格式参考MapHelper和ItemHelper文件即可。
C#侧可以使用接口来访问Lua配置表。按照Lua侧的数据结果写一个接口,按照Xlua的说明添加标签,重新生成代码即可。具体定义参考Assets/Scripts/LuaCore/LuaToCsBridge.cs文件。
目前已经为各个配置表定义了相应接口。例如Item表映射到了字典
Jyx2.LuaToCsBridge.ItemTable,
可以通过Jyx2.LuaToCsBridge.ItemTable[1]访问Item表中的Id为1的那条数据。