DataManager.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { AssetManager, JsonAsset, resources, TextAsset } from "cc";
  2. export interface DataBase {
  3. id: number;
  4. }
  5. //一个文件 对应一个数据操作者
  6. class DataCtrl {
  7. private _datas: Map<number, DataBase> = new Map();
  8. constructor(asset: JsonAsset | TextAsset) {
  9. if (asset instanceof JsonAsset) {
  10. const datas: DataBase[] = <DataBase[]>asset.json;
  11. for (const data of datas) {
  12. this._datas.set(Number(data.id), data);
  13. }
  14. return;
  15. }
  16. //表格数据
  17. if (asset instanceof TextAsset) {
  18. this._parseCSV(asset.text);
  19. }
  20. }
  21. private _parseCSV(text: string) {
  22. const lines: string[] = text.split("\r\n");
  23. //表格中 单元格以逗号,分开
  24. const keys: string[] = lines[0].split(",");
  25. const types: string[] = lines[1].split(",");
  26. //有用的数据
  27. for (let i = 2; i < lines.length - 1; i++) {
  28. const cols: string[] = lines[i].split(",");
  29. //每一行就是一个数据 创建一个空对象 存储数据
  30. let obj = {};
  31. for (let j = 1; j < cols.length; j++) {
  32. //获取当前字符串值 根据类型定数据
  33. let val = cols[j];
  34. let v;
  35. switch (types[j]) {
  36. case "boolean":
  37. v = Boolean(Number(val));
  38. break;
  39. case "string":
  40. v = val;
  41. break;
  42. case "number":
  43. v = Number(val);
  44. break;
  45. case "string[]":
  46. v = val.split(";");
  47. break;
  48. case "number[]":
  49. v = val.split(";");
  50. let arr: number[] = [];
  51. for (const info of v) {
  52. arr.push(Number(info));
  53. }
  54. v = arr;
  55. break;
  56. default:
  57. break;
  58. }
  59. obj[keys[j]] = v;
  60. }
  61. const data: DataBase = <DataBase>obj;
  62. this._datas.set(Number(data.id), data);
  63. }
  64. }
  65. //通过id获取某个数据
  66. getData<T extends DataBase>(id: number): T {
  67. return <T>this._datas.get(id);
  68. }
  69. //获取当前文件解析的所有数据
  70. getAllData<T extends DataBase>(): T[] {
  71. return <T[]>Array.from(this._datas.values());
  72. }
  73. }
  74. //管理所有数据操作者
  75. class DataManager {
  76. private _dataCtrls: Map<string, DataCtrl> = new Map();
  77. static instance: DataManager = null;
  78. async loadDataDir(dir: string, onProgress: (
  79. (finish: number, total: number, item: AssetManager.RequestItem) => void) = null) {
  80. const assets: TextAsset[] | JsonAsset[] = await new Promise((values, reject) => {
  81. resources.loadDir(dir,
  82. onProgress, (err: Error, assets: TextAsset[] | JsonAsset[]) => {
  83. if (err) {
  84. reject(err);
  85. }
  86. else {
  87. values(assets);
  88. }
  89. })
  90. })
  91. for (const asset of assets) {
  92. this._dataCtrls.set(asset.name, new DataCtrl(asset));
  93. }
  94. }
  95. getData<T extends DataBase>(id: number, ctrlName?: string): T {
  96. //通过文件名 获取 数据操作者
  97. if (ctrlName) {
  98. return this._dataCtrls.get(ctrlName).getData<T>(id);
  99. }
  100. //遍历所有的数据操作者 看看谁有id 为 id 的数据
  101. for (const ctrl of Array.from(this._dataCtrls.values())) {
  102. const data = ctrl.getData<T>(id);
  103. if (data) { return data; }
  104. }
  105. //都没有
  106. return null;
  107. }
  108. getAllDataByName<T extends DataBase>(name: string): T[] {
  109. //获取文件名为 name 的数据操作者的所有数据
  110. return this._dataCtrls.get(name).getAllData<T>();
  111. }
  112. }
  113. export const dataMgr: DataManager = DataManager.instance = new DataManager();