// Teleport Disable On Headset Collision|Locomotion|20040
namespace VRTK
{
using UnityEngine;
using System.Collections;
///
/// Prevents teleportation when the HMD is colliding with valid geometry.
///
///
/// **Required Components:**
/// * `VRTK_BasicTeleport` - A Teleport script to utilise for teleporting the play area.
/// * `VRTK_HeadsetCollision` - A Headset Collision script for detecting when the headset has collided with valid geometry.
///
/// **Script Usage:**
/// * Place the `VRTK_TeleportDisableOnHeadsetCollision` script on any active scene GameObject.
///
[AddComponentMenu("VRTK/Scripts/Locomotion/VRTK_TeleportDisableOnHeadsetCollision")]
public class VRTK_TeleportDisableOnHeadsetCollision : MonoBehaviour
{
[Header("Custom Settings")]
[Tooltip("The Teleporter script to deal play area teleporting. If the script is being applied onto an object that already has a VRTK_BasicTeleport component, this parameter can be left blank as it will be auto populated by the script at runtime.")]
public VRTK_BasicTeleport teleporter;
[Tooltip("The VRTK Headset Collision script to use when determining headset collisions. If this is left blank then the script will need to be applied to the same GameObject.")]
public VRTK_HeadsetCollision headsetCollision;
protected Coroutine enableAtEndOfFrameRoutine;
protected virtual void OnEnable()
{
teleporter = (teleporter != null ? teleporter : FindObjectOfType());
enableAtEndOfFrameRoutine = StartCoroutine(EnableAtEndOfFrame());
}
protected virtual void OnDisable()
{
if (enableAtEndOfFrameRoutine != null)
{
StopCoroutine(enableAtEndOfFrameRoutine);
}
if (teleporter == null)
{
return;
}
if (headsetCollision != null)
{
headsetCollision.HeadsetCollisionDetect -= new HeadsetCollisionEventHandler(DisableTeleport);
headsetCollision.HeadsetCollisionEnded -= new HeadsetCollisionEventHandler(EnableTeleport);
}
}
protected virtual IEnumerator EnableAtEndOfFrame()
{
if (teleporter == null)
{
yield break;
}
yield return new WaitForEndOfFrame();
headsetCollision = (headsetCollision != null ? headsetCollision : FindObjectOfType());
if (headsetCollision == null)
{
VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_SCENE, "VRTK_TeleportDisableOnHeadsetCollision", "VRTK_HeadsetCollision"));
}
else
{
headsetCollision.HeadsetCollisionDetect += new HeadsetCollisionEventHandler(DisableTeleport);
headsetCollision.HeadsetCollisionEnded += new HeadsetCollisionEventHandler(EnableTeleport);
}
}
protected virtual void DisableTeleport(object sender, HeadsetCollisionEventArgs e)
{
teleporter.ToggleTeleportEnabled(false);
}
protected virtual void EnableTeleport(object sender, HeadsetCollisionEventArgs e)
{
teleporter.ToggleTeleportEnabled(true);
}
}
}