Skip to content

Instantly share code, notes, and snippets.

@FUJI-bayashi
Created November 29, 2024 15:36
Show Gist options
  • Select an option

  • Save FUJI-bayashi/f1a8821c8c99cdddec3a4101c57aaeae to your computer and use it in GitHub Desktop.

Select an option

Save FUJI-bayashi/f1a8821c8c99cdddec3a4101c57aaeae to your computer and use it in GitHub Desktop.
AudioManager_KanKikuchiという神アセットを参考に作ったものです。
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