Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

146 lines
5.6 KiB

// 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);
}
}
}
}
}