From 2b483bf213220a656a5e0458805517baae93aea0 Mon Sep 17 00:00:00 2001 From: NTG_Lenovo Date: Wed, 23 Jul 2025 12:24:52 +0900 Subject: [PATCH] =?UTF-8?q?=ED=82=A4=20=EB=B0=94=EC=9D=B8=EB=94=A9=20?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=EC=97=90=20=EB=A7=9E=EA=B2=8C=20ui?= =?UTF-8?q?=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EA=B0=9C=ED=8E=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/_DDD/_Scripts/GameUi/BasePopupUi.cs | 7 +++ Assets/_DDD/_Scripts/GameUi/BaseUi.cs | 3 +- Assets/_DDD/_Scripts/GameUi/PopupUi.cs | 62 ++++++++++++------- Assets/_DDD/_Scripts/GameUi/UiManager.cs | 18 +++--- .../BaseUiActionsInputBindingSo.cs | 17 +++++ .../RestaurantActionsInputBindingSo.cs | 7 +++ .../RestaurantUiActionsInputBindingSo.cs | 7 +++ 7 files changed, 87 insertions(+), 34 deletions(-) create mode 100644 Assets/_DDD/_Scripts/GameUi/BasePopupUi.cs create mode 100644 Assets/_DDD/_Scripts/InputSystem/BaseUiActionsInputBindingSo.cs create mode 100644 Assets/_DDD/_Scripts/InputSystem/RestaurantActionsInputBindingSo.cs create mode 100644 Assets/_DDD/_Scripts/InputSystem/RestaurantUiActionsInputBindingSo.cs diff --git a/Assets/_DDD/_Scripts/GameUi/BasePopupUi.cs b/Assets/_DDD/_Scripts/GameUi/BasePopupUi.cs new file mode 100644 index 000000000..ac5116055 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameUi/BasePopupUi.cs @@ -0,0 +1,7 @@ +namespace DDD +{ + public abstract class BasePopupUi : BaseUi + { + public abstract InputActionMaps InputActionMaps { get; } + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameUi/BaseUi.cs b/Assets/_DDD/_Scripts/GameUi/BaseUi.cs index 33de6cac5..4267af626 100644 --- a/Assets/_DDD/_Scripts/GameUi/BaseUi.cs +++ b/Assets/_DDD/_Scripts/GameUi/BaseUi.cs @@ -6,7 +6,7 @@ public abstract class BaseUi : MonoBehaviour { protected GameObject _panel; public virtual bool IsBlockingTime => false; - public virtual bool IsOpen => gameObject.activeSelf; + public virtual bool IsOpen => _panel.activeSelf; protected virtual void Awake() { @@ -16,6 +16,7 @@ protected virtual void Awake() protected virtual void Start() { TryRegister(); + Close(); } protected virtual void OnDestroy() diff --git a/Assets/_DDD/_Scripts/GameUi/PopupUi.cs b/Assets/_DDD/_Scripts/GameUi/PopupUi.cs index a8a976c06..31cc1ed34 100644 --- a/Assets/_DDD/_Scripts/GameUi/PopupUi.cs +++ b/Assets/_DDD/_Scripts/GameUi/PopupUi.cs @@ -5,40 +5,56 @@ namespace DDD { - public class PopupUi : BaseUi + public static class EnumExtensions { - protected UiInputBindingSo _uiInputBindingSo; + public static IEnumerable GetFlags(this T input) where T : Enum + { + foreach (T value in Enum.GetValues(typeof(T))) + { + int intValue = Convert.ToInt32(value); + int inputValue = Convert.ToInt32(input); + if (intValue != 0 && (inputValue & intValue) == intValue) yield return value; + } + } + } + + public abstract class PopupUi : BasePopupUi where T : Enum + { + protected BaseUiActionsInputBindingSo _baseUiActionsInputBindingSo; protected readonly List<(InputAction action, Action handler)> _registeredHandlers = new(); + public override InputActionMaps InputActionMaps => _baseUiActionsInputBindingSo.InputActionMaps; + + private bool _isTopPopup => UiManager.Instance.IsTopPopup(this); + + private const string InputBindingSo = "InputBindingSo"; protected override async void TryRegister() { base.TryRegister(); + UiManager.Instance.RegisterPopupUI(this); - // So의 이름을 통일 : TestUi_UiInputBindingSo - string addressableKey = $"{GetType().Name}_{DataConstants.UiInputBindingSo}"; - _uiInputBindingSo = await AssetManager.LoadAsset(addressableKey); - Debug.Assert(_uiInputBindingSo != null, "_uiInputBindingSo != null"); + string addressableKey = $"{GetType().Name}_{typeof(T).Name}_{InputBindingSo}"; + _baseUiActionsInputBindingSo = await AssetManager.LoadAsset>(addressableKey); + + Debug.Assert(_baseUiActionsInputBindingSo != null, $"InputBindingSo not found: {addressableKey}"); - foreach (var binding in _uiInputBindingSo.Bindings) + foreach (var actionEnum in _baseUiActionsInputBindingSo.BindingActions.GetFlags()) { - if (binding.InputAction == null) continue; + if (actionEnum.Equals(default(T))) continue; + + var inputAction = InputManager.Instance.GetAction(_baseUiActionsInputBindingSo.InputActionMaps, actionEnum.ToString()); + if (inputAction == null) continue; - var action = binding.InputAction.action; - if (action == null) continue; - - var handler = new Action(ctx => + var handler = new Action(context => { - if (UiManager.Instance.IsTopPopup(this)) - { - OnInputPerformed(binding.ActionName, ctx); - } + if (!_isTopPopup) return; + + OnInputPerformed(actionEnum, context); }); - action.Enable(); - action.performed += handler; - - _registeredHandlers.Add((action, handler)); + inputAction.performed += handler; + _registeredHandlers.Add((inputAction, handler)); } } @@ -67,12 +83,10 @@ public override void Open() if (UiManager.Instance.IsTopPopup(this)) { - InputManager.Instance.SwitchCurrentActionMap(_uiInputBindingSo.InputActionMaps); + InputManager.Instance.SwitchCurrentActionMap(_baseUiActionsInputBindingSo.InputActionMaps); } } - protected virtual void OnInputPerformed(string actionName, InputAction.CallbackContext ctx) { } - - public InputActionMaps GetInputActionMaps() => _uiInputBindingSo.InputActionMaps; + protected abstract void OnInputPerformed(T actionEnum, InputAction.CallbackContext ctx); } } \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/GameUi/UiManager.cs b/Assets/_DDD/_Scripts/GameUi/UiManager.cs index 4e0eaf487..09f964d64 100644 --- a/Assets/_DDD/_Scripts/GameUi/UiManager.cs +++ b/Assets/_DDD/_Scripts/GameUi/UiManager.cs @@ -7,8 +7,8 @@ namespace DDD { public class UiManager : Singleton, IManager, IEventHandler, IEventHandler { - private readonly Dictionary _popupUIs = new(); - private readonly Stack _popupStack = new(); + private readonly Dictionary _popupUIs = new(); + private readonly Stack _popupStack = new(); private InputActionMaps _previousActionMap = InputActionMaps.None; private readonly object _uiPauseRequester = new(); @@ -35,13 +35,13 @@ private void OnDestroy() EventBus.Unregister(this); } - public void RegisterPopupUI(PopupUi ui) + public void RegisterPopupUI(BasePopupUi ui) { var type = ui.GetType(); _popupUIs.TryAdd(type, ui); } - public void UnregisterPopupUI(PopupUi ui) + public void UnregisterPopupUI(BasePopupUi ui) { var type = ui.GetType(); if (_popupUIs.TryGetValue(type, out var registered) && registered == ui) @@ -56,8 +56,8 @@ public void Invoke(OpenPopupUiEvent evt) { if (!popup.IsOpen) { - popup.Open(); PushPopup(popup); + popup.Open(); if (popup.IsBlockingTime) { @@ -90,12 +90,12 @@ public void Invoke(ClosePopupUiEvent evt) } } - public bool IsTopPopup(PopupUi popup) + public bool IsTopPopup(BasePopupUi popup) { return _popupStack.Count > 0 && _popupStack.Peek() == popup; } - public void PushPopup(PopupUi popup) + public void PushPopup(BasePopupUi popup) { if (_popupStack.Contains(popup)) return; @@ -107,7 +107,7 @@ public void PushPopup(PopupUi popup) _popupStack.Push(popup); } - public void PopPopup(PopupUi popup) + public void PopPopup(BasePopupUi popup) { if (_popupStack.Count == 0) return; @@ -127,7 +127,7 @@ public void PopPopup(PopupUi popup) if (_popupStack.TryPeek(out var topPopup) && topPopup.IsOpen) { - InputManager.Instance.SwitchCurrentActionMap(topPopup.GetInputActionMaps()); + InputManager.Instance.SwitchCurrentActionMap(topPopup.InputActionMaps); } else { diff --git a/Assets/_DDD/_Scripts/InputSystem/BaseUiActionsInputBindingSo.cs b/Assets/_DDD/_Scripts/InputSystem/BaseUiActionsInputBindingSo.cs new file mode 100644 index 000000000..b34b9f99c --- /dev/null +++ b/Assets/_DDD/_Scripts/InputSystem/BaseUiActionsInputBindingSo.cs @@ -0,0 +1,17 @@ +using System; +using Sirenix.OdinInspector; +using UnityEngine; + +namespace DDD +{ + public class BaseUiActionsInputBindingSo : ScriptableObject where T : Enum + { + public InputActionMaps InputActionMaps; + + [EnumToggleButtons] + public T BindingActions; + + [ReadOnly, LabelText("Addressable Key")] + public string AddressableKey => $"{typeof(T).Name}_InputBindingSo"; + } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/InputSystem/RestaurantActionsInputBindingSo.cs b/Assets/_DDD/_Scripts/InputSystem/RestaurantActionsInputBindingSo.cs new file mode 100644 index 000000000..50fdd086d --- /dev/null +++ b/Assets/_DDD/_Scripts/InputSystem/RestaurantActionsInputBindingSo.cs @@ -0,0 +1,7 @@ +using UnityEngine; + +namespace DDD +{ + [CreateAssetMenu(fileName = "_RestaurantActions_InputBindingSo", menuName = "Ui/RestaurantActions_InputBindingSo")] + public class RestaurantActionsInputBindingSo : BaseUiActionsInputBindingSo { } +} \ No newline at end of file diff --git a/Assets/_DDD/_Scripts/InputSystem/RestaurantUiActionsInputBindingSo.cs b/Assets/_DDD/_Scripts/InputSystem/RestaurantUiActionsInputBindingSo.cs new file mode 100644 index 000000000..4935b53c9 --- /dev/null +++ b/Assets/_DDD/_Scripts/InputSystem/RestaurantUiActionsInputBindingSo.cs @@ -0,0 +1,7 @@ +using UnityEngine; + +namespace DDD +{ + [CreateAssetMenu(fileName = "_RestaurantUiActions_InputBindingSo", menuName = "Ui/RestaurantUiActions_InputBindingSo")] + public class RestaurantUiActionsInputBindingSo : BaseUiActionsInputBindingSo { } +} \ No newline at end of file