Unity_Utils/JohnsonUtils/Canvases/Components/UISelectableComponentBase.cs
2023-03-17 23:41:38 -04:00

52 lines
1.6 KiB
C#

using System;
using JetBrains.Annotations;
using JohnsonUtils.Utilities;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace JohnsonUtils.Canvases
{
public abstract class UISelectableComponentBase : UIComponentBase
{
[UsedImplicitly] public event Action OnSelected;
protected Selectable Selectable = null;
private EventTrigger.Entry _selectEventTriggerEntry;
private CanvasGroup _parentCanvasGroup;
private void Awake()
{
SetSelectableGameObject();
AddSelectEventTrigger();
_parentCanvasGroup = gameObject.GetComponentInParents<CanvasGroup>();
}
protected abstract void SetSelectableGameObject();
private void AddSelectEventTrigger()
{
EventTrigger eventTrigger = Selectable.gameObject.GetOrAddComponent<EventTrigger>();
_selectEventTriggerEntry = new EventTrigger.Entry
{
eventID = EventTriggerType.Select
};
_selectEventTriggerEntry.callback.AddListener(OnSelectableSelected);
eventTrigger.triggers.Add(_selectEventTriggerEntry);
}
private void OnSelectableSelected(BaseEventData data)
{
if (!Selectable.interactable || _parentCanvasGroup != null && !_parentCanvasGroup.interactable)
return;
OnSelected?.Invoke();
}
protected virtual void OnDestroy()
{
_selectEventTriggerEntry?.callback.RemoveListener(OnSelectableSelected);
}
}
}