ProjectDDD/Assets/_DDD/_Scripts/GameUi/PopupUi/PopupUi.cs
2025-08-19 19:13:31 +09:00

112 lines
3.9 KiB
C#

using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.InputSystem;
namespace DDD
{
public static class EnumExtensions
{
public static IEnumerable<T> GetFlags<T>(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<T> : BasePopupUi where T : Enum
{
[SerializeField, Required] protected BaseUiActionsInputBinding<T> _uiActionsInputBinding;
protected readonly List<(InputAction action, Action<InputAction.CallbackContext> handler)> _registeredHandlers = new();
public override InputActionMaps InputActionMaps => _uiActionsInputBinding.InputActionMaps;
private bool _isTopPopup => UiManager.Instance.PopupUiState.IsTopPopup(this);
protected override void TryRegister()
{
base.TryRegister();
UiManager.Instance.PopupUiState.RegisterPopupUI(this);
foreach (var actionEnum in _uiActionsInputBinding.BindingActions.GetFlags())
{
if (actionEnum.Equals(default(T))) continue;
var inputAction = InputManager.Instance.GetAction(_uiActionsInputBinding.InputActionMaps, actionEnum.ToString());
if (inputAction == null) continue;
var startedHandler = new Action<InputAction.CallbackContext>(context =>
{
OnInputStarted(actionEnum, context);
});
inputAction.started += startedHandler;
var performedHandler = new Action<InputAction.CallbackContext>(context =>
{
OnInputPerformed(actionEnum, context);
});
inputAction.performed += performedHandler;
var canceledHandler = new Action<InputAction.CallbackContext>(context =>
{
OnInputCanceled(actionEnum, context);
});
inputAction.canceled += canceledHandler;
_registeredHandlers.Add((inputAction, startedHandler));
_registeredHandlers.Add((inputAction, performedHandler));
_registeredHandlers.Add((inputAction, canceledHandler));
}
}
protected override void TryUnregister()
{
base.TryUnregister();
UiManager.Instance?.PopupUiState?.UnregisterPopupUI(this);
foreach (var (action, handler) in _registeredHandlers)
{
if (action != null)
{
action.started -= handler;
action.performed -= handler;
action.canceled -= handler;
}
}
_registeredHandlers.Clear();
}
public override void Open(OpenPopupUiEvent evt)
{
base.Open(evt);
transform.SetAsLastSibling();
if (UiManager.Instance.PopupUiState.IsTopPopup(this))
{
InputManager.Instance.SwitchCurrentActionMap(_uiActionsInputBinding.InputActionMaps);
}
}
protected virtual bool OnInputStarted(T actionEnum, InputAction.CallbackContext context)
{
return _isTopPopup;
}
protected virtual bool OnInputPerformed(T actionEnum, InputAction.CallbackContext context)
{
return _isTopPopup;
}
protected virtual bool OnInputCanceled(T actionEnum, InputAction.CallbackContext context)
{
return _isTopPopup;
}
}
}