游戏工具配置数据的使用流程主要是以下三步:
1、策划通过Excel表进行游戏数据配置管理
2、技术编写对Excel表导出工具,把策划配置导出json格式文件
3、游戏内加载json配置数据在游戏内使用
下面我介绍通过node js 的 xlsx库高效完成一个基础版Excel表配置表导出工具
准备工作:电脑安装好node js。
下面是详细的流程:
一、安装xlsx 库:
npm install xlsx
二、准备一个excel表,这里我以角色.xlsx做例子
新建一个目录命名ExcelTool,在新建子目录命名xlsx;把角色.xlsx配置放到xlsx目录。后期用到的所有配置都放到改目录。我们编写一个工具把xlsx目录下的所有excel表导出到一个文件
三、编写导出工具
1、在ExcelTool目录下新建exceltool.js文件
2、引入xlsx库,fs库
const xlsx = require('xlsx');
const fs = require('fs');
3、遍历xlsx目录,读取所有excel表配置
function readExcels() {
var files = fs.readdirSync(xlsxDir);
for (let i = 0, len = files.length; i < len; i++) {
let fileName = files[i];
if (fileName.indexOf("xlsx") != -1&&fileName.indexOf("~$") == -1) {
let excelName = xlsxDir + fileName;
console.log("读取配置:" + excelName);
readOneExcel(fileName);
}
}
}
4、读取每个excel表的数据,以表的第一列作为key,存储每一行数据
function readOneExcel(fileName) {
let xlName = xlsxDir + fileName;
const workbook = xlsx.readFile(xlName);
const sheetNames = workbook.SheetNames;
const sheetDatas = {};
for (let i = 0, len = sheetNames.length; i < len; i++) {
var sheetName = sheetNames[i];
const worksheet = workbook.Sheets[sheetName];
//获取工作表数据,遍历工作表的每一行
let excelRows = xlsx.utils.sheet_to_json(worksheet, { header: 1, range: 0 });
//表头描述 名字
let sheetHeadNames = excelRows[0];
//表变量名
let sheetVars = excelRows[1];
for (let j = 2, jl = excelRows.length; j < jl; j++) {
let row = excelRows[j];
if (!row || row.length == 0)
break;
let rowJson = getRowJson(sheetVars, row);
sheetDatas[rowJson[sheetVars[0]]] = rowJson;
}
}
excelDatas[sheetName] = sheetDatas;
}
function getRowJson(sheetVars, row) {
let rowJson = {};
for (let i = 0, len = row.length; i < len; i++) {
rowJson[sheetVars[i]] = row[i];
}
return rowJson;
}
5、保存json数据到文件中
function exportData() {
// 判断目录是否存在,不存在则创建
if (!fs.existsSync(expDir)) {
fs.mkdirSync(expDir, { recursive: true });
}
fs.writeFileSync(expDir + `conf.json`, JSON.stringify(excelDatas));
}
以下是完整的代码:
const xlsx = require('xlsx');
const fs = require('fs');
const xlsxDir = "xlsx/";
const expDir = "data/";
var excelDatas = {};
readExcels();
exportData();
function readExcels() {
var files = fs.readdirSync(xlsxDir);
for (let i = 0, len = files.length; i < len; i++) {
let fileName = files[i];
if (fileName.indexOf("xlsx") != -1 && fileName.indexOf("~$") == -1) {
let excelName = xlsxDir + fileName;
console.log("读取配置:" + excelName)
readOneExcel(fileName);
}
}
}
function readOneExcel(fileName) {
let xlName = xlsxDir + fileName;
const workbook = xlsx.readFile(xlName);
const sheetNames = workbook.SheetNames;
const sheetDatas = {};
for (let i = 0, len = sheetNames.length; i < len; i++) {
var sheetName = sheetNames[i];
const worksheet = workbook.Sheets[sheetName];
//获取工作表数据,遍历工作表的每一行
let excelRows = xlsx.utils.sheet_to_json(worksheet, { header: 1, range: 0 });
//表头描述 名字
let sheetHeadNames = excelRows[0];
//表变量名
let sheetVars = excelRows[1];
for (let j = 2, jl = excelRows.length; j < jl; j++) {
let row = excelRows[j];
if (!row || row.length == 0)
break;
let rowJson = getRowJson(sheetVars, row);
sheetDatas[rowJson[sheetVars[0]]] = rowJson;
}
}
excelDatas[sheetName] = sheetDatas;
}
function getRowJson(sheetVars, row) {
let rowJson = {};
for (let i = 0, len = row.length; i < len; i++) {
rowJson[sheetVars[i]] = row[i];
}
return rowJson;
}
function exportData() {
// 判断目录是否存在,不存在则创建
if (!fs.existsSync(expDir)) {
fs.mkdirSync(expDir, { recursive: true });
}
fs.writeFileSync(expDir + `conf.json`, JSON.stringify(excelDatas));
}
运行 node exceltool.js 即可导出excel表配置
以上是一个简单的excel表配置导出工具的框架,包含的导出基本流程。这里我主要是一个抛砖引玉的目的,大家可以在这个框架的基础上去拓展。根据自己具体项目需求完成对应的功能,完成各种强大的功能,提高项目生成效率。