Maintaining the trajectory of a ball when manipulating its velocity in a Breakout/Arkanoid clone

I am making a clone of Breakout and I’m adding a mechanic where the velocity of the ball, after launched, can be manipulated. My problem is that pressing the button to increase velocity also launches the ball vertically in whatever coordinate position its in during that speed. If the ball is already moving at normal speed, I want the ball to keep it’s trajectory when the velocity is increased. On top of this, I only want to increase the velocity while a button is held down, and for the ball to return to its normal speed when the button is released. The ball isn’t gradually getting faster when the button is held down, the velocity is higher but it’s a value that remains static during the different states (think of being able to “fast forward” the moving ball). The ball itself is a dynamic 2D rigidbody, with physics 2D gravity settings being at x = 0 and y = -1. Here’s my code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour {

	private Vector3 paddleToBallVector;

	private bool hasStarted = false;

	public Paddle paddle;

	public Rigidbody2D rb;

	private enum States {MachSpeed}; 

	private States myState; 

	// Use this for initialization
	void Start () {
		paddleToBallVector = this.transform.position - paddle.transform.position;
		myState = States.MachSpeed;
	}
	
	// Update is called once per frame
	void Update () {
		if (!hasStarted) {
			// Lock the ball relative to the paddle
			this.transform.position = paddle.transform.position + paddleToBallVector;
			// Wait for a space press to launch
			if (Input.GetKeyDown (KeyCode.Space)) {
				print ("Space Clicked, Launch Ball");
				hasStarted = true;
				this.rb.velocity = new Vector2 (2f, 6f);
				}
			}
		if (myState == States.MachSpeed) {MachSpeed ();}
		}

	void MachSpeed () {
		if (Input.GetKeyDown(KeyCode.X)) {
			print ("Mach Speed initiated");

			this.rb.velocity = new Vector2 (0f, 20f);
		}
	}
}

here’s an implementation that should do what you want

using UnityEngine;

public class Blank : MonoBehaviour
{    
    public Paddle paddle;
    public Rigidbody2D rb;

    private Vector3 paddleToBallVector;
    private bool hasStarted = false;
    private enum States { MachSpeed };
    private States myState;
    private Vector2 velocity;

    // Use this for initialization
    void Start()
    {
        paddleToBallVector = this.transform.position - paddle.transform.position;
        myState = States.MachSpeed;
    }

    // Update is called once per frame
    void Update()
    {
        if (!hasStarted)
        {
            // Lock the ball relative to the paddle
            transform.position = paddle.transform.position + paddleToBallVector;
            // Wait for a space press to launch
            if (Input.GetKeyDown(KeyCode.Space))
            {
                print("Space Clicked, Launch Ball");
                hasStarted = true;
                velocity = new Vector2(2f, 6f);
                rb.velocity = velocity;
            }
        }
        if (myState == States.MachSpeed) { MachSpeed(); }
    }

    void MachSpeed()
    {
        if (Input.GetKey(KeyCode.X))
        {
            print("Mach Speed");
            rb.velocity = velocity * 3;
        }
        else
        {
            rb.velocity = velocity;
        }
    }
}