// SDK Object State|Utilities|90160 namespace VRTK { using UnityEngine; using System.Collections; using System.Reflection; /// /// The SDK Object State script can be used to set the enable/active state of a GameObject or Component based on SDK information. /// /// /// The state can be determined by: /// * The current loaded SDK setup. /// * The current attached Headset type. /// * The current attached Controller type. /// [AddComponentMenu("VRTK/Scripts/Utilities/VRTK_SDKObjectState")] public class VRTK_SDKObjectState : VRTK_SDKControllerReady { [Header("Target Settings")] [Tooltip("The GameObject or Component that is the target of the enable/disable action. If this is left blank then the GameObject that the script is attached to will be used as the `Target`.")] public Object target = null; [Tooltip("The state to set the `Target` to when this script is enabled. Checking this box will enable/activate the `Target`, unchecking will disable/deactivate the `Target`.")] public bool objectState = false; [Tooltip("If the currently loaded SDK Setup matches the one provided here then the `Target` state will be set to the desired `Object State`.")] public VRTK_SDKSetup loadedSDKSetup = null; [Tooltip("If the attached headset type matches the selected headset then the `Target` state will be set to the desired `Object State`.")] public SDK_BaseHeadset.HeadsetType headsetType = SDK_BaseHeadset.HeadsetType.Undefined; [Tooltip("If the current controller type matches the selected controller type then the `Target` state will be set to the desired `Object State`.")] public SDK_BaseController.ControllerType controllerType = SDK_BaseController.ControllerType.Undefined; protected Coroutine checkToggleRoutine; /// /// The SetStateByControllerReference method sets the object state based on the controller type of the given controller reference. /// /// A controller reference to check for the controller type of. public virtual void SetStateByControllerReference(VRTK_ControllerReference controllerReference) { if (VRTK_ControllerReference.IsValid(controllerReference)) { SDK_BaseController.ControllerType foundControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference); if (foundControllerType != SDK_BaseController.ControllerType.Undefined && controllerType == foundControllerType) { ToggleObject(); } } } protected override void OnEnable() { target = (target != null ? target : gameObject); base.OnEnable(); checkToggleRoutine = StartCoroutine(CheckToggleAtEndOfFrame()); } protected override void OnDisable() { base.OnDisable(); if (checkToggleRoutine != null) { StopCoroutine(checkToggleRoutine); } } protected override void ControllerReady(VRTK_ControllerReference controllerReference) { ToggleOnController(controllerReference); } protected virtual IEnumerator CheckToggleAtEndOfFrame() { yield return new WaitForEndOfFrame(); CheckToggle(); } protected virtual void CheckToggle() { ToggleOnSDK(); ToggleOnHeadset(); } protected virtual void ToggleOnSDK() { if (loadedSDKSetup != null && loadedSDKSetup == VRTK_SDKManager.GetLoadedSDKSetup()) { ToggleObject(); } } protected virtual void ToggleOnHeadset() { if (headsetType != SDK_BaseHeadset.HeadsetType.Undefined && headsetType == VRTK_DeviceFinder.GetHeadsetType()) { ToggleObject(); } } protected virtual void ToggleOnController(VRTK_ControllerReference controllerReference) { if (controllerType != SDK_BaseController.ControllerType.Undefined) { SDK_BaseController.ControllerType foundControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference); if (foundControllerType != SDK_BaseController.ControllerType.Undefined && controllerType == foundControllerType) { ToggleObject(); } } } protected virtual void ToggleObject() { if (target is GameObject) { ToggleGameObject(); } else if (VRTK_SharedMethods.IsTypeSubclassOf(target.GetType(), typeof(Component))) { ToggleComponent(); } } protected virtual void ToggleGameObject() { if (target != null) { GameObject toggleTarget = (GameObject)target; toggleTarget.SetActive(objectState); } } protected virtual void ToggleComponent() { if (target != null) { Component toggleTarget = (Component)target; PropertyInfo property = toggleTarget.GetType().GetProperty("enabled"); if (property != null) { property.SetValue(toggleTarget, objectState, null); } } } } }