|
// Interact Object Appearance|Interactables|35030
|
|
namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
/// <summary>
|
|
/// Event Payload
|
|
/// </summary>
|
|
/// <param name="affectingObject">The GameObject that is being affected.</param>
|
|
/// <param name="monitoringObject">The Interactable Object that is being monitored.</param>
|
|
/// <param name="interactionType">The type of interaction initiating the event.</param>
|
|
public struct InteractObjectAppearanceEventArgs
|
|
{
|
|
public GameObject affectingObject;
|
|
public GameObject objectToIgnore;
|
|
public VRTK_InteractableObject monitoringObject;
|
|
public VRTK_InteractableObject.InteractionType interactionType;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event Payload
|
|
/// </summary>
|
|
/// <param name="sender">this object</param>
|
|
/// <param name="e"><see cref="InteractObjectAppearanceEventArgs"/></param>
|
|
public delegate void InteractObjectAppearanceEventHandler(object sender, InteractObjectAppearanceEventArgs e);
|
|
|
|
/// <summary>
|
|
/// Determine whether the `Object To Affect` should be visible or hidden by default or on interaction (near touch, touch, grab, use).
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// **Required Components:**
|
|
/// * `VRTK_InteractableObject` - The Interactable Object component to detect interactions on. This must be applied on the same GameObject as this script if one is not provided via the `Object To Monitor` parameter.
|
|
///
|
|
/// **Script Usage:**
|
|
/// * Place the `VRTK_InteractObjectAppearance` script on either:
|
|
/// * The GameObject of the Interactable Object to detect interactions on.
|
|
/// * Any other scene GameObject and provide a valid `VRTK_InteractableObject` component to the `Object To Monitor` parameter of this script.
|
|
/// * Optionally provide a GameObject to the `Object To Affect` parameter to determine which GameObject to affect the appearance of.
|
|
/// </remarks>
|
|
/// <example>
|
|
/// `VRTK/Examples/008_Controller_UsingAGrabbedObject` shows that the controller can be hidden when touching, grabbing and using an object.
|
|
/// </example>
|
|
[AddComponentMenu("VRTK/Scripts/Interactions/Interactables/VRTK_InteractObjectAppearance")]
|
|
public class VRTK_InteractObjectAppearance : VRTK_InteractableListener
|
|
{
|
|
/// <summary>
|
|
/// The valid interacting object.
|
|
/// </summary>
|
|
public enum ValidInteractingObject
|
|
{
|
|
/// <summary>
|
|
/// Any GameObject is considered a valid interacting object.
|
|
/// </summary>
|
|
Anything,
|
|
/// <summary>
|
|
/// Only a game controller is considered a valid interacting objcet.
|
|
/// </summary>
|
|
EitherController,
|
|
/// <summary>
|
|
/// Any GameObject except a game controller is considered a valid interacting object.
|
|
/// </summary>
|
|
NeitherController,
|
|
/// <summary>
|
|
/// Only the left game controller is considered a valid interacting objcet.
|
|
/// </summary>
|
|
LeftControllerOnly,
|
|
/// <summary>
|
|
/// Only the right game controller is considered a valid interacting objcet.
|
|
/// </summary>
|
|
RightControllerOnly
|
|
}
|
|
|
|
[Header("General Settings")]
|
|
|
|
[Tooltip("The GameObject to affect the appearance of. If this is null then then the interacting object will be used (usually the controller).")]
|
|
public GameObject objectToAffect;
|
|
[SerializeField]
|
|
[Tooltip("The Interactable Object to monitor for the interaction event (near touch/touch/grab/use).")]
|
|
protected VRTK_InteractableObject objectToMonitor;
|
|
|
|
[Header("Default Appearance Settings")]
|
|
|
|
[Tooltip("If this is checked then the `Object To Affect` will be an active GameObject when the script is enabled. If it's unchecked then it will be disabled. This only takes effect if `Affect Interacting Object` is unticked.")]
|
|
public bool gameObjectActiveByDefault = true;
|
|
[Tooltip("If this is checked then the `Object To Affect` will have visible renderers when the script is enabled. If it's unchecked then it will have it's renderers disabled. This only takes effect if `Affect Interacting Object` is unticked.")]
|
|
public bool rendererVisibleByDefault = true;
|
|
|
|
[Header("Near Touch Appearance Settings")]
|
|
|
|
[Tooltip("If this is checked then the `Object To Affect` will be an active GameObject when the `Object To Monitor` is near touched. If it's unchecked then it will be disabled on near touch.")]
|
|
public bool gameObjectActiveOnNearTouch = true;
|
|
[Tooltip("If this is checked then the `Object To Affect` will have visible renderers when the `Object To Monitor` is near touched. If it's unchecked then it will have it's renderers disabled on near touch.")]
|
|
public bool rendererVisibleOnNearTouch = true;
|
|
[Tooltip("The amount of time to wait before the near touch appearance settings are applied after the near touch event.")]
|
|
public float nearTouchAppearanceDelay = 0f;
|
|
[Tooltip("The amount of time to wait before the previous appearance settings are applied after the near untouch event.")]
|
|
public float nearUntouchAppearanceDelay = 0f;
|
|
[Tooltip("Determines what type of interacting object will affect the appearance of the `Object To Affect` after the near touch and near untouch event.")]
|
|
public ValidInteractingObject validNearTouchInteractingObject = ValidInteractingObject.Anything;
|
|
|
|
[Header("Touch Appearance Settings")]
|
|
|
|
[Tooltip("If this is checked then the `Object To Affect` will be an active GameObject when the `Object To Monitor` is touched. If it's unchecked then it will be disabled on touch.")]
|
|
public bool gameObjectActiveOnTouch = true;
|
|
[Tooltip("If this is checked then the `Object To Affect` will have visible renderers when the `Object To Monitor` is touched. If it's unchecked then it will have it's renderers disabled on touch.")]
|
|
public bool rendererVisibleOnTouch = true;
|
|
[Tooltip("The amount of time to wait before the touch appearance settings are applied after the touch event.")]
|
|
public float touchAppearanceDelay = 0f;
|
|
[Tooltip("The amount of time to wait before the previous appearance settings are applied after the untouch event.")]
|
|
public float untouchAppearanceDelay = 0f;
|
|
[Tooltip("Determines what type of interacting object will affect the appearance of the `Object To Affect` after the touch/untouch event.")]
|
|
public ValidInteractingObject validTouchInteractingObject = ValidInteractingObject.Anything;
|
|
|
|
[Header("Grab Appearance Settings")]
|
|
|
|
[Tooltip("If this is checked then the `Object To Affect` will be an active GameObject when the `Object To Monitor` is grabbed. If it's unchecked then it will be disabled on grab.")]
|
|
public bool gameObjectActiveOnGrab = true;
|
|
[Tooltip("If this is checked then the `Object To Affect` will have visible renderers when the `Object To Monitor` is grabbed. If it's unchecked then it will have it's renderers disabled on grab.")]
|
|
public bool rendererVisibleOnGrab = true;
|
|
[Tooltip("The amount of time to wait before the grab appearance settings are applied after the grab event.")]
|
|
public float grabAppearanceDelay = 0f;
|
|
[Tooltip("The amount of time to wait before the previous appearance settings are applied after the ungrab event.")]
|
|
public float ungrabAppearanceDelay = 0f;
|
|
[Tooltip("Determines what type of interacting object will affect the appearance of the `Object To Affect` after the grab/ungrab event.")]
|
|
public ValidInteractingObject validGrabInteractingObject = ValidInteractingObject.Anything;
|
|
|
|
[Header("Use Appearance Settings")]
|
|
|
|
[Tooltip("If this is checked then the `Object To Affect` will be an active GameObject when the `Object To Monitor` is used. If it's unchecked then it will be disabled on use.")]
|
|
public bool gameObjectActiveOnUse = true;
|
|
[Tooltip("If this is checked then the `Object To Affect` will have visible renderers when the `Object To Monitor` is used. If it's unchecked then it will have it's renderers disabled on use.")]
|
|
public bool rendererVisibleOnUse = true;
|
|
[Tooltip("The amount of time to wait before the use appearance settings are applied after the use event.")]
|
|
public float useAppearanceDelay = 0f;
|
|
[Tooltip("The amount of time to wait before the previous appearance settings are applied after the unuse event.")]
|
|
public float unuseAppearanceDelay = 0f;
|
|
[Tooltip("Determines what type of interacting object will affect the appearance of the `Object To Affect` after the use/unuse event.")]
|
|
public ValidInteractingObject validUseInteractingObject = ValidInteractingObject.Anything;
|
|
|
|
/// <summary>
|
|
/// Emitted when the GameObject on the `Object To Affect` is enabled.
|
|
/// </summary>
|
|
public event InteractObjectAppearanceEventHandler GameObjectEnabled;
|
|
/// <summary>
|
|
/// Emitted when the GameObject on the `Object To Affect` is disabled.
|
|
/// </summary>
|
|
public event InteractObjectAppearanceEventHandler GameObjectDisabled;
|
|
/// <summary>
|
|
/// Emitted when the Renderers on the `Object To Affect` are enabled.
|
|
/// </summary>
|
|
public event InteractObjectAppearanceEventHandler RenderersEnabled;
|
|
/// <summary>
|
|
/// Emitted when the Renderers on the `Object To Affect` are disabled.
|
|
/// </summary>
|
|
public event InteractObjectAppearanceEventHandler RenderersDisabled;
|
|
|
|
protected Dictionary<GameObject, bool> currentRenderStates = new Dictionary<GameObject, bool>();
|
|
protected Dictionary<GameObject, bool> currentGameObjectStates = new Dictionary<GameObject, bool>();
|
|
protected Dictionary<GameObject, Coroutine> affectingRoutines = new Dictionary<GameObject, Coroutine>();
|
|
protected HashSet<GameObject> nearTouchingObjects = new HashSet<GameObject>();
|
|
protected HashSet<GameObject> touchingObjects = new HashSet<GameObject>();
|
|
|
|
public virtual void OnGameObjectEnabled(InteractObjectAppearanceEventArgs e)
|
|
{
|
|
if (GameObjectEnabled != null)
|
|
{
|
|
GameObjectEnabled(this, e);
|
|
}
|
|
}
|
|
|
|
public virtual void OnGameObjectDisabled(InteractObjectAppearanceEventArgs e)
|
|
{
|
|
if (GameObjectDisabled != null)
|
|
{
|
|
GameObjectDisabled(this, e);
|
|
}
|
|
}
|
|
|
|
public virtual void OnRenderersEnabled(InteractObjectAppearanceEventArgs e)
|
|
{
|
|
if (RenderersEnabled != null)
|
|
{
|
|
RenderersEnabled(this, e);
|
|
}
|
|
}
|
|
|
|
public virtual void OnRenderersDisabled(InteractObjectAppearanceEventArgs e)
|
|
{
|
|
if (RenderersDisabled != null)
|
|
{
|
|
RenderersDisabled(this, e);
|
|
}
|
|
}
|
|
|
|
protected virtual void OnEnable()
|
|
{
|
|
currentRenderStates.Clear();
|
|
currentGameObjectStates.Clear();
|
|
affectingRoutines.Clear();
|
|
nearTouchingObjects.Clear();
|
|
touchingObjects.Clear();
|
|
EnableListeners();
|
|
if (objectToAffect != null)
|
|
{
|
|
ToggleState(objectToAffect, gameObjectActiveByDefault, rendererVisibleByDefault, VRTK_InteractableObject.InteractionType.None);
|
|
}
|
|
}
|
|
|
|
protected virtual void OnDisable()
|
|
{
|
|
DisableListeners();
|
|
CancelRoutines();
|
|
}
|
|
|
|
protected override bool SetupListeners(bool throwError)
|
|
{
|
|
objectToMonitor = (objectToMonitor == null ? GetComponentInParent<VRTK_InteractableObject>() : objectToMonitor);
|
|
if (objectToMonitor != null)
|
|
{
|
|
objectToMonitor.InteractableObjectDisabled += InteractableObjectDisabled;
|
|
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.NearTouch, InteractableObjectNearTouched);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.NearUntouch, InteractableObjectNearUntouched);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.Touch, InteractableObjectTouched);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.Untouch, InteractableObjectUntouched);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.Grab, InteractableObjectGrabbed);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.Ungrab, InteractableObjectUngrabbed);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.Use, InteractableObjectUsed);
|
|
objectToMonitor.SubscribeToInteractionEvent(VRTK_InteractableObject.InteractionType.Unuse, InteractableObjectUnused);
|
|
return true;
|
|
}
|
|
else if (throwError)
|
|
{
|
|
VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_NOT_INJECTED, "VRTK_InteractObjectAppearance", "VRTK_InteractableObject", "objectToMonitor", "current or parent"));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected override void TearDownListeners()
|
|
{
|
|
if (objectToMonitor != null)
|
|
{
|
|
RestoreDefaults();
|
|
objectToMonitor.InteractableObjectDisabled -= InteractableObjectDisabled;
|
|
|
|
objectToMonitor.UnsubscribeFromInteractionEvent(VRTK_InteractableObject.InteractionType.Touch, InteractableObjectTouched);
|
|
objectToMonitor.UnsubscribeFromInteractionEvent(VRTK_InteractableObject.InteractionType.Untouch, InteractableObjectUntouched);
|
|
objectToMonitor.UnsubscribeFromInteractionEvent(VRTK_InteractableObject.InteractionType.Grab, InteractableObjectGrabbed);
|
|
objectToMonitor.UnsubscribeFromInteractionEvent(VRTK_InteractableObject.InteractionType.Ungrab, InteractableObjectUngrabbed);
|
|
objectToMonitor.UnsubscribeFromInteractionEvent(VRTK_InteractableObject.InteractionType.Use, InteractableObjectUsed);
|
|
objectToMonitor.UnsubscribeFromInteractionEvent(VRTK_InteractableObject.InteractionType.Unuse, InteractableObjectUnused);
|
|
}
|
|
}
|
|
|
|
protected virtual InteractObjectAppearanceEventArgs SetPayload(GameObject affectingObject, VRTK_InteractableObject.InteractionType interactionType)
|
|
{
|
|
InteractObjectAppearanceEventArgs e;
|
|
e.affectingObject = affectingObject;
|
|
e.monitoringObject = objectToMonitor;
|
|
e.objectToIgnore = ObjectToIgnore();
|
|
e.interactionType = interactionType;
|
|
return e;
|
|
}
|
|
|
|
protected virtual void RestoreDefaults()
|
|
{
|
|
if (objectToMonitor != null && objectToMonitor.IsTouched())
|
|
{
|
|
foreach (GameObject touchingObject in new HashSet<GameObject>(touchingObjects))
|
|
{
|
|
ToggleState(touchingObject, gameObjectActiveByDefault, rendererVisibleByDefault, VRTK_InteractableObject.InteractionType.None);
|
|
}
|
|
|
|
foreach (GameObject nearTouchingObject in new HashSet<GameObject>(nearTouchingObjects))
|
|
{
|
|
ToggleState(nearTouchingObject, gameObjectActiveByDefault, rendererVisibleByDefault, VRTK_InteractableObject.InteractionType.None);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual GameObject ObjectToIgnore()
|
|
{
|
|
return (objectToAffect == null ? objectToMonitor.gameObject : null);
|
|
}
|
|
|
|
protected virtual void EmitRenderEvent(GameObject objectToToggle, bool rendererShow, VRTK_InteractableObject.InteractionType interactionType)
|
|
{
|
|
if (rendererShow)
|
|
{
|
|
OnRenderersEnabled(SetPayload(objectToToggle, interactionType));
|
|
}
|
|
else
|
|
{
|
|
OnRenderersDisabled(SetPayload(objectToToggle, interactionType));
|
|
}
|
|
}
|
|
|
|
protected virtual void EmitGameObjectEvent(GameObject objectToToggle, bool gameObjectShow, VRTK_InteractableObject.InteractionType interactionType)
|
|
{
|
|
if (gameObjectShow)
|
|
{
|
|
OnGameObjectEnabled(SetPayload(objectToToggle, interactionType));
|
|
}
|
|
else
|
|
{
|
|
OnGameObjectDisabled(SetPayload(objectToToggle, interactionType));
|
|
}
|
|
}
|
|
|
|
protected virtual void ToggleState(GameObject objectToToggle, bool gameObjectShow, bool rendererShow, VRTK_InteractableObject.InteractionType interactionType)
|
|
{
|
|
if (objectToToggle != null)
|
|
{
|
|
if (!currentRenderStates.ContainsKey(objectToToggle) || currentRenderStates[objectToToggle] != rendererShow)
|
|
{
|
|
VRTK_ObjectAppearance.ToggleRenderer(rendererShow, objectToToggle, ObjectToIgnore());
|
|
EmitRenderEvent(objectToToggle, rendererShow, interactionType);
|
|
}
|
|
|
|
if (!currentGameObjectStates.ContainsKey(objectToToggle) || currentGameObjectStates[objectToToggle] != gameObjectShow)
|
|
{
|
|
objectToToggle.SetActive(gameObjectShow);
|
|
EmitGameObjectEvent(objectToToggle, gameObjectShow, interactionType);
|
|
}
|
|
|
|
VRTK_SharedMethods.AddDictionaryValue(currentRenderStates, objectToToggle, rendererShow, true);
|
|
VRTK_SharedMethods.AddDictionaryValue(currentGameObjectStates, objectToToggle, gameObjectShow, true);
|
|
}
|
|
}
|
|
|
|
protected virtual IEnumerator ToggleStateAfterTime(GameObject objectToToggle, bool gameObjectShow, bool rendererShow, float delayTime, VRTK_InteractableObject.InteractionType interactionType)
|
|
{
|
|
yield return new WaitForSeconds(delayTime);
|
|
ToggleState(objectToToggle, gameObjectShow, rendererShow, interactionType);
|
|
}
|
|
|
|
protected virtual void CancelRoutines(GameObject currentAffectingObject = null)
|
|
{
|
|
if (currentAffectingObject != null)
|
|
{
|
|
Coroutine currentAffectingRoutine = VRTK_SharedMethods.GetDictionaryValue(affectingRoutines, currentAffectingObject);
|
|
if (currentAffectingRoutine != null)
|
|
{
|
|
StopCoroutine(currentAffectingRoutine);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (KeyValuePair<GameObject, Coroutine> affectingRouting in affectingRoutines)
|
|
{
|
|
if (currentAffectingObject == affectingRouting.Key && affectingRouting.Value != null)
|
|
{
|
|
StopCoroutine(affectingRouting.Value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual GameObject GetActualController(GameObject givenObject)
|
|
{
|
|
VRTK_ControllerReference controllerReference = VRTK_ControllerReference.GetControllerReference(givenObject);
|
|
if (VRTK_ControllerReference.IsValid(controllerReference))
|
|
{
|
|
return controllerReference.actual;
|
|
}
|
|
else
|
|
{
|
|
return givenObject;
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectDisabled(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (objectToMonitor != null && !objectToMonitor.gameObject.activeInHierarchy)
|
|
{
|
|
RestoreDefaults();
|
|
}
|
|
}
|
|
|
|
protected virtual bool IsValidInteractingObject(GameObject givenObject, ValidInteractingObject givenInteractingObjectValidType)
|
|
{
|
|
if (gameObject.activeInHierarchy)
|
|
{
|
|
VRTK_ControllerReference controllerReference = VRTK_ControllerReference.GetControllerReference(givenObject);
|
|
switch (givenInteractingObjectValidType)
|
|
{
|
|
case ValidInteractingObject.Anything:
|
|
return true;
|
|
case ValidInteractingObject.EitherController:
|
|
return VRTK_ControllerReference.IsValid(controllerReference);
|
|
case ValidInteractingObject.NeitherController:
|
|
return !VRTK_ControllerReference.IsValid(controllerReference);
|
|
case ValidInteractingObject.LeftControllerOnly:
|
|
return (VRTK_ControllerReference.IsValid(controllerReference) && controllerReference.hand == SDK_BaseController.ControllerHand.Left);
|
|
case ValidInteractingObject.RightControllerOnly:
|
|
return (VRTK_ControllerReference.IsValid(controllerReference) && controllerReference.hand == SDK_BaseController.ControllerHand.Right);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected virtual void InteractableObjectNearTouched(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validNearTouchInteractingObject))
|
|
{
|
|
GameObject nearTouchAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(nearTouchAffectedObject);
|
|
nearTouchingObjects.Add(nearTouchAffectedObject);
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, nearTouchAffectedObject, StartCoroutine(ToggleStateAfterTime(nearTouchAffectedObject, gameObjectActiveOnNearTouch, rendererVisibleOnNearTouch, nearTouchAppearanceDelay, VRTK_InteractableObject.InteractionType.NearTouch)), true);
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectNearUntouched(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validNearTouchInteractingObject))
|
|
{
|
|
GameObject nearTouchAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(nearTouchAffectedObject);
|
|
nearTouchingObjects.Remove(nearTouchAffectedObject);
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, nearTouchAffectedObject, StartCoroutine(ToggleStateAfterTime(nearTouchAffectedObject, gameObjectActiveByDefault, rendererVisibleByDefault, nearUntouchAppearanceDelay, VRTK_InteractableObject.InteractionType.NearUntouch)), true);
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectTouched(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validTouchInteractingObject))
|
|
{
|
|
GameObject touchAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(touchAffectedObject);
|
|
touchingObjects.Add(touchAffectedObject);
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, touchAffectedObject, StartCoroutine(ToggleStateAfterTime(touchAffectedObject, gameObjectActiveOnTouch, rendererVisibleOnTouch, touchAppearanceDelay, VRTK_InteractableObject.InteractionType.Touch)), true);
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectUntouched(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validTouchInteractingObject))
|
|
{
|
|
GameObject touchAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(touchAffectedObject);
|
|
touchingObjects.Remove(touchAffectedObject);
|
|
if (objectToMonitor.IsNearTouched())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, touchAffectedObject, StartCoroutine(ToggleStateAfterTime(touchAffectedObject, gameObjectActiveOnNearTouch, rendererVisibleOnNearTouch, untouchAppearanceDelay, VRTK_InteractableObject.InteractionType.NearTouch)), true);
|
|
}
|
|
else
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, touchAffectedObject, StartCoroutine(ToggleStateAfterTime(touchAffectedObject, gameObjectActiveByDefault, rendererVisibleByDefault, untouchAppearanceDelay, VRTK_InteractableObject.InteractionType.Untouch)), true);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectGrabbed(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validGrabInteractingObject))
|
|
{
|
|
GameObject grabAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(grabAffectedObject);
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, grabAffectedObject, StartCoroutine(ToggleStateAfterTime(grabAffectedObject, gameObjectActiveOnGrab, rendererVisibleOnGrab, grabAppearanceDelay, VRTK_InteractableObject.InteractionType.Grab)), true);
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectUngrabbed(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validGrabInteractingObject))
|
|
{
|
|
GameObject grabAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(grabAffectedObject);
|
|
if (objectToMonitor.IsUsing())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, grabAffectedObject, StartCoroutine(ToggleStateAfterTime(grabAffectedObject, gameObjectActiveOnUse, rendererVisibleOnUse, ungrabAppearanceDelay, VRTK_InteractableObject.InteractionType.Ungrab)), true);
|
|
}
|
|
else if (objectToMonitor.IsTouched())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, grabAffectedObject, StartCoroutine(ToggleStateAfterTime(grabAffectedObject, gameObjectActiveOnTouch, rendererVisibleOnTouch, ungrabAppearanceDelay, VRTK_InteractableObject.InteractionType.Ungrab)), true);
|
|
}
|
|
else if (objectToMonitor.IsNearTouched())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, grabAffectedObject, StartCoroutine(ToggleStateAfterTime(grabAffectedObject, gameObjectActiveOnNearTouch, rendererVisibleOnNearTouch, ungrabAppearanceDelay, VRTK_InteractableObject.InteractionType.NearTouch)), true);
|
|
}
|
|
else
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, grabAffectedObject, StartCoroutine(ToggleStateAfterTime(grabAffectedObject, gameObjectActiveByDefault, rendererVisibleByDefault, ungrabAppearanceDelay, VRTK_InteractableObject.InteractionType.Ungrab)), true);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectUsed(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validUseInteractingObject))
|
|
{
|
|
GameObject useAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(useAffectedObject);
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, useAffectedObject, StartCoroutine(ToggleStateAfterTime(useAffectedObject, gameObjectActiveOnUse, rendererVisibleOnUse, useAppearanceDelay, VRTK_InteractableObject.InteractionType.Use)), true);
|
|
}
|
|
}
|
|
|
|
protected virtual void InteractableObjectUnused(object sender, InteractableObjectEventArgs e)
|
|
{
|
|
if (IsValidInteractingObject(e.interactingObject, validUseInteractingObject))
|
|
{
|
|
GameObject useAffectedObject = (objectToAffect == null ? GetActualController(e.interactingObject) : objectToAffect);
|
|
CancelRoutines(useAffectedObject);
|
|
if (objectToMonitor.IsGrabbed())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, useAffectedObject, StartCoroutine(ToggleStateAfterTime(useAffectedObject, gameObjectActiveOnGrab, rendererVisibleOnGrab, unuseAppearanceDelay, VRTK_InteractableObject.InteractionType.Unuse)), true);
|
|
}
|
|
else if (objectToMonitor.IsTouched())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, useAffectedObject, StartCoroutine(ToggleStateAfterTime(useAffectedObject, gameObjectActiveOnTouch, rendererVisibleOnTouch, unuseAppearanceDelay, VRTK_InteractableObject.InteractionType.Unuse)), true);
|
|
}
|
|
else if (objectToMonitor.IsNearTouched())
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, useAffectedObject, StartCoroutine(ToggleStateAfterTime(useAffectedObject, gameObjectActiveOnNearTouch, rendererVisibleOnNearTouch, unuseAppearanceDelay, VRTK_InteractableObject.InteractionType.NearTouch)), true);
|
|
}
|
|
else
|
|
{
|
|
VRTK_SharedMethods.AddDictionaryValue(affectingRoutines, useAffectedObject, StartCoroutine(ToggleStateAfterTime(useAffectedObject, gameObjectActiveByDefault, rendererVisibleByDefault, unuseAppearanceDelay, VRTK_InteractableObject.InteractionType.Unuse)), true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|