public virtual void CheckInput(bool p_force = false) { if ((p_force || Input.GetKeyDown(KeyCode.Tab)) && FocusGroup.IsUnderFocus(this.gameObject)) { StartCoroutine(ChangeInput()); } }
protected virtual IEnumerator ChangeInput() { if (!_checking) { _checking = true; EventSystem v_eventSystem = EventSystem.current; if (v_eventSystem != null) { bool v_moveBack = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); GameObject v_currentSelectedGameObject = v_eventSystem.currentSelectedGameObject; Selectable v_currentSelectedComponent = v_currentSelectedGameObject != null?v_currentSelectedGameObject.GetComponent <Selectable>() : null; if (!(v_currentSelectedComponent is InputField) || !(((InputField)v_currentSelectedComponent).multiLine)) { List <Selectable> v_currentSelectables = new List <Selectable>(); #if UNITY_2019_1_OR_NEWER IList <Selectable> v_allSelectables = Selectable.allSelectablesArray; #else IList <Selectable> v_allSelectables = Selectable.allSelectables; #endif for (int i = 0; i < v_allSelectables.Count; i++) { Selectable v_selectableComponent = v_allSelectables[i]; v_currentSelectables.RemoveChecking(v_selectableComponent); if (v_selectableComponent != null && v_selectableComponent.enabled && v_selectableComponent.gameObject.activeInHierarchy && v_selectableComponent.gameObject.activeSelf && v_selectableComponent.navigation.mode != Navigation.Mode.None && FocusGroup.IsUnderFocus(v_selectableComponent.gameObject)) { //Sort with SelectionUpDown Index int v_indexDown = v_currentSelectables.IndexOf(v_selectableComponent.navigation.selectOnDown); int v_indexUp = v_currentSelectables.IndexOf(v_selectableComponent.navigation.selectOnUp); bool v_insertingComplete = false; int v_indexToInsert = v_indexDown >= 0 && v_indexDown < v_currentSelectables.Count ? v_indexDown : (v_indexUp >= 0 && v_indexUp < v_currentSelectables.Count ? v_indexUp + 1 : -1); if (v_indexToInsert >= 0 && v_indexToInsert < v_currentSelectables.Count + 1) { try { v_currentSelectables.Insert(v_indexToInsert, v_selectableComponent); v_insertingComplete = true; } catch { } } if (!v_insertingComplete) { v_insertingComplete = true; v_currentSelectables.Add(v_selectableComponent); } } } if (v_currentSelectedComponent != null) { int v_index = v_currentSelectables.IndexOf(v_currentSelectedComponent); v_index = v_moveBack ? v_index - 1 : v_index + 1; v_currentSelectedComponent = v_index >= 0 && v_index < v_currentSelectables.Count ? v_currentSelectables[v_index] : null; v_currentSelectedGameObject = v_currentSelectedComponent != null ? v_currentSelectedComponent.gameObject : null; } if (v_currentSelectedComponent == null) { v_currentSelectedComponent = v_moveBack ? v_currentSelectables.GetLast() : v_currentSelectables.GetFirst(); v_currentSelectedGameObject = v_currentSelectedComponent != null ? v_currentSelectedComponent.gameObject : null; } v_eventSystem.SetSelectedGameObject(v_currentSelectedGameObject); if (v_currentSelectedComponent != null) { InputField v_inputfield = v_currentSelectedComponent.GetComponent <InputField>(); if (v_inputfield != null) { v_inputfield.OnPointerClick(new PointerEventData(v_eventSystem)); } yield return(new WaitForSecondsRealtime(0.05f)); } } } _checking = false; } }