Move an object to specific positions

Hello! i hope someone can help me with this. So i have an object that moves in the x axis with the arrow keys, but i want the object to go from one specific position to another when i press the arrow key, something like movement in lanes i guess? with four positions. A professor told me i should define four x positions (done) and add or subtract to get to those positions, but idk how to do that even tho it seems easy. This is my script:

public class cube : MonoBehaviour {
	public float moveSpeed; 
	First position: -12.47
	Second position: -3.1
	Third position: 6.42
	Fourth position: 13.98

	void Start () {

		moveSpeed = 10f;

	void Update () {
		transform.Translate (moveSpeed*Input.GetAxis("Horizontal")*Time.deltaTime, 0f, 0f);

This would be a good use case for a Coroutine. If you’re not familiar, a coroutine is basically a threaded function, so it can run on its own. The general flow of the code should be:

  1. Player presses an arrow key.
  2. The coroutine begins processing, moving the player from point A to point B.
  3. Once the coroutine has finished, the player stops moving and the script can now accept other key presses.

Your code would look something like this:

public Vector3[] Positions;
public float MoveDuration;

private bool _canMove = true;
private int _currentPosition = 0;

void Update()
  if(Input.GetAxis("Horizontal") && _canMove)
    StartCoroutine(Move(Input.GetAxis("Horizontal") > 0));

private IEnumerator Move(bool moveRight)
  // Check if this is a valid move. If there is no lane to move into, just return.
  if(moveRight && _currentPosition + 1 < Positions.Length)
  else if(!moveRight && _currentPosition - 1 >= 0)

  // Make sure the player can't move while switching lanes. Could cause all kinds of bugs otherwise.
  _canMove = false;

  // Now actually perform the move.
  float timer = 0;
  Vector3 startPosition = transform.position;
  Vector3 endPosition = Positions[_currentPosition];
  while (timer < MoveDuration)
    timer += Time.deltaTime;
    transform.position = Vector3.Lerp (startPosition, endPosition, timer / MoveDuration);
    // In a coroutine, doing "yield return null" stops processing until the next frame.
    yield return null;
  // Make sure you set their final position after the loop is done processing.
  transform.position = endPosition;
  // Make sure the player can move once again.
  _canMove = true;

I’m not at my dev computer so can’t verify that this is 100% correct, but hopefully it can get you along the right lines. Let me know if you have any questions, thanks!