작성
·
66
·
수정됨
0
제가 기존에 개발해둔 아이템 시스템을 연동시키면서 아이템의 스텟을 정할때 Resources/Stat폴더를 참조하고 그걸 기반으로 Enum으로 해당 스텟들이 있는 스크립트 파일을 만든 다음에 아래에 있는 버튼을 눌러서 일일히 Enum 파일을 동기화시켰는데 너무 번거로운것 같습니다. 생성, 삭제, 수정할때마다 동기화시키면 작업할때마다 딜레이가 너무 커지는데 다른 방법이 있을까요
if (dataType == typeof(Stat))
{
GUI.color = Color.yellow;
// Data를 이름 순으로 정렬하는 Button을 그림
if (GUILayout.Button($"Press it after you finish editing"))
{
StatEnumSynchronizer.SyncStatEnum();
EditorUtility.SetDirty(database);
AssetDatabase.SaveAssets();
}
}
아래는 해당 enum파일을 만드는 스크립트입니다.
using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
public static class StatEnumSynchronizer
{
private const string StatFolderPath = "Assets/Resources/Stat";
[MenuItem("Tools/Sync Stat Enum")]
public static void SyncStatEnum()
{
if (!Directory.Exists(StatFolderPath))
{
Debug.LogError($"Directory does not exist: {StatFolderPath}");
return;
}
var statFiles = Directory.GetFiles(StatFolderPath, "*.asset", SearchOption.TopDirectoryOnly);
var statCodeNames = statFiles
.Select(file => AssetDatabase.LoadAssetAtPath<Stat>(file))
.Where(stat => stat != null)
.Select(stat => stat.CodeName)
.Distinct()
.OrderBy(name => name)
.ToList();
string enumPath = "Assets/Scripts/Enum/ItemStatusAttribute.cs";
using (var writer = new StreamWriter(enumPath, false))
{
writer.WriteLine("public enum ItemStatusAttribute");
writer.WriteLine("{");
writer.WriteLine(" Default,");
foreach (var codeName in statCodeNames)
{
string enumName = SanitizeEnumName(codeName);
writer.WriteLine($" {enumName},");
}
writer.WriteLine("}");
}
AssetDatabase.Refresh();
Debug.Log("Stat Enum synchronized.");
}
private static string SanitizeEnumName(string name)
{
return new string(name
.Where(c => !char.IsWhiteSpace(c) && (char.IsLetterOrDigit(c) || c == '_'))
.ToArray())
.Replace(" ", "_")
.Replace("-", "_")
.ToUpper();
}
}
맞습니다. 장착 Item이 Bonus를 줄 Stat들을 가지고 있고, Item 장착 시에 해당하는 Entitiy의 Stat 증감 시켜주면 됩니다.