This is an example of an interactive object that moves the player to it. This script assumes you have a controller to call to it. I'll write another script showing how to do that. For anyone who doesn't know. Code (CSharp): using UnityEngine; public class Interactable : MonoBehaviour { //If your player doesn't exist at start of scene you'll need to FIndPlayer on awake public GameObject playerObject; //The target position is the position you want to the player to be, and the rotation you want them to have. // So rotate the targets to the rotation the player will end at. public Transform targetPosition, exitPosition; /// <summary> /// The minimum angle the player can be facing to the end facing direction. /// </summary> public float targetAngle = 45; /// <summary> /// Just movement fudge. /// </summary> public float MoveMargin = .05f; /// <summary> /// Speed at which the player will move, in meters per second. /// </summary> public float MovementSpeed = 5.0f; /// <summary> /// Speed at which the player will rotate in degrees per second. /// </summary> public float RotationSpeed = 30.0f; /// <summary> /// if the player is currently moving /// </summary> private bool moving; /// <summary> /// the current target of the player /// </summary> private Transform currentTarget; /// <summary> /// Call this from your raycast script /// </summary> public void MovePlayerToTarget() { if (Vector3.Angle(playerObject.transform.forward, targetPosition.transform.forward) > targetAngle) return; if (moving) return; moving = true; currentTarget = targetPosition; } /// <summary> /// Call this from your control script for leaving an action, I assume it's all one script /// </summary> public void MovePlayerToExit() { if (moving) return; moving = true; currentTarget = exitPosition; } void Update() { if (!moving) return; if (Vector3.Distance(playerObject.transform.position, currentTarget.position) > MoveMargin || Vector3.Angle(playerObject.transform.forward, currentTarget.transform.forward) > MoveMargin) { playerObject.transform.position = Vector3.MoveTowards(playerObject.transform.position, currentTarget.position, MovementSpeed * Time.deltaTime); playerObject.transform.rotation = Quaternion.RotateTowards(playerObject.transform.rotation, currentTarget.rotation, RotationSpeed * Time.deltaTime); } else { PlayerReachedTarget(); } } public void PlayerReachedTarget() { moving = false; //anything else you want to happen here, like calling back to your character controller to enable input } }