//========= Copyright 2016-2023, HTC Corporation. All rights reserved. =========== using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; #if VIU_STEAMVR_2_0_0_OR_NEWER && UNITY_STANDALONE using Valve.VR; #endif [RequireComponent(typeof(InputField))] public class OverlayKeyboardSample : MonoBehaviour , ISelectHandler , IDeselectHandler { public bool minimalMode; public void OnSelect(BaseEventData eventData) { ShowKeyboard(this); } public void OnDeselect(BaseEventData eventData) { HideKeyboard(); } #if VIU_STEAMVR && UNITY_STANDALONE private static OverlayKeyboardSample activeKeyboard; private static System.Text.StringBuilder strBuilder; private InputField textEntry; private string text = ""; protected virtual void Start() { textEntry = GetComponent(); } protected virtual void OnDisable() { if (activeKeyboard == this) { HideKeyboard(); } } static OverlayKeyboardSample() { #if VIU_STEAMVR_1_2_1_OR_NEWER SteamVR_Events.System(Valve.VR.EVREventType.VREvent_KeyboardCharInput).AddListener(OnKeyboardCharInput); SteamVR_Events.System(Valve.VR.EVREventType.VREvent_KeyboardClosed).AddListener(OnKeyboardClosed); #elif VIU_STEAMVR_1_2_0_OR_NEWER SteamVR_Events.System("KeyboardCharInput").AddListener(OnKeyboardCharInput); SteamVR_Events.System("KeyboardClosed").AddListener(OnKeyboardClosed); #elif VIU_STEAMVR_1_1_1 SteamVR_Utils.Event.Listen("KeyboardCharInput", OnKeyboardCharInputArgs); SteamVR_Utils.Event.Listen("KeyboardClosed", OnKeyboardClosedArgs); #endif } public static void ShowKeyboard(OverlayKeyboardSample caller) { if (activeKeyboard != null) { HideKeyboard(); } if (activeKeyboard == null) { var vr = SteamVR.instance; if (vr != null) { caller.text = caller.textEntry.text; #if VIU_STEAMVR_2_6_0_OR_NEWER uint flag = 0; if (caller.minimalMode) { flag = (uint)EKeyboardFlags.KeyboardFlag_Minimal; } vr.overlay.ShowKeyboard(0, 0, flag, "Description", 256, caller.text, 0); #else vr.overlay.ShowKeyboard(0, 0, "Description", 256, caller.text, caller.minimalMode, 0); #endif } activeKeyboard = caller; } } public static void HideKeyboard() { if (activeKeyboard != null) { var vr = SteamVR.instance; if (vr != null) { vr.overlay.HideKeyboard(); } } activeKeyboard = null; } #if VIU_STEAMVR_1_1_1 private static void OnKeyboardCharInputArgs(params object[] args) { OnKeyboardCharInput((Valve.VR.VREvent_t)args[0]); } private static void OnKeyboardClosedArgs(params object[] args) { OnKeyboardClosed((Valve.VR.VREvent_t)args[0]); } #endif private static void OnKeyboardCharInput(Valve.VR.VREvent_t arg) { if (activeKeyboard == null) { return; } var keyboard = arg.data.keyboard; var inputBytes = new byte[] { keyboard.cNewInput0, keyboard.cNewInput1, keyboard.cNewInput2, keyboard.cNewInput3, keyboard.cNewInput4, keyboard.cNewInput5, keyboard.cNewInput6, keyboard.cNewInput7 }; var len = 0; for (; inputBytes[len] != 0 && len < 7; len++) ; var input = System.Text.Encoding.UTF8.GetString(inputBytes, 0, len); if (activeKeyboard.minimalMode) { if (input == "\b") { if (activeKeyboard.text.Length > 0) { activeKeyboard.text = activeKeyboard.text.Substring(0, activeKeyboard.text.Length - 1); } } else if (input == "\x1b") { // Close the keyboard HideKeyboard(); } else { activeKeyboard.text += input; } activeKeyboard.textEntry.text = activeKeyboard.text; } else { var vr = SteamVR.instance; if (vr != null) { if (strBuilder == null) { strBuilder = new System.Text.StringBuilder(1024); } vr.overlay.GetKeyboardText(strBuilder, 1024); activeKeyboard.text = strBuilder.ToString(); activeKeyboard.textEntry.text = activeKeyboard.text; strBuilder.Length = 0; } } } private static void OnKeyboardClosed(Valve.VR.VREvent_t arg) { activeKeyboard = null; } #else protected virtual void Start() { Debug.LogWarning("SteamVR plugin not found! install it to enable OverlayKeyboard!"); } protected virtual void OnDisable() { } public static void ShowKeyboard(OverlayKeyboardSample caller) { } public static void HideKeyboard() { } #endif }