Simple one-way teleport?

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!");
	}

}