Created
November 29, 2024 15:36
-
-
Save FUJI-bayashi/f1a8821c8c99cdddec3a4101c57aaeae to your computer and use it in GitHub Desktop.
AudioManager_KanKikuchiという神アセットを参考に作ったものです。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using UnityEditor; | |
| using UnityEngine; | |
| using System.IO; | |
| using System.Linq; | |
| using System.Collections.Generic; | |
| using System.Text.RegularExpressions; | |
| using System; | |
| using static MyUtils; | |
| /// <summary> | |
| /// 指定されたディレクトリ内の.csvファイル名からEnumを自動生成するスクリプト | |
| /// </summary> | |
| public class CSVFileNameEnumCreator : AssetPostprocessor | |
| { | |
| // 対象となるディレクトリパス | |
| public static readonly string TARGET_DIRECTORY_ROOT_PATH = "LOCALIZE/Files"; | |
| const string ENUM_CLASS_NAME = "CSVType"; | |
| const string ENUM_FILE_NAME = "CSVType.cs"; | |
| const string CSV_FILE_TYPE = ".csv"; | |
| const string LANGUAGE_PATTERN = @"^(en|ja|ko|id|sw|tl|es|fr|de|ru|pt|it|zh_CN|zh_TW|sv|no|da|fi)_"; | |
| const string NUMBER_PATTERN = @"_(\d+)_"; | |
| const string PATH_PREFIX = "Assets"; | |
| const int BASE_VALUE = 900000; // ここを変更する場合はCSVProcessor内も変更する必要あり | |
| const int INCREMENT = 100; | |
| #if !UNITY_CLOUD_BUILD | |
| /// <summary> | |
| /// ディレクトリが変更されたときに自動でEnumを生成 | |
| /// </summary> | |
| private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) | |
| { | |
| List<string[]> assetsList = new List<string[]>() { | |
| importedAssets, deletedAssets, movedAssets, movedFromAssetPaths | |
| }; | |
| // ディレクトリ内の変更があった場合にEnumを生成------------------------------------- | |
| if (ExistsPathInAssets(assetsList, TARGET_DIRECTORY_ROOT_PATH)) | |
| { | |
| CreateEnumFromDirectory(); | |
| return; | |
| } | |
| foreach (string lang in Enum.GetNames(typeof(LanguageState))) | |
| { | |
| if (ExistsPathInAssets(assetsList, $"{TARGET_DIRECTORY_ROOT_PATH}/{lang}")) | |
| { | |
| Debug.Log($"***{TARGET_DIRECTORY_ROOT_PATH}/{lang}"); | |
| CreateEnumFromDirectory(); | |
| return; | |
| } | |
| } | |
| } | |
| /// <summary> | |
| /// 指定したパスが含まれるものがあるかどうかをチェック | |
| /// </summary> | |
| static bool ExistsPathInAssets(List<string[]> assetPathsList, string targetPath) | |
| { | |
| return assetPathsList.Any(assetPaths => assetPaths.Any(assetPath => assetPath.Contains(targetPath))); | |
| } | |
| #endif | |
| /// <summary> | |
| /// Enumの生成 | |
| /// </summary> | |
| [MenuItem("Tools/CSVNameEnumCreator/Create Enum From CSV Files")] | |
| private static void CreateEnumFromDirectory() | |
| { | |
| var enumEntries = new Dictionary<string, string>(); // Dictionaryを使用 | |
| enumEntries["None"] = "0"; // 'None = 0' を先頭に追加 | |
| int nextValue = BASE_VALUE; | |
| // 言語ごとのフォルダをループして処理 | |
| foreach (string lang in Enum.GetNames(typeof(LanguageState))) | |
| { | |
| string langFolderPath = Path.Combine(Application.dataPath, TARGET_DIRECTORY_ROOT_PATH, lang); | |
| if (Directory.Exists(langFolderPath)) | |
| { | |
| var fileEntries = Directory.GetFiles(langFolderPath) | |
| .Where(filePath => filePath.EndsWith(CSV_FILE_TYPE)) | |
| .Select(filePath => Path.GetFileNameWithoutExtension(filePath)) | |
| .Distinct(); | |
| foreach (var fileName in fileEntries) | |
| { | |
| string enumEntry = ProcessFileName(fileName, ref nextValue); | |
| string enumName = enumEntry.Split('=')[0].Trim(); | |
| if (!enumEntries.ContainsKey(enumName)) | |
| { | |
| enumEntries[enumName] = enumEntry.Split('=')[1].Trim(); | |
| } | |
| } | |
| } | |
| } | |
| // Enum項目を数値順に並べ替え | |
| var sortedEnumEntries = enumEntries.OrderBy(entry => | |
| { | |
| int.TryParse(entry.Value, out int value); | |
| return value; | |
| }).Select(entry => $"{entry.Key} = {entry.Value}").ToList(); | |
| // Enumコードを生成してファイルに書き込み | |
| string enumCode = $"public enum {ENUM_CLASS_NAME} {{\n" + | |
| string.Join(",\n", sortedEnumEntries) + | |
| "\n}"; | |
| File.WriteAllText(Path.Combine(PATH_PREFIX, TARGET_DIRECTORY_ROOT_PATH, ENUM_FILE_NAME), enumCode); | |
| AssetDatabase.Refresh(); | |
| } | |
| /// <summary> | |
| /// ファイル名を処理してEnum項目の文字列を生成 | |
| /// </summary> | |
| private static string ProcessFileName(string fileName, ref int nextValue) | |
| { | |
| // 言語コードを除去(例: "ja_Filename" -> "Filename") | |
| var langMatch = Regex.Match(fileName, LANGUAGE_PATTERN); | |
| if (langMatch.Success) | |
| { | |
| fileName = fileName.Substring(langMatch.Length); | |
| } | |
| // ファイル名から数値を抽出(例: "Filename_100_Something" -> 100) | |
| var match = Regex.Match(fileName, NUMBER_PATTERN); | |
| int value = match.Success ? int.Parse(match.Groups[1].Value) : nextValue; | |
| if (!match.Success) nextValue += INCREMENT; | |
| return $"{fileName} = {value}"; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment