63 lines
2.1 KiB
C#
63 lines
2.1 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.UI;
|
|
|
|
namespace NEG.UI.UnityUi.Buttons
|
|
{
|
|
public class CustomNavigationButton : Button
|
|
{
|
|
[SerializeField] private OverridableNavigation upOverride;
|
|
[SerializeField] private OverridableNavigation downOverride;
|
|
[SerializeField] private OverridableNavigation leftOverride;
|
|
[SerializeField] private OverridableNavigation rightOverride;
|
|
|
|
|
|
public override void OnMove(AxisEventData eventData)
|
|
{
|
|
switch (eventData.moveDir)
|
|
{
|
|
case MoveDirection.Left:
|
|
if(TryNavigate(eventData, leftOverride))
|
|
return;
|
|
break;
|
|
case MoveDirection.Up:
|
|
if(TryNavigate(eventData, upOverride))
|
|
return;
|
|
break;
|
|
case MoveDirection.Right:
|
|
if(TryNavigate(eventData, rightOverride))
|
|
return;
|
|
break;
|
|
case MoveDirection.Down:
|
|
if(TryNavigate(eventData, downOverride))
|
|
return;
|
|
break;
|
|
case MoveDirection.None:
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
base.OnMove(eventData);
|
|
}
|
|
|
|
public static bool TryNavigate(BaseEventData eventData, OverridableNavigation overrideNavigation)
|
|
{
|
|
if(!overrideNavigation.Override)
|
|
return false;
|
|
|
|
if (overrideNavigation.Selectable == null || !overrideNavigation.Selectable.IsActive())
|
|
return true;
|
|
|
|
eventData.selectedObject = overrideNavigation.Selectable.gameObject;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class OverridableNavigation
|
|
{
|
|
[field: SerializeField] public bool Override { get; private set; }
|
|
[field: SerializeField] public Selectable Selectable { get; private set; }
|
|
}
|
|
} |