加载 Excel 格式的游戏配置数据
在游戏开发中,配置数据通常以表格的形式存储,Excel 文件由于其直观性和易编辑性,常被用于管理这些数据,便于 游戏开发团队中的策划,或是设计角色的成员进行便捷的维护。本文将介绍如何使用 Dora SSR 引擎提供的 Content.loadExcel
和 Content.loadExcelAsync
函数来加载 .xlsx
格式的 Excel 文件,并将其转换为 Lua 表,以便在游戏中使用。
1. 函数简介
Dora SSR 引擎提供了两个函数用于加载 Excel 文件:
Content.loadExcel
:同步加载 Excel 文件。Content.loadExcelAsync
:异步加载 Excel 文件。
这两个函数的用法基本相同,区别在于是否阻塞当前线程。
1.1 函数签名
-- 同步加载
Content.loadExcel(self: Content, filename: string, sheetNames?: {string}): table | nil
-- 异步加载
Content.loadExcelAsync(self: Content, filename: string, sheetNames?: {string}): table | nil
1.2 参数说明
filename
:要读取的 Excel 文件名(字符串)。sheetNames
:可选参数,要读 取的 Excel 表名的字符串列表。如果不提供,默认读取所有表。
1.3 返回值
- 成功时返回一个 Lua 表,键为表名,值为该表的行列数据。
- 失败时返回
nil
。
2. 步骤详解
2.1 准备 Excel 文件
确保你的 Excel 文件位于游戏资源目录中,或者位于可以访问的资源路径。假设要加载的文件名叫 config.xlsx
,并包含以下两个表,每个工作表的第一行是表头,定义了每一列的数据含义。在实际使用中,你可以根据游戏需求添加更多的列和行。
-
Enemies 表(敌人配置表)
EnemyID EnemyName Health Attack 1 Goblin 100 10 2 Orc 200 20 3 Troll 300 30 4 Dragon 1000 100 - EnemyID:敌人的唯一标识符。
- EnemyName:敌人的名称。
- Health:敌人的生命值。
- Attack:敌人的攻击力。
-
Items 表(道具配置表)
ItemID ItemName Type Value 101 Health Potion Consumable 50 102 Mana Potion Consumable 30 103 Sword Weapon 150 104 Shield Armor 100 - ItemID:道具的唯一标识符。
- ItemName:道具的名称。
- Type:道具的类型(例如,消耗品. 武器. 护甲)。
- Value:道具的价值或效果数值。
2.2 使用 loadExcel
同步加载
- Lua
- Teal
- TypeScript
- YueScript
local Content <const> = require("Content")
-- 加载指定的 Excel 文件
local excelData = Content:loadExcel("config.xlsx")
if excelData then
-- 访问 "Enemies" 表的数据
local enemiesData = excelData["Enemies"]
if enemiesData then
for rowIndex, row in ipairs(enemiesData) do
local enemyID = row[1]
local enemyName = row[2]
print(string.format("Enemy ID: %s, Name: %s", enemyID, enemyName))
end
end
-- 访问 "Items" 表的数据
local itemsData = excelData["Items"]
if itemsData then
for rowIndex, row in ipairs(itemsData) do
local itemID = row[1]
local itemName = row[2]
print(string.format("Item ID: %s, Name: %s", itemID, itemName))
end
end
else
print("Excel 文件加载失败。")
end
local Content <const> = require("Content")
-- 加载指定的 Excel 文件
local excelData = Content:loadExcel("config.xlsx")
if not excelData is nil then
-- 访问 "Enemies" 表的数据
local enemiesData = excelData["Enemies"]
if enemiesData then
for rowIndex, row in ipairs(enemiesData) do
local enemyID = row[1]
local enemyName = row[2]
print(string.format("Enemy ID: %s, Name: %s", enemyID, enemyName))
end
end
-- 访问 "Items" 表的数据
local itemsData = excelData["Items"]
if itemsData then
for rowIndex, row in ipairs(itemsData) do
local itemID = row[1]
local itemName = row[2]
print(string.format("Item ID: %s, Name: %s", itemID, itemName))
end
end
else
print("Excel 文件加载失败。")
end
import { Content } from "Dora";
// 加载指定的 Excel 文件
const excelData = Content.loadExcel("config.xlsx");
if (excelData) {
// 访问 "Enemies" 表的数据
const enemiesData = excelData["Enemies"];
if (enemiesData) {
for (const [rowIndex, row] of enemiesData.entries()) {
const enemyID = row[0];
const enemyName = row[1];
print(`Enemy ID: ${enemyID}, Name: ${enemyName}`);
}
}
// 访问 "Items" 表的数据
const itemsData = excelData["Items"];
if (itemsData) {
for (const [rowIndex, row] of itemsData.entries()) {
const itemID = row[0];
const itemName = row[1];
print(`Item ID: ${itemID}, Name: ${itemName}`);
}
}
} else {
print("Excel 文件加载失败。");
}
_ENV = Dora
-- 加载指定的 Excel 文件
if excelData := Content\loadExcel "config.xlsx"
-- 访问 "Enemies" 表的数据
if enemiesData := excelData["Enemies"]
for [enemyID, enemyName] in *enemiesData
print "Enemy ID: {enemyID}, Name: {enemyName}"
-- 访问 "Items" 表的数据
if itemsData := excelData["Items"]
for [itemID, itemName] in *itemsData
print "Item ID: {itemID}, Name: {itemName}"
else
print "Excel 文件加载失败。"
解析返回的数据表
返回的 excelData
是一个嵌套的数据表,结构如 下:
- Lua
- Teal
- TypeScript
- YueScript
{
["Enemies"] = {
{ "EnemyID", "EnemyName", "Health", "Attack" },
{ 1, "Goblin", 100, 10 },
{ 2, "Orc", 200, 20 },
{ 3, "Troll", 300, 30 },
{ 4, "Dragon", 1000, 100 },
},
["Items"] = {
{ "ItemID", "ItemName", "Type", "Value" },
{ 101, "Health Potion", "Consumable", 50 },
{ 102, "Mana Potion", "Consumable", 30 },
{ 103, "Sword", "Weapon", 150 },
{ 104, "Shield", "Armor", 100 },
},
}
{
["Enemies"] = {
{ "EnemyID", "EnemyName", "Health", "Attack" },
{ 1, "Goblin", 100, 10 },
{ 2, "Orc", 200, 20 },
{ 3, "Troll", 300, 30 },
{ 4, "Dragon", 1000, 100 },
},
["Items"] = {
{ "ItemID", "ItemName", "Type", "Value" },
{ 101, "Health Potion", "Consumable", 50 },
{ 102, "Mana Potion", "Consumable", 30 },
{ 103, "Sword", "Weapon", 150 },
{ 104, "Shield", "Armor", 100 },
},
}
{
"Enemies": [
[ "EnemyID", "EnemyName", "Health", "Attack" ],
[ 1, "Goblin", 100, 10 ],
[ 2, "Orc", 200, 20 ],
[ 3, "Troll", 300, 30 ],
[ 4, "Dragon", 1000, 100 ],
],
"Items": [
[ "ItemID", "ItemName", "Type", "Value" ],
[ 101, "Health Potion", "Consumable", 50 ],
[ 102, "Mana Potion", "Consumable", 30 ],
[ 103, "Sword", "Weapon", 150 ],
[ 104, "Shield", "Armor", 100 ],
],
}
{
"Enemies": [
[ "EnemyID", "EnemyName", "Health", "Attack" ],
[ 1, "Goblin", 100, 10 ],
[ 2, "Orc", 200, 20 ],
[ 3, "Troll", 300, 30 ],
[ 4, "Dragon", 1000, 100 ],
],
"Items": [
[ "ItemID", "ItemName", "Type", "Value" ],
[ 101, "Health Potion", "Consumable", 50 ],
[ 102, "Mana Potion", "Consumable", 30 ],
[ 103, "Sword", "Weapon", 150 ],
[ 104, "Shield", "Armor", 100 ],
],
}
2.3 使用 loadExcelAsync
异步加载
当你不希望阻塞当前线程时,可以使用异步加载:
- Lua
- Teal
- TypeScript
- YueScript
local Content <const> = require("Content")
local thread <const> = require("thread")
thread(function()
-- 异步加载 Excel 文件
local excelData = Content:loadExcelAsync("config.xlsx")
if excelData then
-- 处理数据的逻辑与同步加载相同
local enemiesData = excelData["Enemies"]
-- ...
else
print("异步加载 Excel 文件失败。")
end
end)
local Content <const> = require("Content")
local thread <const> = require("thread")
thread(function()
-- 异步加载 Excel 文件
local excelData = Content:loadExcelAsync("config.xlsx")
if not excelData is nil then
-- 处理数据的逻辑与同步加载相同
local enemiesData = excelData["Enemies"]
-- ...
else
print("异步加载 Excel 文件失败。")
end
end)
import { Content } from "Dora";
// 异步加载 Excel 文件
thread(() => {
const excelData = Content.loadExcelAsync("config.xlsx");
if (excelData) {
// 处理数据的逻辑与同步加载相同
const enemiesData = excelData["Enemies"];
// ...
} else {
print("异步加载 Excel 文件失败。");
}
});
_ENV = Dora
thread ->
-- 异步加载 Excel 文件
if excelData := Content\loadExcelAsync "config.xlsx"
-- 处理数据的逻辑与同步加载相同
if enemiesData := excelData["Enemies"]
-- ...
else
print "异步加载 Excel 文件失败。"