diff --git a/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab b/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab index fa7374f77..e3535c2f0 100644 --- a/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab +++ b/Assets/_DDD/Restaurant/Environments/Props/Prop_Open.prefab @@ -113,6 +113,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 4438924429928472453, guid: 1d634c3376e4a4684bc984ced9134847, type: 3} insertIndex: -1 addedObject: {fileID: 6899480242032072806} + - targetCorrespondingSourceObject: {fileID: 4438924429928472453, guid: 1d634c3376e4a4684bc984ced9134847, type: 3} + insertIndex: -1 + addedObject: {fileID: -4132148316966952702} m_SourcePrefab: {fileID: 100100000, guid: 1d634c3376e4a4684bc984ced9134847, type: 3} --- !u!1 &9211739394093953175 stripped GameObject: @@ -131,10 +134,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 201f9e6d7ca7404baa9945950292a392, type: 3} m_Name: m_EditorClassIdentifier: - _interactionType: 2 - _holdTime: 0 - _interactionMessageKey: Test + _interactionType: 1 + _executionParameters: + _holdTime: 1 + _displayParameters: + _messageKey: _interactionAvailableFlows: 1 + _aiInteractionPoints: [] + autoInitialize: 1 --- !u!114 &3538352761187622062 MonoBehaviour: m_ObjectHideFlags: 0 @@ -375,3 +382,16 @@ MonoBehaviour: _outlineSharpness: 8 _currentOutlineType: 0 _currentOpacityMultiplier: 1 +--- !u!114 &-4132148316966952702 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9211739394093953175} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1235f6bde9304d8f85079f2777bd4b3c, type: 3} + m_Name: + m_EditorClassIdentifier: + _managementType: 1 diff --git a/Assets/_DDD/_Addressables/Environments/Prop/MenuBoard/PropMenuBoard.prefab b/Assets/_DDD/_Addressables/Environments/Prop/MenuBoard/PropMenuBoard.prefab index ddf5310b2..149bc761d 100644 --- a/Assets/_DDD/_Addressables/Environments/Prop/MenuBoard/PropMenuBoard.prefab +++ b/Assets/_DDD/_Addressables/Environments/Prop/MenuBoard/PropMenuBoard.prefab @@ -97,6 +97,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 4438924429928472453, guid: 1d634c3376e4a4684bc984ced9134847, type: 3} insertIndex: -1 addedObject: {fileID: 5410819217098966190} + - targetCorrespondingSourceObject: {fileID: 4438924429928472453, guid: 1d634c3376e4a4684bc984ced9134847, type: 3} + insertIndex: -1 + addedObject: {fileID: -1096657863250535257} m_SourcePrefab: {fileID: 100100000, guid: 1d634c3376e4a4684bc984ced9134847, type: 3} --- !u!1 &580268897300907643 stripped GameObject: @@ -116,9 +119,12 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _interactionType: 1 - _holdTime: 0 - _interactionMessageKey: Test + _executionParameters: + _holdTime: 1 + _displayParameters: + _messageKey: _interactionAvailableFlows: 1 + _aiInteractionPoints: [] --- !u!114 &4545680930728379745 MonoBehaviour: m_ObjectHideFlags: 0 @@ -359,3 +365,15 @@ MonoBehaviour: _outlineSharpness: 8 _currentOutlineType: 0 _currentOpacityMultiplier: 1 +--- !u!114 &-1096657863250535257 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 580268897300907643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1235f6bde9304d8f85079f2777bd4b3c, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab b/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab index c1e3a3a75..cc9051a7a 100644 --- a/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab +++ b/Assets/_DDD/_Addressables/Prefabs/RestaurantPlayer.prefab @@ -423,7 +423,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 81e01dd8c1cc3404d805400eba1bb4ae, type: 3} m_Name: m_EditorClassIdentifier: - _interactionType: 4294967287 + _availableInteractions: 1 _nearColliders: - {fileID: 0} - {fileID: 0} diff --git a/Assets/_DDD/_Scripts/GameEvent/IInteractable.cs b/Assets/_DDD/_Scripts/GameEvent/IInteractable.cs index c52bd47fd..a0c5cbe95 100644 --- a/Assets/_DDD/_Scripts/GameEvent/IInteractable.cs +++ b/Assets/_DDD/_Scripts/GameEvent/IInteractable.cs @@ -8,10 +8,9 @@ namespace DDD public enum InteractionType : uint { None = 0u, - RestaurantManagementUi = 1u << 0, - OpenRestaurant = 1u << 1, - RestaurantOrder = 1u << 2, - RestaurantMeal = 1u << 3, + RestaurantManagement = 1u << 0, + RestaurantOrder = 1u << 1, + RestaurantMeal = 1u << 2, All = 0xFFFFFFFFu } diff --git a/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs b/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs index 1085117d3..655419a6e 100644 --- a/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs +++ b/Assets/_DDD/_Scripts/GameEvent/InteractionSubsystem.cs @@ -5,7 +5,6 @@ namespace DDD { public interface IInteractionSubsystemObject { - Type GetSubsystemEnumType(); void InitializeSubsystem(); bool CanInteract(); bool OnInteracted(IInteractor interactor, ScriptableObject payloadSo = null); diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/IInteractionSubsystemOwner.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/IInteractionSubsystemOwner.cs new file mode 100644 index 000000000..bd99e64be --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/IInteractionSubsystemOwner.cs @@ -0,0 +1,10 @@ +using System; +using UnityEngine; + +namespace DDD +{ + public interface IInteractionSubsystemOwner + { + public bool TryGetSubsystemObject(out IInteractionSubsystemObject subsystemObject) where T : Enum; + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/IInteractionSubsystemOwner.cs.meta b/Assets/_DDD/_Scripts/RestaurantEnvironment/IInteractionSubsystemOwner.cs.meta new file mode 100644 index 000000000..d15ead482 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/IInteractionSubsystemOwner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 254d64ce6ee84b20a154931fcf04958f +timeCreated: 1755681729 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteraction.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteraction.cs deleted file mode 100644 index c2df3a351..000000000 --- a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteraction.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace DDD -{ - [Flags] - public enum RestaurantManagementType : uint - { - OpenRestaurantMenu = 0, - StartRestaurant = 1, - } - - //public class RestaurantManagementInteraction : RestaurantInteractionComponent, IInteractionSubsystemObject - //{ - // - //} -} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs new file mode 100644 index 000000000..8be8f9b3f --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs @@ -0,0 +1,36 @@ +using System; +using UnityEngine; + +namespace DDD +{ + [Flags] + public enum RestaurantManagementType : uint + { + OpenRestaurantMenu = 0, + StartRestaurant = 1, + } + + public class RestaurantManagementInteractionSubsystem : MonoBehaviour, IInteractionSubsystemObject + { + [SerializeField] protected RestaurantManagementType _managementType = RestaurantManagementType.OpenRestaurantMenu; + public RestaurantManagementType GetInteractionSubsystemType() + { + return _managementType; + } + + public void InitializeSubsystem() + { + + } + + public bool CanInteract() + { + return true; + } + + public bool OnInteracted(IInteractor interactor, ScriptableObject payloadSo = null) + { + return true; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteraction.cs.meta b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteraction.cs.meta rename to Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantManagementInteractionSubsystem.cs.meta diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs index 40b619387..59ec44864 100644 --- a/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/Interactions/RestaurantOrderInteractionSubsystem.cs @@ -15,9 +15,7 @@ public class RestaurantOrderInteractionSubsystem : MonoBehaviour, IInteractionSu { [SerializeField] protected RestaurantOrderType orderType = RestaurantOrderType.Wait; private RestaurantOrderType currentRestaurantOrderType; - - public Type GetSubsystemEnumType() => typeof(RestaurantOrderType); - + private void Start() { currentRestaurantOrderType = orderType; diff --git a/Assets/_DDD/_Scripts/RestaurantEnvironment/RestaurantEnvironment.cs b/Assets/_DDD/_Scripts/RestaurantEnvironment/RestaurantEnvironment.cs index a2d647545..344fd6309 100644 --- a/Assets/_DDD/_Scripts/RestaurantEnvironment/RestaurantEnvironment.cs +++ b/Assets/_DDD/_Scripts/RestaurantEnvironment/RestaurantEnvironment.cs @@ -1,3 +1,4 @@ +using System; using Spine.Unity; using Unity.VisualScripting; using UnityEngine; diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs index 72090e59d..2cf9c4102 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionComponent.cs @@ -11,12 +11,13 @@ public static class RestaurantInteractionSubsystems { public static Dictionary TypeToSubsystem = new() { - {InteractionType.RestaurantOrder, typeof(RestaurantOrderInteractionSubsystem)} + {InteractionType.RestaurantOrder, typeof(RestaurantOrderInteractionSubsystem)}, + {InteractionType.RestaurantManagement, typeof(RestaurantManagementInteractionSubsystem)} }; } - public class RestaurantInteractionComponent : MonoBehaviour, IInteractable + public class RestaurantInteractionComponent : MonoBehaviour, IInteractable, IInteractionSubsystemOwner { // Single interaction type [ValueDropdown("GetAllInteractionTypes")] @@ -25,9 +26,18 @@ public class RestaurantInteractionComponent : MonoBehaviour, IInteractable [SerializeField] protected InteractionDisplayParameters _displayParameters = new InteractionDisplayParameters(""); [SerializeField] protected GameFlowState _interactionAvailableFlows; [SerializeField] private Transform[] _aiInteractionPoints; + [SerializeField] private bool autoInitialize = true; private Dictionary _subsystems = new(); + private void Start() + { + if (autoInitialize) + { + InitializeInteraction(_interactionType); + } + } + private static IEnumerable GetAllInteractionTypes() { return System.Enum.GetValues(typeof(InteractionType)) @@ -153,5 +163,20 @@ public Vector3[] GetInteractionPoints() } return positions; } + + public bool TryGetSubsystemObject(out IInteractionSubsystemObject subsystemObject) where T : Enum + { + foreach (var interactionSubsystemObject in _subsystems.Values) + { + if (interactionSubsystemObject is IInteractionSubsystemObject subsystem) + { + subsystemObject = subsystem; + return true; + } + } + + subsystemObject = null; + return false; + } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs index 6d9021765..2afa9b785 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/RestaurantInteractionEvents.cs @@ -13,8 +13,7 @@ public static class RestaurantInteractionEventSolvers { public static Dictionary TypeToSolver = new() { - {InteractionType.RestaurantManagementUi, typeof(RestaurantManagementUiEventSolver)}, - {InteractionType.OpenRestaurant, typeof(RestaurantOpenEventSolver)}, + {InteractionType.RestaurantManagement, typeof(RestaurantManagementSolver)}, {InteractionType.RestaurantOrder, typeof(RestaurantOrderSolver)} }; } diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements.meta new file mode 100644 index 000000000..da3e18e6c --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ad4643acb4b34f1ab27e79503ccff0dd +timeCreated: 1755677592 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs new file mode 100644 index 000000000..0681cfb69 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using DDD.RestaurantOrders; +using UnityEngine; + +namespace DDD +{ + public static class RestaurantManagementSolvers + { + public static Dictionary TypeToManagementSolver = new() + { + { RestaurantManagementType.OpenRestaurantMenu, typeof(RestaurantManagementSolver_Menu) }, + { RestaurantManagementType.StartRestaurant, typeof(RestaurantManagementSolver_Start) } + }; + } + public class RestaurantManagementSolver : RestaurantSubsystemSolver + { + protected override Dictionary GetSubsystemSolverTypeMappings() + { + return RestaurantManagementSolvers.TypeToManagementSolver; + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs.meta new file mode 100644 index 000000000..a9847e43f --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c457857b6ba0432db546ef0d8970548d +timeCreated: 1755677639 \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagementUiEventSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Menu.cs similarity index 51% rename from Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagementUiEventSolver.cs rename to Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Menu.cs index c740cfb4f..4c4e3ab26 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagementUiEventSolver.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Menu.cs @@ -2,11 +2,11 @@ namespace DDD { - public class RestaurantManagementUiEventSolver : MonoBehaviour, IInteractionSolver + public class RestaurantManagementSolver_Menu : MonoBehaviour, IInteractionSubsystemSolver { - public bool ExecuteInteraction(IInteractor interactor, IInteractable interactable, ScriptableObject payloadSo = null) + public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject payloadSo = null) { - if (CanExecuteInteraction() == false) return false; + if (CanExecuteInteractionSubsystem(interactor, interactable, payloadSo) == false) return false; var evt = GameEvents.OpenPopupUiEvent; evt.UiType = typeof(RestaurantManagementUi); @@ -14,7 +14,7 @@ public bool ExecuteInteraction(IInteractor interactor, IInteractable interactabl return true; } - public bool CanExecuteInteraction(IInteractor interactor = null, IInteractable interactable = null, + public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, ScriptableObject payloadSo = null) { GameFlowState currentGameFlowState = GameFlowManager.Instance.GameFlowDataSo.CurrentGameState; diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagementUiEventSolver.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Menu.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagementUiEventSolver.cs.meta rename to Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Menu.cs.meta diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOpenEventSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Start.cs similarity index 53% rename from Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOpenEventSolver.cs rename to Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Start.cs index ccc92fd90..fe7f96388 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOpenEventSolver.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Start.cs @@ -3,22 +3,23 @@ namespace DDD { - public class RestaurantOpenEventSolver : MonoBehaviour, IInteractionSolver + public class RestaurantManagementSolver_Start : MonoBehaviour, IInteractionSubsystemSolver { - public bool ExecuteInteraction(IInteractor interactor, IInteractable interactable, ScriptableObject interactionPayloadSo = null) - { - if (CanExecuteInteraction() == false) return false; - - _ = GameFlowManager.Instance.ChangeFlow(GameFlowState.RunRestaurant); - return true; - } - private RestaurantManagementState GetManagementState() { return RestaurantState.Instance.ManagementState; } - public bool CanExecuteInteraction(IInteractor interactor = null, IInteractable interactable = null, ScriptableObject payloadSo = null) + public bool ExecuteInteractionSubsystem(IInteractor interactor, IInteractable interactable, ScriptableObject payloadSo = null) + { + if (CanExecuteInteractionSubsystem(interactor, interactable, payloadSo) == false) return false; + + _ = GameFlowManager.Instance.ChangeFlow(GameFlowState.RunRestaurant); + return true; + } + + public bool CanExecuteInteractionSubsystem(IInteractor interactor = null, IInteractable interactable = null, + ScriptableObject payloadSo = null) { GameFlowState currentGameFlowState = GameFlowManager.Instance.GameFlowDataSo.CurrentGameState; diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOpenEventSolver.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Start.cs.meta similarity index 100% rename from Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOpenEventSolver.cs.meta rename to Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantManagements/RestaurantManagementSolver_Start.cs.meta diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs index 38bfe2d87..b54ef3956 100644 --- a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantOrderSolver.cs @@ -15,42 +15,11 @@ public static class RestaurantOrderSolvers }; } - public class RestaurantOrderSolver : MonoBehaviour, IInteractionSolver + public class RestaurantOrderSolver : RestaurantSubsystemSolver { - private Dictionary> _solvers = new(); - - private void Start() + protected override Dictionary GetSubsystemSolverTypeMappings() { - foreach (var orderSolver in RestaurantOrderSolvers.TypeToOrderSolver) - { - var solver = (IInteractionSubsystemSolver)gameObject.AddComponent(orderSolver.Value); - _solvers.Add(orderSolver.Key, solver); - } - } - - public bool ExecuteInteraction(IInteractor interactor, IInteractable interactable, ScriptableObject payloadSo = null) - { - return TryGetSolver(interactable, out var solver) && - solver.ExecuteInteractionSubsystem(interactor, interactable, payloadSo); - } - - public bool CanExecuteInteraction(IInteractor interactor = null, IInteractable interactable = null, - ScriptableObject payloadSo = null) - { - return TryGetSolver(interactable, out var solver) && - solver.CanExecuteInteractionSubsystem(interactor, interactable, payloadSo); - } - - // Solver를 가져오는 공통 로직 - private bool TryGetSolver(IInteractable interactable, out IInteractionSubsystemSolver solver) - { - solver = null; - - if (interactable is not IInteractionSubsystemObject subsystem) - return false; - - var type = subsystem.GetInteractionSubsystemType(); - return _solvers.TryGetValue(type, out solver); + return RestaurantOrderSolvers.TypeToOrderSolver; } } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs new file mode 100644 index 000000000..6edbf5102 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace DDD +{ + public abstract class RestaurantSubsystemSolver : MonoBehaviour, IInteractionSolver where T : Enum + { + private Dictionary> _solvers = new(); + + protected abstract Dictionary GetSubsystemSolverTypeMappings(); + + private void Start() + { + foreach (var subsystemSolverType in GetSubsystemSolverTypeMappings()) + { + var solver = (IInteractionSubsystemSolver)gameObject.AddComponent(subsystemSolverType.Value); + _solvers.Add(subsystemSolverType.Key, solver); + } + } + public bool ExecuteInteraction(IInteractor interactor, IInteractable interactable, ScriptableObject payloadSo = null) + { + return TryGetSolver(interactable, out var solver) && + solver.ExecuteInteractionSubsystem(interactor, interactable, payloadSo); + } + + public bool CanExecuteInteraction(IInteractor interactor = null, IInteractable interactable = null, + ScriptableObject payloadSo = null) + { + return TryGetSolver(interactable, out var solver) && + solver.CanExecuteInteractionSubsystem(interactor, interactable, payloadSo); + } + + // Solver를 가져오는 공통 로직 + private bool TryGetSolver(IInteractable interactable, out IInteractionSubsystemSolver solver) + { + solver = null; + + var owner = interactable as IInteractionSubsystemOwner; + IInteractionSubsystemObject subsystem = null; + bool isExist = owner != null && owner.TryGetSubsystemObject(out subsystem); + + if (!isExist || subsystem == null) return false; + + var type = subsystem.GetInteractionSubsystemType(); + return _solvers.TryGetValue(type, out solver); + } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs.meta b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs.meta new file mode 100644 index 000000000..a27412565 --- /dev/null +++ b/Assets/_DDD/_Scripts/RestaurantEvent/Solvers/RestaurantSubsystemSolver.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 716224c78a914321b7b7e43a93860465 +timeCreated: 1755677990 \ No newline at end of file