/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using UnityEngine; /// /// Simple helper script that conditionally enables rendering of a controller if it is connected. /// public class OVRControllerHelper : MonoBehaviour { /// /// The root GameObject that represents the Oculus Touch for Quest And RiftS Controller model (Left). /// public GameObject m_modelOculusTouchQuestAndRiftSLeftController; /// /// The root GameObject that represents the Oculus Touch for Quest And RiftS Controller model (Right). /// public GameObject m_modelOculusTouchQuestAndRiftSRightController; /// /// The root GameObject that represents the Oculus Touch for Rift Controller model (Left). /// public GameObject m_modelOculusTouchRiftLeftController; /// /// The root GameObject that represents the Oculus Touch for Rift Controller model (Right). /// public GameObject m_modelOculusTouchRiftRightController; /// /// The root GameObject that represents the Oculus Touch for Quest 2 Controller model (Left). /// public GameObject m_modelOculusTouchQuest2LeftController; /// /// The root GameObject that represents the Oculus Touch for Quest 2 Controller model (Right). /// public GameObject m_modelOculusTouchQuest2RightController; /// /// The controller that determines whether or not to enable rendering of the controller model. /// public OVRInput.Controller m_controller; /// /// The animator component that contains the controller animation controller for animating buttons and triggers. /// private Animator m_animator; private GameObject m_activeController; private bool m_controllerModelsInitialized = false; private bool m_hasInputFocus = true; private bool m_hasInputFocusPrev = false; private enum ControllerType { QuestAndRiftS = 1, Rift = 2, Quest2 = 3, } private ControllerType activeControllerType = ControllerType.Rift; private bool m_prevControllerConnected = false; private bool m_prevControllerConnectedCached = false; void Start() { if (OVRManager.OVRManagerinitialized) { InitializeControllerModels(); } } void InitializeControllerModels() { if (m_controllerModelsInitialized) return; OVRPlugin.SystemHeadset headset = OVRPlugin.GetSystemHeadsetType(); switch (headset) { case OVRPlugin.SystemHeadset.Rift_CV1: activeControllerType = ControllerType.Rift; break; case OVRPlugin.SystemHeadset.Oculus_Quest_2: activeControllerType = ControllerType.Quest2; break; case OVRPlugin.SystemHeadset.Oculus_Link_Quest_2: activeControllerType = ControllerType.Quest2; break; default: activeControllerType = ControllerType.QuestAndRiftS; break; } Debug.LogFormat("OVRControllerHelp: Active controller type: {0} for product {1} (headset {2})", activeControllerType, OVRPlugin.productName, headset); // Hide all controller models until controller get connected m_modelOculusTouchQuestAndRiftSLeftController.SetActive(false); m_modelOculusTouchQuestAndRiftSRightController.SetActive(false); m_modelOculusTouchRiftLeftController.SetActive(false); m_modelOculusTouchRiftRightController.SetActive(false); m_modelOculusTouchQuest2LeftController.SetActive(false); m_modelOculusTouchQuest2RightController.SetActive(false); OVRManager.InputFocusAcquired += InputFocusAquired; OVRManager.InputFocusLost += InputFocusLost; m_controllerModelsInitialized = true; } void Update() { if (!m_controllerModelsInitialized) { if (OVRManager.OVRManagerinitialized) { InitializeControllerModels(); } else { return; } } bool controllerConnected = OVRInput.IsControllerConnected(m_controller); if ((controllerConnected != m_prevControllerConnected) || !m_prevControllerConnectedCached || (m_hasInputFocus != m_hasInputFocusPrev)) { if (activeControllerType == ControllerType.Rift) { m_modelOculusTouchQuestAndRiftSLeftController.SetActive(false); m_modelOculusTouchQuestAndRiftSRightController.SetActive(false); m_modelOculusTouchRiftLeftController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.LTouch)); m_modelOculusTouchRiftRightController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.RTouch)); m_modelOculusTouchQuest2LeftController.SetActive(false); m_modelOculusTouchQuest2RightController.SetActive(false); m_animator = m_controller == OVRInput.Controller.LTouch ? m_modelOculusTouchRiftLeftController.GetComponent() : m_modelOculusTouchRiftRightController.GetComponent(); m_activeController = m_controller == OVRInput.Controller.LTouch ? m_modelOculusTouchRiftLeftController : m_modelOculusTouchRiftRightController; } else if (activeControllerType == ControllerType.Quest2) { m_modelOculusTouchQuestAndRiftSLeftController.SetActive(false); m_modelOculusTouchQuestAndRiftSRightController.SetActive(false); m_modelOculusTouchRiftLeftController.SetActive(false); m_modelOculusTouchRiftRightController.SetActive(false); m_modelOculusTouchQuest2LeftController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.LTouch)); m_modelOculusTouchQuest2RightController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.RTouch)); m_animator = m_controller == OVRInput.Controller.LTouch ? m_modelOculusTouchQuest2LeftController.GetComponent() : m_modelOculusTouchQuest2RightController.GetComponent(); m_activeController = m_controller == OVRInput.Controller.LTouch ? m_modelOculusTouchQuest2LeftController : m_modelOculusTouchQuest2RightController; } else /*if (activeControllerType == ControllerType.QuestAndRiftS)*/ { m_modelOculusTouchQuestAndRiftSLeftController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.LTouch)); m_modelOculusTouchQuestAndRiftSRightController.SetActive(controllerConnected && (m_controller == OVRInput.Controller.RTouch)); m_modelOculusTouchRiftLeftController.SetActive(false); m_modelOculusTouchRiftRightController.SetActive(false); m_modelOculusTouchQuest2LeftController.SetActive(false); m_modelOculusTouchQuest2RightController.SetActive(false); m_animator = m_controller == OVRInput.Controller.LTouch ? m_modelOculusTouchQuestAndRiftSLeftController.GetComponent() : m_modelOculusTouchQuestAndRiftSRightController.GetComponent(); m_activeController = m_controller == OVRInput.Controller.LTouch ? m_modelOculusTouchQuestAndRiftSLeftController : m_modelOculusTouchQuestAndRiftSRightController; } m_activeController.SetActive(m_hasInputFocus && controllerConnected); m_prevControllerConnected = controllerConnected; m_prevControllerConnectedCached = true; m_hasInputFocusPrev = m_hasInputFocus; } if (m_animator != null) { m_animator.SetFloat("Button 1", OVRInput.Get(OVRInput.Button.One, m_controller) ? 1.0f : 0.0f); m_animator.SetFloat("Button 2", OVRInput.Get(OVRInput.Button.Two, m_controller) ? 1.0f : 0.0f); m_animator.SetFloat("Button 3", OVRInput.Get(OVRInput.Button.Start, m_controller) ? 1.0f : 0.0f); m_animator.SetFloat("Joy X", OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick, m_controller).x); m_animator.SetFloat("Joy Y", OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick, m_controller).y); m_animator.SetFloat("Trigger", OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger, m_controller)); m_animator.SetFloat("Grip", OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger, m_controller)); } } public void InputFocusAquired() { m_hasInputFocus = true; } public void InputFocusLost() { m_hasInputFocus = false; } }