123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- using UnityEngine;
- using System.Collections;
- namespace CurvedUI {
- /// <summary>
- /// This script switches the hand controlling the UI when a click on the other controller's trigger is detected.
- /// This emulates the functionality seen in SteamVR overlay or Oculus Home.
- /// Works both for SteamVR and Oculus SDK.
- /// </summary>
- public class CurvedUIHandSwitcher : MonoBehaviour
- {
- #pragma warning disable 0649
- #pragma warning disable 414
- [SerializeField]
- GameObject LaserBeam;
- [SerializeField]
- [Tooltip("If true, when player clicks the trigger on the other hand, we'll instantly set it as UI controlling hand and move the pointer to it.")]
- bool autoSwitchHands = true;
- #pragma warning restore 414
- #pragma warning restore 0649
- #if CURVEDUI_OCULUSVR
- //variables
- OVRInput.Controller activeCont;
- bool initialized = false;
- void Update()
- {
- if (CurvedUIInputModule.ControlMethod != CurvedUIInputModule.CUIControlMethod.OCULUSVR) return;
- activeCont = OVRInput.GetActiveController();
- if (!initialized && CurvedUIInputModule.Instance.OculusTouchUsedControllerTransform != null)
- {
- //Launch Hand Switch. This will place the laser pointer in the current hand.
- SwitchHandTo(CurvedUIInputModule.Instance.UsedHand);
- initialized = true;
- }
- //for Oculus Go and GearVR, switch automatically if a different controller is connected.
- //This covers the case where User changes hand setting in Oculus Go menu and gets back to our app.
- if (activeCont == OVRInput.Controller.LTrackedRemote && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Left)
- SwitchHandTo(CurvedUIInputModule.Hand.Left);
- else if (activeCont == OVRInput.Controller.RTrackedRemote && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Right)
- SwitchHandTo(CurvedUIInputModule.Hand.Right);
- if(autoSwitchHands){
- //For Oculus Rift, we wait for the click before we change the pointer.
- if (IsButtonDownOnController(OVRInput.Controller.LTouch) && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Left)
- {
- SwitchHandTo(CurvedUIInputModule.Hand.Left);
- }
- else if (IsButtonDownOnController(OVRInput.Controller.RTouch) && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Right)
- {
- SwitchHandTo(CurvedUIInputModule.Hand.Right);
- }
- }
- }
- bool IsButtonDownOnController(OVRInput.Controller cont, OVRInput.Controller cont2 = OVRInput.Controller.None)
- {
- return OVRInput.GetDown(CurvedUIInputModule.Instance.OculusTouchInteractionButton, cont) || (cont2 != OVRInput.Controller.None && OVRInput.GetDown(CurvedUIInputModule.Instance.OculusTouchInteractionButton, cont2));
- }
- #elif CURVEDUI_STEAMVR_LEGACY
- void Start()
- {
- //connect to steamVR's OnModelLoaded events so we can update the pointer the moment controller is detected.
- CurvedUIInputModule.Right.ModelLoaded += OnModelLoaded;
- CurvedUIInputModule.Left.ModelLoaded += OnModelLoaded;
- }
- void OnModelLoaded(object sender)
- {
- SwitchHandTo(CurvedUIInputModule.Instance.UsedHand);
- }
- void Update()
- {
- if (CurvedUIInputModule.ControlMethod != CurvedUIInputModule.CUIControlMethod.STEAMVR_LEGACY) return;
- if(autoSwitchHands){
- if (CurvedUIInputModule.Right != null && CurvedUIInputModule.Right.IsTriggerDown && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Right)
- {
- SwitchHandTo(CurvedUIInputModule.Hand.Right);
- }
- else if (CurvedUIInputModule.Left != null && CurvedUIInputModule.Left.IsTriggerDown && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Left)
- {
- SwitchHandTo(CurvedUIInputModule.Hand.Left);
- }
- }
- }
- #elif CURVEDUI_STEAMVR_2
- void Start()
- {
- //initial setup in proper hand
- SwitchHandTo(CurvedUIInputModule.Instance.UsedHand);
- }
- void Update()
- {
- if (CurvedUIInputModule.ControlMethod != CurvedUIInputModule.CUIControlMethod.STEAMVR_2) return;
- //Switch hands during runtime when user clicks the action button on another controller
- if (autoSwitchHands && CurvedUIInputModule.Instance.SteamVRClickAction != null)
- {
- if (CurvedUIInputModule.Instance.SteamVRClickAction.GetState(Valve.VR.SteamVR_Input_Sources.RightHand) && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Right){
- SwitchHandTo(CurvedUIInputModule.Hand.Right);
- }
- else if (CurvedUIInputModule.Instance.SteamVRClickAction.GetState(Valve.VR.SteamVR_Input_Sources.LeftHand) && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Left ){
- SwitchHandTo(CurvedUIInputModule.Hand.Left);
- }
- }
- }
-
- #elif CURVEDUI_UNITY_XR
- void Start()
- {
- //initial setup in proper hand
- SwitchHandTo(CurvedUIInputModule.Instance.UsedHand);
- }
- void Update()
- {
- if (!autoSwitchHands || CurvedUIInputModule.ControlMethod != CurvedUIInputModule.CUIControlMethod.UNITY_XR) return;
- bool pressed = false;
- if (CurvedUIInputModule.Instance.RightXRController != null && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Right)
- {
- //get pressed ui button state on right controller.
- CurvedUIInputModule.Instance.RightXRController.inputDevice.IsPressed(CurvedUIInputModule.Instance.RightXRController.uiPressUsage,
- out pressed, CurvedUIInputModule.Instance.RightXRController.axisToPressThreshold);
- if(pressed)
- SwitchHandTo(CurvedUIInputModule.Hand.Right);
- }
-
- if (CurvedUIInputModule.Instance.LeftXRController != null && CurvedUIInputModule.Instance.UsedHand != CurvedUIInputModule.Hand.Left)
- {
- //get pressed ui button state on left controller.
- CurvedUIInputModule.Instance.LeftXRController.inputDevice.IsPressed(CurvedUIInputModule.Instance.LeftXRController.uiPressUsage,
- out pressed, CurvedUIInputModule.Instance.LeftXRController.axisToPressThreshold);
- if(pressed)
- SwitchHandTo(CurvedUIInputModule.Hand.Left);
- }
- }
- #endif
- #region HELPER FUNCTIONS
- void SwitchHandTo(CurvedUIInputModule.Hand newHand)
- {
- CurvedUIInputModule.Instance.UsedHand = newHand;
- if (CurvedUIInputModule.Instance.ControllerTransform)
- {
- LaserBeam.transform.SetParent(CurvedUIInputModule.Instance.ControllerTransform);
- LaserBeam.transform.ResetTransform();
- LaserBeam.transform.LookAt(LaserBeam.transform.position + CurvedUIInputModule.Instance.ControllerPointingDirection);
- }
- else Debug.LogError("CURVEDUI: No Active controller that can be used as a parent of the pointer. Is the controller gameobject present on the scene and active?");
- }
- #endregion
- }
- }
|