using System.Collections.Generic; using System.IO; using BlueWater.Items; using Newtonsoft.Json.Linq; using UnityEditor; using UnityEngine; namespace BlueWater { public class ItemDropTableSo : ScriptableObject { // public 필수 public List ItemDropTables = new(); 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"; [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 in ItemDropTableScriptableObject class."); } private static ItemDropTableSo CreateFromJson(string itemDropJsonString, string characterDataJsonString) { var itemDropTables = ParseJsonToCharacterDrops(itemDropJsonString, characterDataJsonString); var instance = CreateInstance(); instance.ItemDropTables = itemDropTables; return instance; } private static List ParseJsonToCharacterDrops(string itemDropJsonString, string characterDataJsonString) { var newItemDropTables = new List(); var itemDropTables = new Dictionary(); var characterDataDictionary = ParseCharacterDataJson(characterDataJsonString); var jsonArray = JArray.Parse(itemDropJsonString); foreach (var element in jsonArray) { var characterIdx = (int)element["CharacterIdx"]; var dropItem = new DropItem { ItemIdx = (int)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); } newItemDropTables.AddRange(itemDropTables.Values); return newItemDropTables; } private static Dictionary ParseCharacterDataJson(string characterDataJsonString) { var characterDataDictionary = new Dictionary(); var jsonArray = JArray.Parse(characterDataJsonString); foreach (var element in jsonArray) { var characterIdx = (int)element["CharacterIdx"]; var name = (string)element["Name"]; characterDataDictionary[characterIdx] = name; } return characterDataDictionary; } } }