歡迎前往個人博客 駑馬點滴 和視頻空間 嗶哩嗶哩-《挨踢日志》
序言
在游戲開發過程中,需要提供一套配置數據的解決方案。這套解決方案中,就包含了配表數據
有兩種配表的形式我比較認可:
- 提供一個數據的在線管理平臺,此平臺提供了一套數據維護的解決方案
- 使用Excel表格,對數據進行配置
對于1而言,它對數據做了有效的保護,能夠配置用戶的權限,對于有保密需求的公司而言,是一個很好的選擇。不足之處是,提供此套解決方案的成本過高。
對于2而言,基本沒有開發的成本,維護人員在掌握了配表規則后,可以非常方便的使用,缺點是,數據的訪問權限完全開放。
若未特別聲明,本文所指的配表數據就是指Excel的.xls
格式的配表數據,以及將其轉換為程序所使用的.lua
格式的配表數據
圍繞著配表數據,本篇將從以下幾個要點進行講述:
.xls
配表的需求分析
-
.xls
配表的設計 -
.lua
格式的配表數據的格式設計 -
.lua
格式的配表數據的生成工具
.xls
配表數據的需求分析
我們先來看看配置人員是如何配置.xls
表格的:
- 導航到配置數據的文件夾路徑
- 新建一份.xls表格,對其命名
- 打開.xls文件,能夠設置屬性字段、配置屬性數值
- 能夠建立不同的sheet,每一個sheet能夠配置是否導出到
.lua
文件(.lua
文件是提供給程序使用的文件) - 使用導出工具,導出到
.lua
文件,提供給相關人員使用
從配置的過程,我們分析并確定了我們需要完成的任務:
- 提供
.xls
配表的文件框架 - 提供
.xls
配表文件的命名規范 - 提供
.xls
配表文件的表格格式 - 提供
.xls
配表文件的導出配置 - 提供
.xls
配置文件導出到.lua
的工具
.xls
配表的設計
于是我們給出了我們的.xls
配表的設計方案:
- 配置人員在指定的文件夾
xls
下進行表格的配置 - 此文件夾下只有
.xls
文件,不允許出現子文件夾,文件命名為[module1][_module2].xls
,其中module1, module2為模塊標識,如
文件夾 PATH 列表
卷序列號為 000E-EB46
C:.
└─xls
example_building.xls
object_monster.xls
object_role.xls
system_daily.xls
我們通過文件名,就可以方便的知道:
object
模塊下有子模塊monster
、role
的配置.
system
模塊有子模塊daily
的配置.
-
.xls
配置格式
以example_building.xls
為例
id | name | use_money | use_food | is_init | defense | args1 | args2 | args3 | args4 |
---|---|---|---|---|---|---|---|---|---|
i | s | i | f | b | i | ai | af | as | ab |
編號 | 名稱 | 金錢消耗 | 食物消耗 | 是否初始化 | 防御 | 數組1 | 數組2 | 數組3 | 數組4 |
1 | house | 1000 | 2.33 | TRUE | 100 | 1;2;3 | 1.23;2;3.23 | sdf;23e;s | true;false;true |
2 | house2 | 123 | 336.2 | TRUE | 1;2;3 | 1.23;2;3.23 | 你好;你在哪 | true;false | |
3 | 456 | 222.33665 | FALSE | 130 | 3;2;5;; | 1.23;2;3.23 | 我在這里啊;你在那;呢 | false;true | |
4 | farm | 100 | 220 | FALSE | 200 | 2;3 | 1.23;2;3.23 | df;ssd;dd;dd | |
5 | house5 | 22.1 | 2343;6;6;;;7 | 3;6.3;6;;;7 | 1.23;2;3.23 | true;true | |||
6 | horse6 | 200 | FALSE | 333 | 2e;w;e;we | false;false;false;false |
Note:
第一行是屬性字段名,可用的字符集為(英文字母+數字+下劃線),滿足通常意義下的變量命名規范
第二行是類型聲明
第三行是備注——不導出到最后的數據中
- 導出設置
在.xls
文件中,我們將一個sheet命名為output_xxxx,那么在后續的導出工具中,就會得到一個名為xxxx.lua
的文件,如果當前的.xls
中,有多個以output_開頭的sheet,那么就會導出多個對應的.lua
文件。
單個sheet的配置表.png
多個sheet的配置表:output_object_monster.png
多個sheet的配置表:output_object_monster_level.png
.lua
格式的配表數據的設計
這里給出一個生成的結果,再解釋為何.lua
配置成如此。
使用上圖中的object_monster.xls
,
通過生成工具,生成了如圖的數據結構:
我們導出的
object_monster.lua
不但完整的保存了配置數據,還擁有對數據內容的一些訪問接口,先來看看如何使用數據表
數據表加載
local CnfObjectMonster = require("object_monster")
打印表數據項個數
print(">>>> 數據項個數")
print(CnfObjectMonster.len())
輸出
>>>> 數據項個數
3
屬性訪問
local printMonster = function(monsterID)
local monsterName = CnfObjectMonster.name(monsterID)
local monsterResName = CnfObjectMonster.res_name(monsterID)
print(string.format(">>>> monster of id(%d), its name is %s, its resource name is %s", monsterID, monsterName, monsterResName))
local monsterSkillList = CnfObjectMonster.skill_list(monsterID)
print(">>>> 打印技能列表")
monsterSkillList.walk(print)
print(">>>> 技能列表長度")
print(monsterSkillList.len())
end
local monsterID = 10001
printMonster(monsterID)
輸出
>>>> monster of id(10001), its name is 哥布林小怪, its resource name is spine_small_goblin
>>>> 打印技能列表
1 101
2 102
>>>> 技能列表長度
2
訪問ID列表
local ids = CnfObjectMonster.getIDList()
for k, v in ipairs(ids) do
print(k, v)
end
輸出
1 10001
2 10002
3 10003
全表遍歷
CnfObjectMonster.walk(function(k, id)
printMonster(id)
end)
輸出
>>>> monster of id(10001), its name is 哥布林小怪, its resource name is spine_small_goblin
>>>> 打印技能列表
1 101
2 102
>>>> 技能列表長度
2
>>>> monster of id(10002), its name is 哥布林精英, its resource name is spine_elite_goblin
>>>> 打印技能列表
1 101
2 102
3 103
>>>> 技能列表長度
3
>>>> monster of id(10003), its name is 哥布林頭領, its resource name is spine_boss_goblin
>>>> 打印技能列表
1 101
2 102
3 104
4 105
>>>> 技能列表長度
4
我們可以看到:.lua
數據文件提供了非常便捷的屬性訪問接口、遍歷接口,另一方面,對于真正的數據data
,被屏蔽了對它的增加、減少或者修改它的任一內容的操作。
這樣的數據結構,既提供了讀取數據的接口,又屏蔽了針對數據的修改操作,十分令人滿意。
.lua
格式的配表數據的生成工具
關于這份工具,我使用的是:
在它的基礎之上,我進行了針對性的修改。
結束
我們底層的數據框架搭建好了,工作和生活更加愉快起來了_~