• cocos create csv 配置文件


    项目背景cocos create3.x    游戏 要用到 Excel 配置表: 轮子没找到自己操了:

    主要分两部分:

    1. 做一个打表工具,应为每次都是点 Excel 导出 csv 不能导出多个 sheets,  而且还要手动设置 编码,
    2. cocos create 解析;

     Excel 打表工具的制作:

     这个是我的 Excel: 第一行字段,第二行描述

     这个是我导出的 .csv 文件:

    工具使用 C# 写的,使用了 Aspose.Cells 库,(没有水印 没有注释)

    应为使用了 Aspose 库,所以代码很简单:

    1. using Aspose.Cells;
    2. using System;
    3. using System.IO;
    4. namespace ExcelToCSV
    5. {
    6. class Program
    7. {
    8. static void Main(string[] args)
    9. {
    10. Console.WriteLine(@"正在运行......");
    11. Workbook ExportExcelToCSVWorkBook = new Workbook(@"..\游戏配置.xlsx");
    12. WorksheetCollection myColection = ExportExcelToCSVWorkBook.Worksheets;
    13. for (int i = 0; i < myColection.Count; i++)
    14. {
    15. Console.WriteLine("sheets name:" + myColection[i].Name);
    16. string sheetsName = myColection[i].Name.Replace(" ", "");
    17. ExportExcelToCSVWorkBook.Worksheets.ActiveSheetIndex = i;
    18. switch (sheetsName)
    19. {
    20. case "卡牌":
    21. SaveFile(ExportExcelToCSVWorkBook, "board"); break;
    22. case "卡牌效果":
    23. SaveFile(ExportExcelToCSVWorkBook, "boardEffect"); break;
    24. case "角色":
    25. SaveFile(ExportExcelToCSVWorkBook, "character"); break;
    26. case "装备":
    27. SaveFile(ExportExcelToCSVWorkBook, "equip"); break;
    28. case "坐骑":
    29. SaveFile(ExportExcelToCSVWorkBook, "mount"); break;
    30. }
    31. }
    32. Console.WriteLine(@"运行结束!按任意键结束");
    33. Console.ReadKey();
    34. }
    35. static void SaveFile(Workbook workbook, string name)
    36. {
    37. string path = String.Format(@"{0}\{1}", Directory.GetParent(Directory.GetCurrentDirectory()), "out");
    38. if (!Directory.Exists(path))
    39. {
    40. Directory.CreateDirectory(path);
    41. }
    42. workbook.Save(String.Format(@"{0}\{1}.csv", path, name), SaveFormat.CSV);
    43. }
    44. }
    45. }

    工程下载地址:

     cocos create 中 解析csv:

     cocos create3.x 已经 提供了TextAsset,可以在 Resources 目录中加载 文本;

     

    1. async loadResources(name: string) {
    2. return await new Promise<Array<any>>((resolve) => {
    3. resources.load(`configs/${name}`, (err: any, res: TextAsset) => {
    4. if (err) {
    5. console.log(`资源加载失败 ${name}:`, err);
    6. return resolve([]);
    7. } else {
    8. resolve(this.CSVToArray(res.text));
    9. }
    10. })
    11. });
    12. }

    这里是解析:(解析这里需要注意下 我们的 .csv 文本文件)

    • 第一行是我们的字段,第二行是我们的描述,也就是注释
    • 第三行 才是正正的 数据
    1. /**
    2. * CSBV 转 数组对象
    3. * @param text 文本资源内容
    4. * @returns
    5. */
    6. CSVToArray(text) {
    7. let str = text.replace(/\r/g, "");
    8. let mapArr = str.split("\n");
    9. let array = [];
    10. let datumArray = [];
    11. let arr = '';
    12. for (let index = 0; index < mapArr.length; index++) {
    13. //const element = mapArr[index];
    14. arr = mapArr[index].split(",");
    15. array[index] = arr;
    16. }
    17. if (array.length > 1) {
    18. let datumItem = {};
    19. for (let i = 2; i < array.length; i++) {
    20. datumItem = {}
    21. for (let j = 0; j < array[0].length; j++) {
    22. if (array[i][j]) {
    23. datumItem[array[0][j]] = array[i][j];
    24. } else {
    25. continue;
    26. }
    27. }
    28. if (Object.keys(datumItem).length > 0) {
    29. datumArray.push(datumItem)
    30. }
    31. }
    32. }
    33. return datumArray
    34. }

     那么解析出来的数据就张这样了:

     

     

    这里是完整脚本:

    1. import { resources, TextAsset } from "cc";
    2. import { BaseSingleton } from "../base/BaseSingleton";
    3. import { Log } from "../utils/Log";
    4. export class GlobeConfig extends BaseSingleton {
    5. /**
    6. * 牌组
    7. */
    8. private _arrayBoard: Array<any>;
    9. /**
    10. * 牌组 效果
    11. */
    12. private _arrayBoardEffect: Array<any>;
    13. /**
    14. * 角色
    15. */
    16. private _arrayCharacter: Array<any>;
    17. /**
    18. * 装备
    19. */
    20. private _arrayEquip: Array<any>;
    21. /**
    22. * 坐骑
    23. */
    24. private _arrayMount: Array<any>;
    25. // private parser = csv.parse({ delimiter: ','});
    26. async initConfig() {
    27. this._arrayBoard = await this.loadResources('board');
    28. this._arrayBoardEffect = await this.loadResources('boardEffect');
    29. this._arrayCharacter = await this.loadResources('character');
    30. this._arrayEquip = await this.loadResources('equip');
    31. this._arrayMount = await this.loadResources('mount');
    32. }
    33. async loadResources(name: string) {
    34. return await new Promise<Array<any>>((resolve) => {
    35. resources.load(`configs/${name}`, (err: any, res: TextAsset) => {
    36. if (err) {
    37. console.log(`资源加载失败 ${name}:`, err);
    38. return resolve([]);
    39. } else {
    40. resolve(this.CSVToArray(res.text));
    41. }
    42. })
    43. });
    44. }
    45. /**
    46. * 牌组
    47. */
    48. public get ArrayBoard(): Array<any> {
    49. return this._arrayBoard
    50. }
    51. /**
    52. * 牌组 效果
    53. */
    54. public get ArrayBoardEffect(): Array<any> {
    55. return this._arrayBoardEffect
    56. }
    57. /**
    58. * 牌组 角色
    59. */
    60. public get ArrayCharacter(): Array<any> {
    61. return this._arrayCharacter
    62. }
    63. /**
    64. * 装备
    65. */
    66. public get ArrayEquip(): Array<any> {
    67. return this._arrayEquip
    68. }
    69. /**
    70. * 坐骑
    71. */
    72. public get ArrayMount(): Array<any> {
    73. return this._arrayMount
    74. }
    75. /**
    76. * CSBV 转 数组对象
    77. * @param text 文本资源内容
    78. * @returns
    79. */
    80. CSVToArray(text) {
    81. let str = text.replace(/\r/g, "");
    82. let mapArr = str.split("\n");
    83. let array = [];
    84. let datumArray = [];
    85. let arr = '';
    86. for (let index = 0; index < mapArr.length; index++) {
    87. //const element = mapArr[index];
    88. arr = mapArr[index].split(",");
    89. array[index] = arr;
    90. }
    91. if (array.length > 1) {
    92. let datumItem = {};
    93. for (let i = 2; i < array.length; i++) {
    94. datumItem = {}
    95. for (let j = 0; j < array[0].length; j++) {
    96. if (array[i][j]) {
    97. datumItem[array[0][j]] = array[i][j];
    98. } else {
    99. continue;
    100. }
    101. }
    102. if (Object.keys(datumItem).length > 0) {
    103. datumArray.push(datumItem)
    104. }
    105. }
    106. }
    107. return datumArray
    108. }
    109. }

  • 相关阅读:
    React源码分析7-state计算流程和优先级
    强大的PubMed插件Scholarscope
    LS最小二乘圆拟合
    2、k8s 集群安装
    RocketMQ Promethus Exporter
    大学生网页作业成品——基于HTML网上书城项目的设计与实现
    架构真题2021(四十三)
    强化学习Thompson Sampling策略笔记
    leetcode:66. 加一
    云计算时代前端如何保证开源代码的安全性
  • 原文地址:https://blog.csdn.net/nicepainkiller/article/details/127423477