DataManager.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { 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. obj[keys[j]] = cols[j];
  33. }
  34. const data: DataBase = <DataBase>obj;
  35. this._datas.set(Number(data.id), data);
  36. }
  37. }
  38. //通过id获取某个数据
  39. getData<T extends DataBase>(id: number):T{
  40. return <T>this._datas.get(id);
  41. }
  42. //获取当前文件解析的所有数据
  43. getAllData<T extends DataBase>(): T[]{
  44. return <T[]>Array.from(this._datas.values());
  45. }
  46. }
  47. //管理所有数据操作者
  48. class DataManager{
  49. private _dataCtrls: Map<string, DataCtrl> = new Map();
  50. static instance: DataManager = null;
  51. async loadDataDir(dir: string){
  52. const assets: TextAsset[] | JsonAsset[] = await new Promise((values, reject)=>{
  53. resources.loadDir(dir,(err: Error, assets: TextAsset[] | JsonAsset[])=>{
  54. if(err){
  55. reject(err);
  56. }
  57. else{
  58. values(assets);
  59. }
  60. })
  61. })
  62. for(const asset of assets){
  63. this._dataCtrls.set(asset.name, new DataCtrl(asset));
  64. }
  65. }
  66. getData<T extends DataBase>(id: number, ctrlName?: string):T{
  67. //通过文件名 获取 数据操作者
  68. if(ctrlName){
  69. return this._dataCtrls.get(ctrlName).getData<T>(id);
  70. }
  71. //遍历所有的数据操作者 看看谁有id 为 id 的数据
  72. for(const ctrl of Array.from(this._dataCtrls.values())){
  73. const data = ctrl.getData<T>(id);
  74. if(data){return data;}
  75. }
  76. //都没有
  77. return null;
  78. }
  79. getAllDataByName<T extends DataBase>(name: string):T[]{
  80. //获取文件名为 name 的数据操作者的所有数据
  81. return this._dataCtrls.get(name).getAllData<T>();
  82. }
  83. }
  84. export const dataMgr: DataManager = DataManager.instance = new DataManager();