From 3d54e764bcdc4369e1bb29d41b3e0b2c18f667ca Mon Sep 17 00:00:00 2001 From: NTG_Lenovo Date: Mon, 21 Jul 2025 19:51:11 +0900 Subject: [PATCH 1/4] =?UTF-8?q?DDD-64=20=EC=95=84=EC=9D=B4=ED=85=9C=20?= =?UTF-8?q?=EC=9D=B8=EB=B2=A4=ED=86=A0=EB=A6=AC=20=EC=8B=9C=EC=8A=A4?= =?UTF-8?q?=ED=85=9C=20=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_Scripts/GameData/InventoryItemData.cs | 14 +++ .../_Scripts/GameData/InventoryManager.cs | 97 +++++++++++++++++++ Assets/_DDD/_Scripts/GameEvent/GameEvents.cs | 5 + .../GenerateGoogleSheet/Core/DataSo.cs | 2 + 4 files changed, 118 insertions(+) create mode 100644 Assets/_DDD/_Scripts/GameData/InventoryItemData.cs create mode 100644 Assets/_DDD/_Scripts/GameData/InventoryManager.cs diff --git a/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs b/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs new file mode 100644 index 000000000..2f73efa4b --- /dev/null +++ b/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs @@ -0,0 +1,14 @@ +namespace DDD +{ + public class InventoryItemData : IId + { + public string Id { get; set; } + public int Quantity { get; set; } + + public InventoryItemData(string id, int quantity) + { + Id = id; + Quantity = quantity; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameData/InventoryManager.cs b/Assets/_DDD/_Scripts/GameData/InventoryManager.cs new file mode 100644 index 000000000..6f4c83014 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameData/InventoryManager.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEngine; + +namespace DDD +{ + public class InventoryManager : Singleton, IManager + { + private Dictionary _itemDataLookup; + private Dictionary _inventoryItemDatas; + + public void PreInit() + { + + } + + public Task Init() + { + return Task.CompletedTask; + } + + public void PostInit() + { + InitializeItemData(); + } + + private void InitializeItemData() + { + var itemDataSo = DataManager.Instance.ItemDataSo; + + Debug.Assert(itemDataSo != null, "itemDataSo != null"); + + _itemDataLookup = itemDataSo.GetDataList() + .Where(item => !string.IsNullOrEmpty(item.Id)) + .ToDictionary(item => item.Id, item => item); + + _inventoryItemDatas = new Dictionary(itemDataSo.GetDataCount()); + } + + public bool AddItem(string id, int quantity = 1) + { + if (!_itemDataLookup.ContainsKey(id)) + { + Debug.LogError($"[Inventory] 등록되지 않은 아이템 ID: {id}"); + return false; + } + + if (_inventoryItemDatas.TryGetValue(id, out var itemData)) + { + itemData.Quantity += quantity; + } + else + { + _inventoryItemDatas[id] = new InventoryItemData(id, quantity); + } + + EventBus.Broadcast(new InventoryChangedEvent()); + return true; + } + + public bool RemoveItem(string id, int quantity = 1) + { + if (!_inventoryItemDatas.TryGetValue(id, out var itemData)) + { + Debug.LogError($"[Inventory] 등록되지 않은 아이템 ID: {id}"); + return false; + } + + if (itemData.Quantity < quantity) + { + Debug.LogWarning($"[Inventory] 보유 수량보다 삭제하는 수량이 더 많습니다 " + + $"{id}, 보유 수량 : {itemData.Quantity}, 삭제 수량 : {quantity}"); + return false; + } + + itemData.Quantity -= quantity; + + if (itemData.Quantity <= 0) + { + _inventoryItemDatas.Remove(id); + } + + EventBus.Broadcast(new InventoryChangedEvent()); + return true; + } + + public IReadOnlyDictionary InventoryItems => _inventoryItemDatas; + public bool TryGetItemData(string id, out ItemData itemData) => _itemDataLookup.TryGetValue(id, out itemData); + public int GetItemCount(string id) => _inventoryItemDatas.TryGetValue(id, out var itemData) ? itemData.Quantity : 0; + public ItemData GetItemDataByIdOrNull(string id) + { + _itemDataLookup.TryGetValue(id, out var itemData); + return itemData; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs b/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs index 9f26685c4..5e838add3 100644 --- a/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs +++ b/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs @@ -20,4 +20,9 @@ public class InteractionEvent : IEvent public GameObject Causer; public GameObject Target; } + + public class InventoryChangedEvent : IEvent + { + + } } diff --git a/Assets/_DDD/_Scripts/GenerateGoogleSheet/Core/DataSo.cs b/Assets/_DDD/_Scripts/GenerateGoogleSheet/Core/DataSo.cs index 88d39826a..8598c3e71 100644 --- a/Assets/_DDD/_Scripts/GenerateGoogleSheet/Core/DataSo.cs +++ b/Assets/_DDD/_Scripts/GenerateGoogleSheet/Core/DataSo.cs @@ -20,5 +20,7 @@ public List GetDataList() { return Datas; } + + public int GetDataCount() => Datas.Count; } } \ No newline at end of file From cc0459eb338b23f232fedb6d6b19e265111b5d16 Mon Sep 17 00:00:00 2001 From: NTG_Lenovo Date: Mon, 21 Jul 2025 19:51:22 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=97=90=EC=85=8B=20=EB=B0=8F=20=EB=A9=94?= =?UTF-8?q?=ED=83=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Prefabs/InventoryManager.prefab | 47 +++++++++++++++++++ .../Prefabs/InventoryManager.prefab.meta | 7 +++ .../GameData/InventoryItemData.cs.meta | 3 ++ .../GameData/InventoryManager.cs.meta | 2 + 4 files changed, 59 insertions(+) create mode 100644 Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab create mode 100644 Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab.meta create mode 100644 Assets/_DDD/_Scripts/GameData/InventoryItemData.cs.meta create mode 100644 Assets/_DDD/_Scripts/GameData/InventoryManager.cs.meta diff --git a/Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab b/Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab new file mode 100644 index 000000000..d129e1fbd --- /dev/null +++ b/Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8506009925984544825 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1612822500460089190} + - component: {fileID: 5539371897028506726} + m_Layer: 0 + m_Name: InventoryManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1612822500460089190 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8506009925984544825} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5539371897028506726 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8506009925984544825} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c5382d2944fd05940b84bd44b641d198, type: 3} + m_Name: + m_EditorClassIdentifier: + _persistent: 1 diff --git a/Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab.meta b/Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab.meta new file mode 100644 index 000000000..cb9adbe36 --- /dev/null +++ b/Assets/_DDD/_ScriptAssets/Prefabs/InventoryManager.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 21cff8c1505cd8041a474795e35e0192 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs.meta b/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs.meta new file mode 100644 index 000000000..0a70d0390 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 55253b10460c49dcb72e484467bf8ca5 +timeCreated: 1753093577 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameData/InventoryManager.cs.meta b/Assets/_DDD/_Scripts/GameData/InventoryManager.cs.meta new file mode 100644 index 000000000..88f0cc2e1 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameData/InventoryManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c5382d2944fd05940b84bd44b641d198 \ No newline at end of file From 02c675ed3f5f590caa86ccdb659807fdc4e3581c Mon Sep 17 00:00:00 2001 From: NTG_Lenovo Date: Tue, 22 Jul 2025 12:38:48 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=95?= =?UTF-8?q?=EC=A0=81=20=ED=98=B8=EC=B6=9C=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F?= =?UTF-8?q?=20=ED=8F=B4=EB=8D=94=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/_DDD/_Scripts/GameEvent/GameEvents.cs | 8 +++----- .../_Scripts/{GameData => GameState}/InventoryItemData.cs | 0 .../_Scripts/{GameData => GameState}/InventoryManager.cs | 6 ++++-- 3 files changed, 7 insertions(+), 7 deletions(-) rename Assets/_DDD/_Scripts/{GameData => GameState}/InventoryItemData.cs (100%) rename Assets/_DDD/_Scripts/{GameData => GameState}/InventoryManager.cs (93%) diff --git a/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs b/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs index 5e838add3..9e7f67ecb 100644 --- a/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs +++ b/Assets/_DDD/_Scripts/GameEvent/GameEvents.cs @@ -4,7 +4,8 @@ namespace DDD { public static class GameEvents { - public static InteractionEvent Interaction = new InteractionEvent(); + public static InventoryChangedEvent InventoryChangedEvent = new(); + public static InteractionEvent Interaction = new(); } public static class RestaurantEvents { @@ -21,8 +22,5 @@ public class InteractionEvent : IEvent public GameObject Target; } - public class InventoryChangedEvent : IEvent - { - - } + public class InventoryChangedEvent : IEvent { } } diff --git a/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs b/Assets/_DDD/_Scripts/GameState/InventoryItemData.cs similarity index 100% rename from Assets/_DDD/_Scripts/GameData/InventoryItemData.cs rename to Assets/_DDD/_Scripts/GameState/InventoryItemData.cs diff --git a/Assets/_DDD/_Scripts/GameData/InventoryManager.cs b/Assets/_DDD/_Scripts/GameState/InventoryManager.cs similarity index 93% rename from Assets/_DDD/_Scripts/GameData/InventoryManager.cs rename to Assets/_DDD/_Scripts/GameState/InventoryManager.cs index 6f4c83014..dea0b09be 100644 --- a/Assets/_DDD/_Scripts/GameData/InventoryManager.cs +++ b/Assets/_DDD/_Scripts/GameState/InventoryManager.cs @@ -55,7 +55,8 @@ public bool AddItem(string id, int quantity = 1) _inventoryItemDatas[id] = new InventoryItemData(id, quantity); } - EventBus.Broadcast(new InventoryChangedEvent()); + InventoryChangedEvent evt = GameEvents.InventoryChangedEvent; + EventBus.Broadcast(evt); return true; } @@ -81,7 +82,8 @@ public bool RemoveItem(string id, int quantity = 1) _inventoryItemDatas.Remove(id); } - EventBus.Broadcast(new InventoryChangedEvent()); + InventoryChangedEvent evt = GameEvents.InventoryChangedEvent; + EventBus.Broadcast(evt); return true; } From ddf744ade4fd5c48d4d124641e2b8cda609ea5f8 Mon Sep 17 00:00:00 2001 From: NTG_Lenovo Date: Tue, 22 Jul 2025 12:38:56 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EB=A9=94=ED=83=80=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/_DDD/_ScriptAssets/So/ManagerDefinitionSo.asset | 1 + Assets/_DDD/_Scripts/GameState.meta | 8 ++++++++ .../{GameData => GameState}/InventoryItemData.cs.meta | 0 .../{GameData => GameState}/InventoryManager.cs.meta | 0 4 files changed, 9 insertions(+) create mode 100644 Assets/_DDD/_Scripts/GameState.meta rename Assets/_DDD/_Scripts/{GameData => GameState}/InventoryItemData.cs.meta (100%) rename Assets/_DDD/_Scripts/{GameData => GameState}/InventoryManager.cs.meta (100%) diff --git a/Assets/_DDD/_ScriptAssets/So/ManagerDefinitionSo.asset b/Assets/_DDD/_ScriptAssets/So/ManagerDefinitionSo.asset index dbf7c842c..f0ca90ca5 100644 --- a/Assets/_DDD/_ScriptAssets/So/ManagerDefinitionSo.asset +++ b/Assets/_DDD/_ScriptAssets/So/ManagerDefinitionSo.asset @@ -19,4 +19,5 @@ MonoBehaviour: - {fileID: 7665229218737596710, guid: 71b177c2a18314c588da30429451666a, type: 3} - {fileID: 622422277636247943, guid: d95124918e5a4a246abb0d378b14d3fa, type: 3} - {fileID: 5136368050551183548, guid: 0aa6654feb91ef040b8b99d4f64688fc, type: 3} + - {fileID: 5539371897028506726, guid: 21cff8c1505cd8041a474795e35e0192, type: 3} - {fileID: 8500549904376788358, guid: d81cf4649bf54485a8b0da7a235f3817, type: 3} diff --git a/Assets/_DDD/_Scripts/GameState.meta b/Assets/_DDD/_Scripts/GameState.meta new file mode 100644 index 000000000..c962e2b7c --- /dev/null +++ b/Assets/_DDD/_Scripts/GameState.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46b89f8970a04e14b97419aeb4acb6c4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_DDD/_Scripts/GameData/InventoryItemData.cs.meta b/Assets/_DDD/_Scripts/GameState/InventoryItemData.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/GameData/InventoryItemData.cs.meta rename to Assets/_DDD/_Scripts/GameState/InventoryItemData.cs.meta diff --git a/Assets/_DDD/_Scripts/GameData/InventoryManager.cs.meta b/Assets/_DDD/_Scripts/GameState/InventoryManager.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/GameData/InventoryManager.cs.meta rename to Assets/_DDD/_Scripts/GameState/InventoryManager.cs.meta