public static CsvData GetValidCsvData(string csvText, GlobalCCSettings gSettings) { var csvAsList = CsvParser.ReadAsList(csvText); CsvData csvData = new CsvData(); csvData.SetFromList(csvAsList); // END マーカーが有効な場合は END 以下を無視するようにする. if (gSettings.isEndMarkerEnabled) { int endMarkerIndex = gSettings.columnIndexOfEndMarker; string marker = gSettings.endMarker; if (endMarkerIndex < 0 || csvData.col <= endMarkerIndex) { throw new Exception("無効な columnIndexOfEndMarker です: " + endMarkerIndex); } for (int i = 0; i < csvData.row; i++) { if (csvData.Get(i, endMarkerIndex).Trim() == marker) { csvData = csvData.Slice(0, i); break; } } } // 無効な列を除外する csvData = csvData.SliceColumn(gSettings.columnIndexOfTableStart); return(csvData); }
public string GetCsvPath(GlobalCCSettings gSettings) { if (useGSPlugin && tempCsvPath) { return(gSettings.tempCsvPath); } return(csvFilePath); }
public static IEnumerator ExecuteImport(ConvertSetting s) { downloadSuccess = false; yield return(EditorCoroutineRunner.StartCoroutine(ExecuteDownload(s))); if (!downloadSuccess) { yield break; } CreateAssetsJob createAssetsJob = new CreateAssetsJob(s); // Generate Code if type script is not found. Type assetType; if (s.isEnum || !CsvConvert.TryGetTypeWithError(s.className, out assetType, s.checkFullyQualifiedName, dialog: false)) { GlobalCCSettings gSettings = CCLogic.GetGlobalSettings(); GenerateOneCode(s, gSettings); if (!s.isEnum) { EditorUtility.DisplayDialog( "Code Generated", "Please reimport for creating assets after compiling", "ok" ); } } // Create Assets else { createAssetsJob.Execute(); } // AfterImport 処理 for (int i = 0; i < s.executeAfterImport.Count; i++) { var afterSettings = s.executeAfterImport[i]; if (afterSettings != null) { yield return(EditorCoroutineRunner.StartCoroutine(ExecuteImport(afterSettings))); } } }
public static IEnumerator ExecuteDownload(ConvertSetting s) { GSPluginSettings.Sheet sheet = new GSPluginSettings.Sheet(); sheet.sheetId = s.sheetID; sheet.gid = s.gid; GlobalCCSettings gSettings = CCLogic.GetGlobalSettings(); string csvPath = s.GetCsvPath(gSettings); if (string.IsNullOrWhiteSpace(csvPath)) { Debug.LogError("unexpected downloadPath: " + csvPath); downloadSuccess = false; yield break; } string absolutePath = CCLogic.GetFilePathRelativesToAssets(s.GetDirectoryPath(), csvPath); // 先頭の Assets を削除する if (absolutePath.StartsWith("Assets" + Path.DirectorySeparatorChar)) { sheet.targetPath = absolutePath.Substring(6); } else { Debug.LogError("unexpected downloadPath: " + absolutePath); downloadSuccess = false; yield break; } sheet.isCsv = true; sheet.verbose = false; string title = "Google Spreadsheet Loader"; yield return(EditorCoroutineRunner.StartCoroutineWithUI(GSEditorWindow.Download(sheet, s.GetDirectoryPath()), title, true)); // 成功判定を行う. if (GSEditorWindow.previousDownloadSuccess) { downloadSuccess = true; } yield break; }
public void Execute() { GlobalCCSettings gSettings = CCLogic.GetGlobalSettings(); try { CsvConvert.CreateAssets(settings, gSettings); } catch (Exception e) { Debug.LogException(e); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorUtility.ClearProgressBar(); }
public static void CreateAllAssets(ConvertSetting[] setting, GlobalCCSettings gSettings) { try { for (int i = 0; i < setting.Length; i++) { CsvConvert.CreateAssets(setting[i], gSettings); } } catch (Exception e) { Debug.LogException(e); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorUtility.ClearProgressBar(); }
public static void GenerateOneCode(ConvertSetting s, GlobalCCSettings gSettings) { show_progress(s.className, 0, 0, 1); try { CsvConvert.GenerateCode(s, gSettings); } catch (Exception e) { Debug.LogException(e); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); show_progress(s.className, 1, 1, 1); EditorUtility.ClearProgressBar(); }
public static void GenerateAllCode(ConvertSetting[] setting, GlobalCCSettings gSettings) { int i = 0; try { foreach (ConvertSetting s in setting) { show_progress(s.className, (float)i / setting.Length, i, setting.Length); CsvConvert.GenerateCode(s, gSettings); i++; show_progress(s.className, (float)i / setting.Length, i, setting.Length); } } catch (Exception e) { Debug.LogException(e); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorUtility.ClearProgressBar(); }
public static void CreateAssets(ConvertSetting s, GlobalCCSettings gSettings) { string settingPath = s.GetDirectoryPath(); string csvPath = CCLogic.GetFilePathRelativesToAssets(settingPath, s.GetCsvPath(gSettings)); TextAsset textAsset = AssetDatabase.LoadAssetAtPath <TextAsset>(csvPath); if (textAsset == null) { Debug.LogError("Not found : " + csvPath); return; } if (s.isEnum) { return; } // csv ファイルから読み込み CsvData csv = CsvLogic.GetValidCsvData(textAsset.text, gSettings); CsvData contents = csv.Slice(gSettings.rowIndexOfContentStart); Field[] fields = CsvLogic.GetFieldsFromHeader(csv, gSettings); // アセットを生成する. AssetsGenerator assetsGenerator = new AssetsGenerator(s, fields, contents); // カスタムアセットタイプを設定する // これはプロジェクト固有のアセットをテーブルでセット出来るようにする. { Type[] customAssetTypes = new Type[gSettings.customAssetTypes.Length]; for (int i = 0; i < customAssetTypes.Length; i++) { if (TryGetTypeWithError(gSettings.customAssetTypes[i], out var type, s.checkFullyQualifiedName)) { customAssetTypes[i] = type; }
private void OnGUI() { GUILayout.Space(6f); ConvertSetting[] settings = null; if (cachedAllSettings != null) { settings = cachedAllSettings; } // 検索ボックスを表示 GUILayout.BeginHorizontal(); searchTxt = SearchField(searchTxt); searchTxt = searchTxt.ToLower(); GUILayout.EndHorizontal(); if (settings != null) { scrollPosition = GUILayout.BeginScrollView(scrollPosition); for (int i = 0; i < settings.Length; i++) { var s = settings[i]; // 設定が削除されている場合などに対応 if (s == null) { continue; } // 検索ワードチェック if (!string.IsNullOrEmpty(searchTxt)) { if (s.tableGenerate) { if (!searchTxt.IsSubsequence(s.tableAssetName.ToLower())) { continue; } } else { if (!searchTxt.IsSubsequence(s.className.ToLower())) { continue; } } } GUILayout.BeginHorizontal("box"); #if ODIN_INSPECTOR // ------------------------------ // 設定を複製ボタン. // ------------------------------ if (GUILayout.Button("+", GUILayout.Width(20))) { var copied = s.Copy(); var window = CCSettingsEditWindow.OpenWindow(); window.SetNewSettings(copied, s.GetDirectoryPath()); GUIUtility.ExitGUI(); } // ------------------------------ // 設定を編集ボタン. // ------------------------------ var edit = EditorGUIUtility.Load("editicon.sml") as Texture2D; if (GUILayout.Button(edit, GUILayout.Width(20))) { var window = CCSettingsEditWindow.OpenWindow(); window.SetSettings(s); GUIUtility.ExitGUI(); } #endif // ------------------------------ // テーブル名 (enum の場合は enum名) を表示. // クリックして、設定ファイルに飛べるようにする. // ------------------------------ if (s.tableGenerate) { if (GUILayout.Button(s.tableAssetName, "Label")) { EditorGUIUtility.PingObject(s.GetInstanceID()); GUIUtility.ExitGUI(); } } else { if (GUILayout.Button(s.className, "Label")) { EditorGUIUtility.PingObject(s.GetInstanceID()); GUIUtility.ExitGUI(); } } // ------------------------------ // GS Plugin 使う場合のボタン. // // Import ボタン // Open ボタン // ------------------------------ if (s.useGSPlugin) { if (GUILayout.Button("Import", GUILayout.Width(110))) { EditorCoroutineRunner.StartCoroutine(ExecuteImport(s)); GUIUtility.ExitGUI(); } // GS Plugin を使う場合は Open ボタンを用意する. if (s.useGSPlugin) { if (GUILayout.Button("Open", GUILayout.Width(80)) && !isDownloading) { GSUtils.OpenURL(s.sheetID, s.gid); GUIUtility.ExitGUI(); } } if (s.verboseBtn) { if (GUILayout.Button("DownLoad", GUILayout.Width(110))) { EditorCoroutineRunner.StartCoroutine(ExecuteDownload(s)); GUIUtility.ExitGUI(); } } } // ------------------------------ // コード生成ボタン. // v0.1.2 からは Import に置き換え. // ------------------------------ if (s.verboseBtn) { GUI.enabled = s.canGenerateCode; if (GUILayout.Button("Generate Code", GUILayout.Width(110)) && !isDownloading) { GlobalCCSettings gSettings = CCLogic.GetGlobalSettings(); isDownloading = true; GenerateOneCode(s, gSettings); isDownloading = false; GUIUtility.ExitGUI(); } } // ------------------------------ // アセット生成ボタン. // v0.1.2 からは Import に置き換え. // ------------------------------ if (s.verboseBtn) { GUI.enabled = s.canCreateAsset; if (GUILayout.Button("Create Assets", GUILayout.Width(110)) && !isDownloading) { CreateAssetsJob createAssetsJob = new CreateAssetsJob(s); createAssetsJob.Execute(); GUIUtility.ExitGUI(); } } GUI.enabled = true; // ------------------------------ // 成果物参照まど. // ------------------------------ { Object outputRef = null; if (s.join) { outputRef = s.targetTable; } else { string mainOutputPath = CCLogic.GetMainOutputPath(s); if (mainOutputPath != null) { outputRef = AssetDatabase.LoadAssetAtPath <Object>(mainOutputPath); } } EditorGUI.BeginDisabledGroup(true); EditorGUILayout.ObjectField(outputRef, typeof(Object), false, GUILayout.Width(100)); EditorGUI.EndDisabledGroup(); } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); GUILayout.BeginHorizontal("box"); if (GUILayout.Button("Generate All Codes", "LargeButtonMid") && !isDownloading) { GlobalCCSettings gSettings = CCLogic.GetGlobalSettings(); isDownloading = true; GenerateAllCode(settings, gSettings); isDownloading = false; GUIUtility.ExitGUI(); } if (GUILayout.Button("Create All Assets", "LargeButtonMid") && !isDownloading) { GlobalCCSettings gSettings = CCLogic.GetGlobalSettings(); isDownloading = true; CreateAllAssets(settings, gSettings); isDownloading = false; GUIUtility.ExitGUI(); } GUILayout.EndHorizontal(); } }
public static void GenerateCode(ConvertSetting s, GlobalCCSettings gSettings) { string settingPath = s.GetDirectoryPath(); string csvPath = CCLogic.GetFilePathRelativesToAssets(settingPath, s.GetCsvPath(gSettings)); TextAsset textAsset = AssetDatabase.LoadAssetAtPath <TextAsset>(csvPath); if (textAsset == null) { Debug.LogError("Not found : " + csvPath); return; } string directoryPath = CCLogic.GetFullPath(settingPath, s.codeDestination); if (!Directory.Exists(directoryPath)) { Debug.LogError("Not found directory: " + directoryPath); return; } CsvData csv = CsvLogic.GetValidCsvData(textAsset.text, gSettings); if (s.isEnum) { CsvData headers = csv.Slice(gSettings.rowIndexOfName, gSettings.rowIndexOfName + 1); CsvData contents = csv.Slice(gSettings.rowIndexOfEnumContentStart); string code = EnumGenerator.Generate(s.className, headers, contents, s.verbose); string filePath = Path.Combine(directoryPath, s.className + ".cs"); using (StreamWriter writer = File.CreateText(filePath)) { writer.WriteLine(code); } Debug.LogFormat("Create \"{0}\"", filePath); } else { Field[] fields = CsvLogic.GetFieldsFromHeader(csv, gSettings); if (s.classGenerate) { string code = ClassGenerator.GenerateClass(s.className, fields, s.IsPureClass); string filePath = Path.Combine(directoryPath, s.className + ".cs"); using (StreamWriter writer = File.CreateText(filePath)) { writer.WriteLine(code); } Debug.LogFormat("Create \"{0}\"", filePath); } if (s.tableClassGenerate) { int[] keyIndexes = ClassGenerator.FindKeyIndexes(s, fields); string[] keys = s.keys; Field[] key = null; if (keyIndexes.Length > 0) { List <Field> keyFieldList = new List <Field>(); for (int i = 0; i < keyIndexes.Length; i++) { keyFieldList.Add(fields[keyIndexes[i]]); } key = keyFieldList.ToArray(); } string code = ClassGenerator.GenerateTableClass(s, s.TableClassName, key); string filePath = Path.Combine(directoryPath, s.TableClassName + ".cs"); using (StreamWriter writer = File.CreateText(filePath)) { writer.WriteLine(code); } Debug.LogFormat("Create \"{0}\"", filePath); } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public static Field[] GetFieldsFromHeader(CsvData csv, GlobalCCSettings gSettings) { CsvData nameHeaders = csv.Slice(gSettings.rowIndexOfName, gSettings.rowIndexOfName + 1); CsvData typeHeaders = csv.Slice(gSettings.rowIndexOfType, gSettings.rowIndexOfType + 1); var fields = new Field[csv.col]; for (int i = 0; i < fields.Length; i++) { fields[i] = new Field(); } // enabled check if (gSettings.rowIndexOfEnabledColumn != -1) { CsvData enabledHeaders = csv.Slice(gSettings.rowIndexOfEnabledColumn, gSettings.rowIndexOfEnabledColumn + 1); for (int col = 0; col < csv.col; col++) { string enabledCell = enabledHeaders.Get(0, col); if (!GetEnabledColumn(enabledCell)) { fields[col].isValid = false; } } } // get field names; for (int col = 0; col < csv.col; col++) { string fieldName = nameHeaders.Get(0, col); fieldName = fieldName.Trim(); if (fieldName == string.Empty) { fields[col].isValid = false; continue; } fields[col].fieldName = fieldName; } // set field types; for (int col = 0; col < csv.col; col++) { if (!fields[col].isValid) { continue; } string typeName = typeHeaders.Get(0, col).Trim(); if (typeName == string.Empty) { fields[col].isValid = false; continue; } fields[col].typeName = typeName; } return(fields); }
public ResultType CreateCsvAssetAt(int i, GlobalCCSettings gSettings) { ResultType resultType = ResultType.None; int line = i + 2 + 1; if (!checkKeyIsValid(i)) { return(ResultType.SkipNoKey); } string fileName = createAssetName(i); string filePath = Path.Combine(dstFolder, fileName); object data = null; // テーブルのみ作成する場合は ScriptableObject としてではなく // 通常のインスタンスとして作成する. if (setting.IsPureClass) { data = Activator.CreateInstance(assetType); } else { data = AssetDatabase.LoadAssetAtPath(filePath, assetType); if (data == null) { data = ScriptableObject.CreateInstance(assetType); AssetDatabase.CreateAsset(data as UnityEngine.Object, filePath); Debug.LogFormat("Create \"{0}\"", filePath); } else { Debug.LogFormat("Update \"{0}\"", filePath); } } // フィールド名に[]が付いているカラムを先に検索し、配列インスタンスを生成しておく. for (int j = 0; j < content.col; j++) { if (!fields[j].isValid) { continue; } FieldInfo info = assetType.GetField(fields[j].fieldNameWithoutIndexing); // フィールド名が配列要素の場合は配列のデータをセットしておく. if (fields[j].isArrayField) { Type elementType = info.FieldType.GetElementType(); if (elementType != null) { int length = 0; var v = Array.CreateInstance(elementType, length); info.SetValue(data, v); } else { Debug.LogError("不正な配列フィールドの型です:" + info.FieldType); fields[j].isValid = false; } } } // 各列に対して、有効なフィールドのみ値を読み込んで実際のデータに変換し、この行のインスタンス data に代入する. for (int j = 0; j < content.col; j++) { if (!fields[j].isValid) { continue; } FieldInfo info = assetType.GetField(fields[j].fieldNameWithoutIndexing); Type fieldType = fields[j].GetTypeAs(info); // (i, j) セルに格納されている生のテキストデータを fieldType 型に変換する. object value = null; { string sValue = content.Get(i, j); // 文字列型のときは " でラップする. if (fieldType == typeof(string)) { sValue = "\"" + sValue + "\""; } if (sValue == "") { if ((gSettings.logType & ResultType.EmptyCell) != 0) { Debug.LogWarningFormat("{0} {1}行{2}列目: 空の値があります: {3}=\"{4}\"", setting.className, line, j + 1, info.Name, sValue); } } else { value = Str2TypeConverter.Convert(fieldType, sValue); // 基本型で変換できないときは GlobalSettings の customAssetTypes で変換を試みる. if (value == null) { foreach (var type in customAssetTypes) { if (fieldType == type) { value = Str2TypeConverter.LoadAsset(sValue, type); if (value != null) { break; } } } } if (value == null) { if ((gSettings.logType & ResultType.ConvertFails) != 0) { Debug.LogErrorFormat("{0} {1}行{2}列目: 変換に失敗しました: {3}=\"{4}\"", setting.className, line, j + 1, info.Name, sValue); } } } } // フィールド名が配列要素の場合 // もともとの配列データを読み込んで、そこに value を追加した配列を value とする. // TODO 添字を反映させる. if (fields[j].isArrayField) { var t = ((IEnumerable)info.GetValue(data)); Type listType = typeof(List <>); var constructedListType = listType.MakeGenericType(info.FieldType.GetElementType()); var objects = Activator.CreateInstance(constructedListType); IEnumerable <object> infoValue = ((IEnumerable)info.GetValue(data)).Cast <object>(); if (infoValue != null) { for (int k = 0; k < infoValue.Count(); k++) { object obj = infoValue.ElementAt(k); objects.GetType().GetMethod("Add").Invoke(objects, new object[] { obj }); } } objects.GetType().GetMethod("Add").Invoke(objects, new object[] { value }); value = objects.GetType().GetMethod("ToArray").Invoke(objects, new object[] { }); } info.SetValue(data, value); } if (!setting.IsPureClass) { EditorUtility.SetDirty(data as UnityEngine.Object); } if (setting.tableGenerate) { dataList.GetType().GetMethod("Add").Invoke(dataList, new object[] { data }); } else if (setting.join) { object keyValue = data.GetType().GetField(setting.selfJoinKeyField).GetValue(data); var findMethod = tableType.GetMethod(setting.targetFindMethodName); if (findMethod == null) { return(ResultType.JoinNoFindMethod); } object row = findMethod.Invoke(tableInstance, new[] { keyValue }); if (row == null) { resultType |= ResultType.JoinNoReferenceRow; return(resultType); } object levels = levelListInfo.GetValue(row); var addMethod = levels.GetType().GetMethod("Add"); addMethod.Invoke(levels, new[] { data }); // int currentCount = (int) levels.GetType().GetProperty("Count").GetValue(levels); // int index = (int) data.GetType().GetField(setting.joinIndexField).GetValue(data); // // if (currentCount - 1 != index) // { // Debug.Log($"Join {keyValue} <- {index} (current: {currentCount})"); // resultType &= ResultType.JoinIndexMismatch; // } } result.createdRowCount++; return(resultType); }