64 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			64 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] [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; }
 | |
|     }
 | |
| } |