I want to make simple teleporters for my game. I want to teleport by standing on / in the teleporter and when I press the “Interact” button (I defined it in Input settings), teleport to destination transform.
It is already working, but it’s not perfect.
I tried to use OnTriggerEnter first time. It was working until I wrote the other if statement :
if(Input.GetButtonDown ("Interact"))
II realised, OnTriggerEnter won’t work as it’s executed at entering (silly me).
OnTriggerStay works, but it doesn’t always get my input (Interact). I guess, that is because “OnTriggerStay function is on the physics timer so it wont necessary run every frame.”
I was thinking what to do, but I’m out of ideas. What should I do? It’s really annoying for a player if the teleporter doesn’t always react. Is there other way than OnTriggerStay?
Full code (JS):
#pragma strict
var Destination : Transform;
var DestinationOffsetY : float = 0.0f;
var OnUse : boolean = false; //TO BE IMPLEMENTED
@script AddComponentMenu("Custom Scripts/Gameplay/Teleport")
function OnDrawGizmos () {
Gizmos.DrawIcon (transform.position, "teleport.tif", true);
}
function OnTriggerStay(other : Collider)
{
if(other.gameObject.tag=="Player")
{
Debug.Log("READY TO TELEPORT");
if(Input.GetButtonDown ("Interact"))
{
other.transform.position.x = Destination.transform.position.x;
other.transform.position.y = Destination.transform.position.y+DestinationOffsetY;
other.transform.position.z = Destination.transform.position.z;
Debug.Log("TELEPORT!");
}
}
}
you can use OnTriggerEnter to set a boolean. then in an update function in your script, if the input is down and the boolean is true, then you can teleport.
var usable : boolean = false;
var lastPlayer : Collider;
var Destination : Transform;
var DestinationOffsetY : float = 0.0f;
function OnTriggerEnter(other : Collider)
{
if(other.gameObject.tag == "Player")
{
usable = true;
lastPlayer = other;
}
}
function OnTriggerExit(other : Collider)
{
if(other.gameObject.tag == "Player")
{
usable = false;
}
}
function Update()
{
if(!usable)
return;
if(Input.GetButtonDown ("Interact"))
{
lastPlayer.transform.position.x = Destination.transform.position.x;
lastPlayer.transform.position.y = Destination.transform.position.y+DestinationOffsetY;
lastPlayer.transform.position.z = Destination.transform.position.z;
Debug.Log("TELEPORT!");
}
}
Thank you for all the answers! They were useful! I decided to try to make it with Update.
Here it is:
#pragma strict
var Destination : Transform;
var DestinationOffsetY : float = 0.0f;
var OnUse : boolean = false;
var ChangeYPos : boolean = false;
private var CanTeleport : boolean = false;
private var OtherObject: GameObject;
@script AddComponentMenu("Custom Scripts/Gameplay/Teleport")
function OnDrawGizmos () {
Gizmos.DrawIcon (transform.position, "teleport.tif", true);
}
function OnDrawGizmosSelected () {
if(Destination != null) {
// Draws a blue line from this transform to the target
Gizmos.color = Color.blue;
Gizmos.DrawLine (transform.position, Vector3(Destination.position.x,Destination.position.y+DestinationOffsetY,Destination.position.z));
}
}
function OnTriggerEnter(other : Collider)
{
OtherObject = other.gameObject;
if(other.gameObject.tag=="Player")
{
CanTeleport = true;
}
}
function OnTriggerExit(other : Collider)
{
if(other.gameObject.tag=="Player")
{
CanTeleport = false;
}
}
function Update()
{
if(CanTeleport != true) return;
if(OnUse == false || Input.GetButtonDown("Interact"))
{
OtherObject.transform.position.x = Destination.transform.position.x;
if(ChangeYPos)
{
OtherObject.transform.position.y = Destination.transform.position.y+DestinationOffsetY;
}
OtherObject.transform.position.z = Destination.transform.position.z;
Debug.Log("TELEPORT!");
}
}