How can I make WASD controls relative to camera Position?

So I have a camera that allows me to rotate around my player using my mouse. My character is controlled using WASD keys. This gets very confusing if lets say, I rotate my camera to the right side of my character, because then W visually makes my character move from left to right on the screen, rather than “forward”. So how could I change this camera script in order to make WASD relative to its rotation?

###Player script

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

    public class testscript : MonoBehaviour {
    
     public float speed = 6.0F;
     public float jumpSpeed = 8.0F;
     public float gravity = 20.0F;
     private Vector3 moveDirection = Vector3.zero;
    
     private CharacterController controller;
    
     private void Awake()
     {
         controller = GetComponent<CharacterController>();
     }
    
     void Update()
     {
         if (controller.isGrounded)
         {
             moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
    
             Quaternion rotation = Quaternion.LookRotation(moveDirection, Vector3.up);
             if (moveDirection != Vector3.zero)
                 transform.rotation = rotation;
    
             moveDirection *= speed;
             if (Input.GetButton("Jump"))
             {
                 moveDirection.y = jumpSpeed;
             }
    
             Debug.DrawLine(transform.position, moveDirection);
    
         }
         moveDirection.y -= gravity * Time.deltaTime;
         controller.Move(moveDirection * Time.deltaTime);
     }    
}

###Camera script

using UnityEngine;
using System.Collections;

[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")]
public class MouseOrbitImproved : MonoBehaviour {

	public Transform target;
	public float distance = 5.0f;
	public float xSpeed = 120.0f;
	public float ySpeed = 120.0f;

	public float yMinLimit = -20f;
	public float yMaxLimit = 80f;

	public float distanceMin = .5f;
	public float distanceMax = 15f;

	private Rigidbody rigidbody;

	float x = 0.0f;
	float y = 0.0f;

	// Use this for initialization
	void Start () 
	{
		Vector3 angles = transform.eulerAngles;
		x = angles.y;
		y = angles.x;

		rigidbody = GetComponent<Rigidbody>();

		// Make the rigid body not change rotation
		if (rigidbody != null)
		{
			rigidbody.freezeRotation = true;
		}
	}

	void LateUpdate () 
	{
		if (target) 
		{
			x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
			y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

			y = ClampAngle(y, yMinLimit, yMaxLimit);

			Quaternion rotation = Quaternion.Euler(y, x, 0);

			distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel")*5, distanceMin, distanceMax);

			RaycastHit hit;
			if (Physics.Linecast (target.position, transform.position, out hit)) 
			{
				distance -=  hit.distance;
			}
			Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
			Vector3 position = rotation * negDistance + target.position;

			transform.rotation = rotation;
			transform.position = position;
		}
	}

	public static float ClampAngle(float angle, float min, float max)
	{
		if (angle < -360F)
			angle += 360F;
		if (angle > 360F)
			angle -= 360F;
		return Mathf.Clamp(angle, min, max);
	}
}

Line 23 in your player script is the problem. You have no reference on which coordinate system you calucalte the moving direction, so it will only move on the “highest” (World coordinate space).
You need to move relative to the camera coordinate system and not the world coordinate system:

Vector3 cameraRight = this.CameraAnchor.transform.right;
Vector3 cameraForward = this.CameraAnchor.transform.forward;
Vector3 inputVector = new Vector3(this.controls.getRightMovementAxis(), 0, this.controls.getForwardMovementAxis());
        Vector3 moveDirection = cameraForward * this.controls.getForwardMovementAxis() + cameraRight * this.controls.getRightMovementAxis();

        this.transform.LookAt(this.transform.position + moveDirection.normalized);
        this.transform.Translate(Vector3.forward * Mathf.Sqrt(inputVector.sqrMagnitude) * Time.deltaTime * this.MaxMovementSpeed);

Here is my player controller script:

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

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

public class testscript : MonoBehaviour {

public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = Vector3.zero;

private CharacterController controller;

private void Awake()
{
	controller = GetComponent<CharacterController>();
}

void Update()
{
	if (controller.isGrounded)
	{
		moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

		Quaternion rotation = Quaternion.LookRotation(moveDirection, Vector3.up);
		if (moveDirection != Vector3.zero)
			transform.rotation = rotation;

		moveDirection *= speed;
		if (Input.GetButton("Jump"))
		{
			moveDirection.y = jumpSpeed;
		}

		Debug.DrawLine(transform.position, moveDirection);

	}
	moveDirection.y -= gravity * Time.deltaTime;
	controller.Move(moveDirection * Time.deltaTime);
}

}