|
|
- // SDK Object State|Utilities|90160
- namespace VRTK
- {
- using UnityEngine;
- using System.Collections;
- using System.Reflection;
-
- /// <summary>
- /// The SDK Object State script can be used to set the enable/active state of a GameObject or Component based on SDK information.
- /// </summary>
- /// <remarks>
- /// The state can be determined by:
- /// * The current loaded SDK setup.
- /// * The current attached Headset type.
- /// * The current attached Controller type.
- /// </remarks>
- [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;
-
- /// <summary>
- /// The SetStateByControllerReference method sets the object state based on the controller type of the given controller reference.
- /// </summary>
- /// <param name="controllerReference">A controller reference to check for the controller type of.</param>
- 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);
- }
- }
- }
- }
- }
|