123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import { JsonAsset, resources, TextAsset } from "cc";
- export interface DataBase{
- id: number;
- }
- //一个文件 对应一个数据操作者
- class DataCtrl{
- private _datas: Map<number, DataBase> = new Map();
- constructor(asset: JsonAsset | TextAsset){
- if(asset instanceof JsonAsset){
- const datas: DataBase[] = <DataBase[]>asset.json;
- for(const data of datas){
- this._datas.set(Number(data.id), data);
- }
- return;
- }
- //表格数据
- if(asset instanceof TextAsset){
- this._parseCSV(asset.text);
- }
- }
- private _parseCSV(text: string){
- const lines: string[] = text.split("\r\n");
- //表格中 单元格以逗号,分开
- const keys: string[] = lines[0].split(",");
- const types: string[] = lines[1].split(",");
- //有用的数据
- for(let i = 2; i < lines.length - 1; i++){
- const cols: string[] = lines[i].split(",");
- //每一行就是一个数据 创建一个空对象 存储数据
- let obj = {};
- for(let j = 1; j <cols.length; j++){
- //获取当前字符串值 根据类型定数据
- let val = cols[j];
- let v;
- switch(types[j]){
- case "boolean":
- v = Boolean(Number(val));
- break;
- case "string":
- v = val;
- break;
- case "number":
- v = Number(val);
- break;
- case "string[]":
- v = val.split(";");
- break;
- case "number[]":
- v = val.split(";");
- let arr:number[] = [];
- for(const info of v){
- arr.push(Number(info));
- }
- v = arr;
- break;
- default:
- break;
- }
- obj[keys[j]] = v;
- }
- const data: DataBase = <DataBase>obj;
- this._datas.set(Number(data.id), data);
- }
- }
- //通过id获取某个数据
- getData<T extends DataBase>(id: number):T{
- return <T>this._datas.get(id);
- }
- //获取当前文件解析的所有数据
- getAllData<T extends DataBase>(): T[]{
- return <T[]>Array.from(this._datas.values());
- }
- }
- //管理所有数据操作者
- class DataManager{
- private _dataCtrls: Map<string, DataCtrl> = new Map();
- static instance: DataManager = null;
- async loadDataDir(dir: string){
- const assets: TextAsset[] | JsonAsset[] = await new Promise((values, reject)=>{
- resources.loadDir(dir,(err: Error, assets: TextAsset[] | JsonAsset[])=>{
- if(err){
- reject(err);
- }
- else{
- values(assets);
- }
- })
- })
- for(const asset of assets){
- this._dataCtrls.set(asset.name, new DataCtrl(asset));
- }
- }
- getData<T extends DataBase>(id: number, ctrlName?: string):T{
- //通过文件名 获取 数据操作者
- if(ctrlName){
- return this._dataCtrls.get(ctrlName).getData<T>(id);
- }
- //遍历所有的数据操作者 看看谁有id 为 id 的数据
- for(const ctrl of Array.from(this._dataCtrls.values())){
- const data = ctrl.getData<T>(id);
- if(data){return data;}
- }
- //都没有
- return null;
- }
- getAllDataByName<T extends DataBase>(name: string):T[]{
- //获取文件名为 name 的数据操作者的所有数据
- return this._dataCtrls.get(name).getAllData<T>();
- }
- }
- export const dataMgr: DataManager = DataManager.instance = new DataManager();
|