// Teleport Disable On Headset Collision|Locomotion|20040
|
|
namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
/// <summary>
|
|
/// Prevents teleportation when the HMD is colliding with valid geometry.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// **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.
|
|
/// </remarks>
|
|
[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<VRTK_BasicTeleport>());
|
|
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<VRTK_HeadsetCollision>());
|
|
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);
|
|
}
|
|
}
|
|
}
|