Exemple #1
0
        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;
        }
Exemple #5
0
        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();
        }
Exemple #9
0
        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();
            }
        }
Exemple #11
0
        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();
        }
Exemple #12
0
        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);
        }
Exemple #13
0
        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);
        }