| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.UI;
- using System.Linq;
- public class KeyBoardSelector : MonoBehaviour
- {
- Button _lastSelectBtn;
- List<Button> _selectables = new();
- EventSystem _eventSystem;
- PointerEventData _pointerEventData;
- public bool doing = false;
- private float _lastAutoSetFirstBtnTime;
- public static KeyBoardSelector ins;
- void Start()
- {
- ins = this;
- _eventSystem = FindObjectOfType<EventSystem>();
- _pointerEventData = new PointerEventData(_eventSystem);
- gameObject.AddComponent<KeyBoardInterface>();
- }
-
- void Update()
- {
- if (doing)
- {
- RefreshLastSelectBtn();
- if (SB_EventSystem.ins.simulateMouseIsAwaked)
- {
- if (!IsBtnCanReach(_lastSelectBtn)) Quit();
- }
- else
- {
- if (!IsLastBtnValid()) Quit();
- }
- }
- else
- {
- if (Time.realtimeSinceStartup - _lastAutoSetFirstBtnTime > 0.2)
- {
- _lastAutoSetFirstBtnTime = Time.realtimeSinceStartup;
- RefreshLastSelectBtn();
- if (SB_EventSystem.ins.simulateMouseIsAwaked)
- {
- if (!IsBtnCanReach(_lastSelectBtn)) SetFirstSelectBtn();
- }
- else
- {
- if (!IsLastBtnValid()) SetFirstSelectBtn();
- }
- }
- }
- }
- public void Quit()
- {
- doing = false;
- SB_EventSystem.ins.mouseConfirm.Hide();
- }
- public void Enter()
- {
- RefreshLastSelectBtn();
- SB_EventSystem.ins.mouseConfirm.OnClikc_Confirm(false);
- }
- public void HandleInput(int delta)
- {
- doing = true;
- RefreshLastSelectBtn();
- UpdateSelectables();
- if (IsLastBtnValid())
- {
- Button nextOne = KeyBoardNavigation.Next(_lastSelectBtn, delta);
- if (nextOne == null) return;
- _lastSelectBtn = nextOne;
- SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
- }
- else
- {
- if (_selectables.Count > 0)
- {
- Button nextOne = KeyBoardNavigation.Next(_selectables[0], delta, true);
- if (nextOne == null) return;
- _lastSelectBtn = nextOne;
- SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
- }
- }
- }
- void SetFirstSelectBtn()
- {
- doing = true;
- RefreshLastSelectBtn();
- UpdateSelectables();
- if (_selectables.Count > 0)
- {
- Button nextOne = KeyBoardNavigation.Next(_selectables[0], 1, true);
- if (nextOne == null) return;
- _lastSelectBtn = nextOne;
- SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
- }
- }
- void UpdateSelectables()
- {
- _selectables.Clear();
- Button[] buttons = FindObjectsOfType<Button>();
- List<RaycastResult> raycastResults = new List<RaycastResult>();
- foreach (var btn in buttons)
- {
- if (!btn.interactable) continue;
- _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(btn.transform as RectTransform, Vector2.one * 0.5f);
- _eventSystem.RaycastAll(_pointerEventData, raycastResults);
- Selectable selectable;
- if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == btn && KeyBoardNavigation.IsNavigationButton(selectable.GetComponent<Button>()))
- {
- _selectables.Add(btn);
- }
- }
- }
- bool IsLastBtnValid()
- {
- if (!_lastSelectBtn) return false;
- if (!_lastSelectBtn.interactable) return false;
- List<RaycastResult> raycastResults = new List<RaycastResult>();
- _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(_lastSelectBtn.transform as RectTransform, Vector2.one * 0.5f);
- _eventSystem.RaycastAll(_pointerEventData, raycastResults);
- Selectable selectable;
- if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == _lastSelectBtn && KeyBoardNavigation.IsNavigationButton(selectable.GetComponent<Button>()))
- {
- return true;
- }
- return false;
- }
- bool IsBtnCanReach(Button btn)
- {
- if (!btn || !btn.interactable || !btn.gameObject || !btn.gameObject.activeInHierarchy) return false;
- List<RaycastResult> raycastResults = new List<RaycastResult>();
- _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(btn.transform as RectTransform, Vector2.one * 0.5f);
- _eventSystem.RaycastAll(_pointerEventData, raycastResults);
- if (raycastResults.Count == 0) return false;
- RaycastResult rs = raycastResults[0];
- if (!rs.gameObject) return false;
- Button rayHitBtn = rs.gameObject.GetComponentInParent<Button>();
- return btn == rayHitBtn;
- }
- void RefreshLastSelectBtn()
- {
- if (SB_EventSystem.ins.mouseConfirm._targetSelectable) _lastSelectBtn = SB_EventSystem.ins.mouseConfirm._targetSelectable.GetComponent<Button>();
- else _lastSelectBtn = null;
- }
- }
- //public class KeyBoardSelector : MonoBehaviour
- //{
- // Button _lastSelectBtn;
- // List<Button> _selectables = new();
- // EventSystem _eventSystem;
- // PointerEventData _pointerEventData;
- // public bool doing = false;
- // public static KeyBoardSelector ins;
- // void Start()
- // {
- // ins = this;
- // _eventSystem = FindObjectOfType<EventSystem>();
- // _pointerEventData = new PointerEventData(_eventSystem);
- // gameObject.AddComponent<KeyBoardInterface>();
- // }
- // void Update()
- // {
- // if (doing)
- // {
- // RefreshLastSelectBtn();
- // if (!IsLastBtnValid()) Quit();
- // }
- // }
- // public void Quit()
- // {
- // doing = false;
- // SB_EventSystem.ins.mouseConfirm.Hide();
- // }
- // public void Enter()
- // {
- // RefreshLastSelectBtn();
- // SB_EventSystem.ins.mouseConfirm.OnClikc_Confirm(false);
- // }
- // public void HandleInput(Vector2 pointer)
- // {
- // doing = true;
- // RefreshLastSelectBtn();
- // UpdateSelectables();
- // if (IsLastBtnValid())
- // {
- // Vector2 curPos = JCUnityLib.RectTransformUtils.GetPositionByPivot(_lastSelectBtn.transform as RectTransform, Vector2.one * 0.5f);
- // var selectableList = _selectables.FindAll(b => b != _lastSelectBtn && Vector2.Angle(pointer, (Vector2)JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f) - curPos) <= 45);
- // if (selectableList.Count == 0)
- // {
- // //重新筛选
- // _selectables = _selectables.FindAll(b => b != _lastSelectBtn && Vector2.Angle(pointer, (Vector2)JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f) - curPos) <= 80);
- // _selectables = _selectables.OrderBy(b => Vector2.Angle(pointer, (Vector2)JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f) - curPos))
- // .ThenBy(b => Vector2.Distance(JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f), curPos))
- // .ToList();
- // }
- // else
- // {
- // _selectables = selectableList.OrderBy(b => Vector2.Distance(JCUnityLib.RectTransformUtils.GetPositionByPivot(b.transform as RectTransform, Vector2.one * 0.5f), curPos)).ToList();
- // }
- // if (_selectables.Count > 0)
- // {
- // _lastSelectBtn = _selectables[0];
- // SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
- // }
- // }
- // else
- // {
- // if (_selectables.Count > 0)
- // {
- // Vector2 centerPoint = new Vector2(Screen.width, Screen.height) / 2f;
- // _selectables.Sort((a, b) =>
- // {
- // return Vector2.Distance(a.transform.position, centerPoint) - Vector2.Distance(b.transform.position, centerPoint) < 0 ? -1 : 1;
- // });
- // _lastSelectBtn = _selectables[0];
- // SB_EventSystem.ins.mouseConfirm.SetSelectable(_lastSelectBtn);
- // }
- // }
- // }
- // void UpdateSelectables()
- // {
- // _selectables.Clear();
- // Button[] buttons = FindObjectsOfType<Button>();
- // List<RaycastResult> raycastResults = new List<RaycastResult>();
- // foreach (var btn in buttons)
- // {
- // if (!btn.interactable) continue;
- // _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(btn.transform as RectTransform, Vector2.one * 0.5f);
- // _eventSystem.RaycastAll(_pointerEventData, raycastResults);
- // Selectable selectable;
- // if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == btn)
- // {
- // _selectables.Add(btn);
- // }
- // }
- // }
- // bool IsLastBtnValid()
- // {
- // if (!_lastSelectBtn) return false;
- // if (!_lastSelectBtn.interactable) return false;
- // List<RaycastResult> raycastResults = new List<RaycastResult>();
- // _pointerEventData.position = JCUnityLib.RectTransformUtils.GetPositionByPivot(_lastSelectBtn.transform as RectTransform, Vector2.one * 0.5f);
- // _eventSystem.RaycastAll(_pointerEventData, raycastResults);
- // Selectable selectable;
- // if (raycastResults.Count > 0 && raycastResults[0].gameObject && (selectable = raycastResults[0].gameObject.GetComponentInParent<Selectable>()) && selectable == _lastSelectBtn)
- // {
- // return true;
- // }
- // return false;
- // }
- // void RefreshLastSelectBtn()
- // {
- // if (SB_EventSystem.ins.mouseConfirm._targetSelectable) _lastSelectBtn = SB_EventSystem.ins.mouseConfirm._targetSelectable.GetComponent<Button>();
- // else _lastSelectBtn = null;
- // }
- //}
|