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