public static FbsTable GetFbsRootTableDataTypeObj(FbsFile fbsfile) { FbsTable fbsTable = null; foreach (var table in fbsfile.tables) { if (table.tableName == fbsfile.fileName) { fbsTable = table; break; } } return(fbsTable); }
public static FbsFile GenFbsFileObject(ExcelSheetData excelSheetData) { //一个sheet 一个table FbsFile fbsFile = new FbsFile { fileName = excelSheetData.sheetName.Replace("=", "") }; FbsTable fbsTable = new FbsTable { tableName = fbsFile.fileName }; //处理table字段 for (int j = 0; j < excelSheetData.fieldNames.Count; j++) { FbsTableField fbsTableField = new FbsTableField(); fbsTableField.fieldName = excelSheetData.fieldNames[j]; string dataTypeStr = excelSheetData.fieldTypes[j]; TableFileGenerater.GetFbsDataTypeByString(dataTypeStr, ref fbsTableField.fieldType, ref fbsTableField.fieldTypeName, ref fbsTableField.dataType, ref fbsTableField.isArray); fbsTable.fields.Add(fbsTableField); } fbsFile.tables.Add(fbsTable); //添加root_type table FbsTable fbsRootTable = new FbsTable(); fbsRootTable.tableName = "Root_" + fbsFile.fileName; FbsTableField dataField = new FbsTableField(); dataField.fieldName = "data"; dataField.fieldType = FbsFieldType.TABLE; dataField.isArray = true; dataField.fieldTypeName = fbsTable.tableName; fbsRootTable.fields.Add(dataField); fbsFile.tables.Add(fbsRootTable); //root_type fbsFile.root_type = fbsRootTable.tableName; fbsFile.namespaceName = "GameDataTables"; return(fbsFile); }
public static void GenFbsTable(FbsTable fbsTable, ref StringBuilder stringBuilder) { //表结构 if (fbsTable.isOriginalOrder) { stringBuilder.AppendFormat("table {0} (original_order) {1}\n", fbsTable.tableName, "{"); } else { stringBuilder.AppendFormat("table {0} {1}\n", fbsTable.tableName, "{"); } if (fbsTable.fields != null && fbsTable.fields.Count > 0) { int count = fbsTable.fields.Count; for (int i = 0; i < count; i++) { FbsTableField field = fbsTable.fields[i]; GenFbsSchemaField(field, ref stringBuilder); } } stringBuilder.Append("}\n\n"); }
private void OnGUI() { EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Setting"); GUIHelper.DrawFilePick("FlatcPath:", ref FlatBufferToolConfigure.Configure.FlactcPath); EditorGUILayout.Separator(); GUIHelper.DrawFolderPick("ExcelDir:", ref FlatBufferToolConfigure.Configure.ExcelDir); EditorGUILayout.Separator(); GUIHelper.DrawFolderPick("SchemaDir:", ref FlatBufferToolConfigure.Configure.SchemaDir); EditorGUILayout.Separator(); GUIHelper.DrawFolderPick("JsonDir:", ref FlatBufferToolConfigure.Configure.JsonDir); EditorGUILayout.Separator(); GUIHelper.DrawFolderPick("ClassDir:", ref FlatBufferToolConfigure.Configure.ClassDir); EditorGUILayout.Separator(); GUIHelper.DrawFolderPick("BinDir", ref FlatBufferToolConfigure.Configure.BinDir); EditorGUILayout.Separator(); EditorGUILayout.Separator(); GUIHelper.DrawIntField("Excel读取字段名行号:", ref FlatBufferToolConfigure.Configure.fieldNameRow, 150); EditorGUILayout.Separator(); GUIHelper.DrawIntField("Excel读取字段类型行号:", ref FlatBufferToolConfigure.Configure.fieldTypeRow, 150); EditorGUILayout.Separator(); GUIHelper.DrawIntField("Excel读取字段数值开始行号:", ref FlatBufferToolConfigure.Configure.fieldValueRow, 150); if (GUILayout.Button("保存配置")) { FlatBufferToolConfigure.Save(); } EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("重新读取Excel", GUILayout.MaxWidth(100))) { ReadAllExcel(); } if (GUILayout.Button("生成所有表格数据", GUILayout.MaxWidth(150))) { BuildAll(); } if (GUILayout.Button("检查表格格式", GUILayout.MaxWidth(100))) { CheckExcelPattern(); } string btnShowFilter = "显示Excel列表"; Color preColor = GUI.color; GUI.color = ShowExcelInfo ? Color.white : Color.gray; if (GUILayout.Button(btnShowFilter, GUILayout.MaxWidth(100))) { ShowExcelInfo = !ShowExcelInfo; } GUI.color = preColor; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (ShowExcelInfo) { scrollViewPos = GUILayout.BeginScrollView(scrollViewPos); if (ExcelList == null) { ReadAllExcel(); } foreach (var excel in ExcelList) { GUIStyle style = !excel.FoldOpen ? GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTNORMAL) : GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTDIM); excel.FoldOpen = EditorGUILayout.Foldout(excel.FoldOpen, excel.ExcelPath, true, style); if (excel.FoldOpen) { GUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.Width(15)); GUILayout.BeginVertical(); foreach (var sheet in excel.ExcelSheetDatas) { GUIStyle sheetstyle = !sheet.FoldOpen ? GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTNORMAL) : GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTDIM); sheet.FoldOpen = EditorGUILayout.Foldout(sheet.FoldOpen, sheet.SheetData.sheetName, true, sheetstyle); if (sheet.FoldOpen) { GUILayout.BeginHorizontal(); GUILayout.Label("", GUILayout.Width(15)); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Button("导出", GUILayout.Width(100))) { BuildSheet(sheet.SheetData); } GUILayout.EndHorizontal(); int fieldCount = sheet.SheetData.fieldNames.Count; FbsTable fbsTable = TableFileGenerater.GetFbsRootTableDataTypeObj(sheet.FbsObject); if (fbsTable == null) { Debug.LogError("FbsTable is Null!"); return; } GUILayout.BeginHorizontal(GUIHelper.GetStyle(GUIStyleEnum.BLACKSTYLE)); for (int findex = 0; findex < fieldCount; findex++) { float itemWidth = sheet.SheetData.fieldMaxSize[findex] * GUIHelper.FontSize; GUILayout.Label(sheet.SheetData.fieldNames[findex], GUIHelper.GetStyle(GUIStyleEnum.MIDDLETITLE), GUILayout.Width(itemWidth)); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUIHelper.GetStyle(GUIStyleEnum.BLACKSTYLE)); for (int findex = 0; findex < fieldCount; findex++) { float itemWidth = sheet.SheetData.fieldMaxSize[findex] * GUIHelper.FontSize; string typename = TableFileGenerater.GetTableFieldTypeString(fbsTable.fields[findex]); GUILayout.Label(typename, GUIHelper.GetStyle(GUIStyleEnum.MIDDLETITLE), GUILayout.Width(itemWidth)); } GUILayout.EndHorizontal(); for (int vindex = 0; vindex < sheet.SheetData.fieldValues.Count; vindex++) { int dataIndex = Mathf.FloorToInt(vindex % fieldCount); if (dataIndex == 0) { GUILayout.BeginHorizontal(); } float itemWidth = sheet.SheetData.fieldMaxSize[dataIndex] * GUIHelper.FontSize; GUILayout.TextArea(sheet.SheetData.fieldValues[vindex], GUIHelper.GetStyle(GUIStyleEnum.MIDDLETITLE), GUILayout.Width(itemWidth)); if (dataIndex == fieldCount - 1) { GUILayout.EndHorizontal(); } } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } } GUILayout.EndVertical(); GUILayout.EndHorizontal(); } } GUILayout.EndScrollView(); } GUILayout.EndVertical(); }
//生成给定类型table的数组组成的json public static void GenJsonFile(FbsFile fbsfile, List <string> fieldValues, string fileOutDir, ref string jsonPath) { //生成json文件 StringBuilder jsonBuilder = StrBuilder; jsonBuilder.Clear(); jsonBuilder.Append("{\n \"data\":[\n"); FbsTable fbsTable = GetFbsRootTableDataTypeObj(fbsfile); if (fbsTable == null) { Debug.LogErrorFormat("can not find table named ", fbsfile.fileName); return; } int fieldCount = fbsTable.fields.Count; int dataCount = Mathf.FloorToInt(fieldValues.Count / fieldCount); for (int k = 0; k < fieldValues.Count; k++) { string value = fieldValues[k]; int fieldIndex = k % fieldCount; int dataIndex = Mathf.FloorToInt(k / fieldCount); FbsTableField tableField = fbsTable.fields[fieldIndex]; string fieldName = tableField.fieldName; if (fieldIndex == 0) { jsonBuilder.Append(" {\n"); } bool isstring = !(tableField.fieldType == FbsFieldType.SCALAR && tableField.dataType != FbsDataType.STRING); string valuecolon = isstring && !tableField.isArray ? "\"" : ""; string valuearrayL = tableField.isArray ? "[" : ""; string valuearrayR = tableField.isArray ? "]" : ""; string jsonValue = value; if (isstring && tableField.isArray) { string[] condition = { "[/]" }; string[] vs = value.Split(condition, StringSplitOptions.RemoveEmptyEntries); jsonValue = ""; for (int m = 0; m < vs.Length; m++) { jsonValue += "\"" + vs[m] + "\","; } jsonValue = jsonValue.Substring(0, jsonValue.Length - 1); } string lastCommon = (fieldIndex == (fieldCount - 1)) ? "" : ","; jsonBuilder.AppendFormat(" \"{0}\":{1}{2}{3}{4}{5}{6}\n", fieldName, valuearrayL, valuecolon, jsonValue, valuecolon, valuearrayR, lastCommon); if (fieldIndex == fieldCount - 1) { if (dataIndex == dataCount - 1) { jsonBuilder.Append(" }\n"); } else { jsonBuilder.Append(" },\n"); } } } jsonBuilder.Append(" ]\n}"); jsonPath = fileOutDir + "/" + fbsTable.tableName + ".json"; if (!Directory.Exists(fileOutDir)) { Directory.CreateDirectory(fileOutDir); } if (File.Exists(jsonPath)) { File.Delete(jsonPath); } FileStream fs = new FileStream(jsonPath, FileMode.Create); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); sw.Write(jsonBuilder.ToString()); sw.Close(); fs.Close(); jsonBuilder.Clear(); }
//flatbuff schema文件生成 public static void GenFbsSchemaFile(FbsFile fbsFile, string fileOutDir, ref string fileFullpath) { //---------生成FBS文件--------- StringBuilder stringBuilder = StrBuilder; stringBuilder.Clear(); //spacename if (fbsFile.namespaceName != string.Empty) { stringBuilder.AppendFormat("namespace {0};\n\n", fbsFile.namespaceName); } //customAttribute if (fbsFile.customAttributes != null && fbsFile.customAttributes.Count > 0) { for (int i = 0; i < fbsFile.customAttributes.Count; i++) { string field = fbsFile.customAttributes[i]; stringBuilder.AppendFormat("attribute \"{0}\";\n", field); } } //Enums if (fbsFile.enums != null && fbsFile.enums.Count > 0) { for (int i = 0; i < fbsFile.enums.Count; i++) { FbsEnum fbsenum = fbsFile.enums[i]; GenFbsEnum(fbsenum, ref stringBuilder); } } //Structs if (fbsFile.structs != null && fbsFile.structs.Count > 0) { for (int i = 0; i < fbsFile.structs.Count; i++) { FbsStruct fbsStruct = fbsFile.structs[i]; GenFbsStruct(fbsStruct, ref stringBuilder); } } //Unions if (fbsFile.unions != null && fbsFile.unions.Count > 0) { for (int i = 0; i < fbsFile.unions.Count; i++) { FbsUnion fbsUnion = fbsFile.unions[i]; GenFbsUnion(fbsUnion, ref stringBuilder); } } //tables if (fbsFile.tables != null && fbsFile.tables.Count > 0) { for (int i = 0; i < fbsFile.tables.Count; i++) { FbsTable fbstable = fbsFile.tables[i]; GenFbsTable(fbstable, ref stringBuilder); } } //根类型 if (fbsFile.root_type != string.Empty) { stringBuilder.AppendFormat("root_type {0};\n", fbsFile.root_type); } else { Debug.LogError(fbsFile.fileName + " root_type is Empty!!!!"); } // 文件标识 if (fbsFile.file_identifier != string.Empty) { stringBuilder.AppendFormat("file_identifier \"{0}\";\n", fbsFile.file_identifier); } fileFullpath = fileOutDir + "/" + fbsFile.fileName + ".fbs"; if (!Directory.Exists(fileOutDir)) { Directory.CreateDirectory(fileOutDir); } if (File.Exists(fileFullpath)) { File.Delete(fileFullpath); } FileStream fs = new FileStream(fileFullpath, FileMode.Create); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); sw.Write(stringBuilder.ToString()); sw.Close(); fs.Close(); stringBuilder.Clear(); }