using UnityEngine;
namespace Passer {
using Humanoid;
/// The teleporter is a simple tool to teleport transforms
[HelpURLAttribute("https://passervr.com/documentation/humanoid-control/tools/teleport/")]
public class Teleporter : InteractionPointer {
/// Determines how the Transform is moved to the Target Point.
public enum TransportType {
Teleport, //< Direct placement on the target point
Dash //< A quick movement in a short time from the originating point to the target point
}
/// The TransportType to use when teleporting.
public TransportType transportType = TransportType.Teleport;
/// The transform which will be teleported
public Transform transformToTeleport;
protected HumanoidControl humanoid;
protected override void Awake() {
base.Awake();
if (transformToTeleport == null)
transformToTeleport = this.transform;
humanoid = transformToTeleport.GetComponent();
if (humanoid == null)
humanoid = transformToTeleport.GetComponentInParent();
if (humanoid != null)
transformToTeleport = humanoid.transform;
}
/// Teleport the transform
public virtual void TeleportTransform() {
if (transformToTeleport == null)
transformToTeleport = this.transform;
if (humanoid == null)
transformToTeleport.Teleport(focusPointObj.transform.position);
else {
Vector3 interactionPointerPosition = humanoid.GetHumanoidPosition() - transformToTeleport.position;
switch (transportType) {
case TransportType.Teleport:
transformToTeleport.Teleport(focusPointObj.transform.position - interactionPointerPosition);
break;
case TransportType.Dash:
StartCoroutine(TransformMovements.DashCoroutine(transformToTeleport, focusPointObj.transform.position - interactionPointerPosition));
break;
default:
break;
}
}
}
/// Adds a default Teleporter to the transform
/// The transform to which the Teleporter will be added
/// The interaction pointer type for the Teleporter
public static new Teleporter Add(Transform parentTransform, PointerType pointerType = PointerType.Ray) {
GameObject pointerObj = new GameObject("Teleporter");
pointerObj.transform.SetParent(parentTransform, false);
GameObject destinationObj = new GameObject("Destination");
destinationObj.transform.SetParent(pointerObj.transform);
destinationObj.transform.localPosition = Vector3.zero;
destinationObj.transform.localRotation = Quaternion.identity;
if (pointerType == PointerType.FocusPoint) {
GameObject focusPointSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
focusPointSphere.transform.SetParent(destinationObj.transform);
focusPointSphere.transform.localPosition = Vector3.zero;
focusPointSphere.transform.localRotation = Quaternion.identity;
focusPointSphere.transform.localScale = Vector3.one * 0.1F;
}
else {
LineRenderer pointerRay = destinationObj.AddComponent();
pointerRay.startWidth = 0.01F;
pointerRay.endWidth = 0.01F;
pointerRay.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
pointerRay.receiveShadows = false;
pointerRay.useWorldSpace = false;
}
Teleporter teleporter = pointerObj.AddComponent();
teleporter.focusPointObj = destinationObj;
teleporter.rayType = RayType.Bezier;
return teleporter;
}
public override void Click(bool clicking) {
if (clicking)
TeleportTransform();
}
}
}