using System.Collections.Generic; using System.IO; using Newtonsoft.Json.Linq; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace BlueWater.Items { [CreateAssetMenu(fileName = "ItemDropTable", menuName = "ScriptableObjects/ItemDropTable")] public class ItemDropTableSo : DataSo // DataSo를 상속 { private const string ItemDropJsonPath = "Assets/Resources/Json/ItemDropTable.json"; private const string CharacterDataJsonPath = "Assets/Resources/Json/CharacterData.json"; private const string FilePath = "Assets/02.Scripts/ScriptableObject/Item/ItemDropTable.asset"; #if UNITY_EDITOR [MenuItem("Tools/ItemDropTable ScriptableObject 생성")] private static void CreateItemDropTable() { var itemDropJsonContent = File.ReadAllText(ItemDropJsonPath); var characterDataJsonContent = File.ReadAllText(CharacterDataJsonPath); var instance = CreateFromJson(itemDropJsonContent, characterDataJsonContent); AssetDatabase.CreateAsset(instance, FilePath); AssetDatabase.SaveAssets(); Debug.Log("ItemDropTable ScriptableObject created successfully."); } #endif private static ItemDropTableSo CreateFromJson(string itemDropJsonString, string characterDataJsonString) { var itemDropTableSo = CreateInstance(); var newItemDropTables = ParseJsonToCharacterDrops(itemDropJsonString, characterDataJsonString); // Dictionary로 변환하여 직렬화 가능한 리스트에 추가 var serializedDataList = new List>(); foreach (var kvp in newItemDropTables) { serializedDataList.Add(new SerializableKeyValuePair { Key = kvp.Key, Value = kvp.Value }); } itemDropTableSo.SetSerializedDataList(serializedDataList); return itemDropTableSo; } private static Dictionary ParseJsonToCharacterDrops(string itemDropJsonString, string characterDataJsonString) { var itemDropTables = new Dictionary(); var characterDataDictionary = ParseCharacterDataJson(characterDataJsonString); var jsonArray = JArray.Parse(itemDropJsonString); foreach (var element in jsonArray) { var characterIdx = (string)element["CharacterIdx"]; var dropItem = new DropItem { ItemIdx = (string)element["ItemIdx"], DropRate = (int)element["DropRate"], QuantityMin = (int)element["QuantityMin"], QuantityMax = (int)element["QuantityMax"] }; if (!itemDropTables.ContainsKey(characterIdx)) { var characterName = characterDataDictionary.GetValueOrDefault(characterIdx, "Unknown"); itemDropTables[characterIdx] = new ItemDropTable(new CharacterData(characterIdx, characterName)); } itemDropTables[characterIdx].DropItems.Add(dropItem); } return itemDropTables; } private static Dictionary ParseCharacterDataJson(string characterDataJsonString) { var characterDataDictionary = new Dictionary(); var jsonArray = JArray.Parse(characterDataJsonString); foreach (var element in jsonArray) { var characterIdx = (string)element["CharacterIdx"]; var name = (string)element["Name"]; characterDataDictionary[characterIdx] = name; } return characterDataDictionary; } } }