구글 시트 매니저 기능 변경

#필드 생성 처리 방지
This commit is contained in:
NTG_DESKTOP 2025-07-28 06:10:42 +09:00
parent 0630680f5e
commit 3d4d0efdfe

View File

@ -9,13 +9,10 @@
using UnityEngine;
using Newtonsoft.Json.Linq;
using System.Linq;
using DDD;
using JetBrains.Annotations;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;
using ColorUtility = UnityEngine.ColorUtility;
public class GoogleSheetManager : Singleton<GoogleSheetManager>
@ -33,8 +30,8 @@ public class GoogleSheetManager : Singleton<GoogleSheetManager>
private string _namespace = "DDD";
[BoxGroup("기본 설정")]
[SerializeField, Tooltip("적용시킬 시트의 이름을 적고, 여러 개의 시트를 적는 경우 '/'로 구분지어 시트 나열\nex) \"Sheet1/Sheet2\"")]
private string _availSheets = "Sheet1/Sheet2";
[SerializeField, Tooltip("적용시킬 시트의 이름")]
private List<string> _availSheets = new(){ "Sheet1", "Sheet2" };
[BoxGroup("기본 설정")]
[SerializeField, Tooltip("Class, Json, So 생성 위치 \"/GenerateGoogleSheet\"")]
@ -70,28 +67,11 @@ public class GoogleSheetManager : Singleton<GoogleSheetManager>
private bool _alreadyCreatedSo;
public static async Task<T> LoadSo<T>() where T : ScriptableObject
{
await Addressables.InitializeAsync().Task;
string key = typeof(T).Name;
var handle = Addressables.LoadAssetAsync<T>(key);
await handle.Task;
if (handle.Status == AsyncOperationStatus.Succeeded)
return handle.Result;
Debug.LogError($"[GoogleSheetManager] Addressable 로드 실패: {key}");
return null;
}
#if UNITY_EDITOR || DEVELOPMENT_BUILD
[BoxGroup("데이터 변경")]
[Button("데이터 최신화"), EnableIf(nameof(CanFetchData))]
private async Task FetchGoogleSheet()
{
_availSheetArray = _availSheets.Split('/');
var prevLog = AssetDatabase.LoadAssetAtPath<GoogleSheetChangeLog>(ChangeLogAssetPath);
string previousJson = prevLog?.Logs.LastOrDefault()?.JsonSnapshot ?? "";
@ -333,7 +313,7 @@ private bool SaveFileOrSkip(string path, string contents)
private bool IsExistAvailSheets(string sheetName)
{
return Array.Exists(_availSheetArray, x => x == sheetName);
return _availSheets.Contains(sheetName);
}
/// <summary>
@ -366,6 +346,9 @@ private void GenerateClassFilesPerSheet(string jsonInput)
{
string rawName = property.Name;
string enumType = null;
// 🔽 #으로 시작하는 보기용 컬럼은 무시
if (rawName.StartsWith("#")) continue;
// ✅ 단일 필드 Enum: Cookware:Enum
if (rawName.Contains(":Enum"))
@ -480,51 +463,49 @@ private string GenerateDataClassCode(string className, JArray items)
sb.AppendLine($" public class {className} : IId");
sb.AppendLine(" {");
int count = sampleRow.Properties().Count();
string[] types = new string[count];
string[] names = new string[count];
string[] tooltips = new string[count];
List<string> types = new();
List<string> names = new();
List<string> tooltips = new();
foreach (JToken item in items.Skip(1))
foreach (var prop in sampleRow.Properties())
{
int i = 0;
foreach (var prop in ((JObject)item).Properties())
string rawName = prop.Name;
// 무시할 컬럼이면 continue
if (rawName.StartsWith("#")) continue;
string fieldName = rawName;
string explicitType = null;
if (rawName.Contains(":Enum"))
{
string rawName = prop.Name;
string fieldName = rawName;
string explicitType = null;
if (rawName.Contains(":Enum"))
{
fieldName = rawName.Split(':')[0];
explicitType = fieldName;
}
else if (rawName.Contains(":") && rawName.EndsWith("_Enum"))
{
var parts = rawName.Split(':');
fieldName = parts[0];
explicitType = parts[1].Replace("_Enum", "");
}
else if (rawName.Contains(":NativeEnum"))
{
fieldName = rawName.Split(':')[0];
explicitType = fieldName;
}
else if (rawName.Contains(":"))
{
var parts = rawName.Split(':');
fieldName = parts[0];
explicitType = parts[1];
}
types[i] = explicitType ?? GetCSharpType(prop.Value.Type);
names[i] = fieldName;
tooltips[i] ??= commentRow.TryGetValue(rawName, out var tip) ? tip.ToString() : "";
i++;
fieldName = rawName.Split(':')[0];
explicitType = fieldName;
}
else if (rawName.Contains(":") && rawName.EndsWith("_Enum"))
{
var parts = rawName.Split(':');
fieldName = parts[0];
explicitType = parts[1].Replace("_Enum", "");
}
else if (rawName.Contains(":NativeEnum"))
{
fieldName = rawName.Split(':')[0];
explicitType = fieldName;
}
else if (rawName.Contains(":"))
{
var parts = rawName.Split(':');
fieldName = parts[0];
explicitType = parts[1];
}
types.Add(explicitType ?? GetCSharpType(prop.Value.Type));
names.Add(fieldName);
tooltips.Add(commentRow.TryGetValue(rawName, out var tip) ? tip.ToString() : "");
}
for (int i = 0; i < count; i++)
for (int i = 0; i < names.Count; i++)
{
if (!string.IsNullOrWhiteSpace(tooltips[i]))
{
@ -671,6 +652,9 @@ private async Task<bool> InternalCreateGoogleSheetSoAsync()
string rawName = prop.Name;
string fieldName = rawName;
string explicitType = null;
// 🔽 보기용 컬럼 무시
if (rawName.StartsWith("#")) continue;
if (rawName.Contains(":Enum"))
{