private void KeyboardSelection(KeyboardState keyboardState) { if (Interactables.Count > 0) { //If no interactable has been selected, select the first one: if (kb_selectedInteractable == null && keyboardState.GetPressedKeys().Length > 0) { kb_selectedInteractable = Interactables[0]; kb_selectedInteractable.Select(); return; } if (keyboardState.IsKeyDown(Keys.Up) || keyboardState.IsKeyDown(Keys.Tab)) { int nextIndex = Interactables.IndexOf(kb_selectedInteractable) - 1; if (nextIndex < 0) { nextIndex = Interactables.Count - 1; } //Only deselect the current interactable if it's not currently selected by the mouse. if (kb_selectedInteractable != ms_selectedInteractable) { kb_selectedInteractable.Deselect(); } kb_selectedInteractable = Interactables[nextIndex]; kb_selectedInteractable.Select(); } else if (keyboardState.IsKeyDown(Keys.Down) || (keyboardState.IsKeyDown(Keys.Tab) && keyboardState.IsKeyDown(Keys.LeftShift))) { int nextIndex = Interactables.IndexOf(kb_selectedInteractable) + 1; if (nextIndex >= Interactables.Count) { nextIndex = 0; } //Only deselect the current interactable if it's not currently selected by the mouse. if (kb_selectedInteractable != ms_selectedInteractable) { kb_selectedInteractable.Deselect(); } kb_selectedInteractable = Interactables[nextIndex]; kb_selectedInteractable.Select(); } //Keyboard selection callback: if (kb_selectCallbacks != null) { kb_selectCallbacks.SetArguments(kb_selectedInteractable); kb_selectCallbacks.Invoke(); } } }