using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace NEG.UI.UnityUi.Buttons { public class CustomNavigationButton : Button { [SerializeField] [HideInInspector] 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; } } }