Make movement direction relative to the camera view?

I am totally new to Unity so some basic stuff is mysterious…

I went through the basic tutorial “Roll-A-Ball” and am playing around with adding my own meshes and movements, etc.

I Have replaced the camera controller script in the tutorial with a new script I found called “FollowTrackingCamera” which basic makes the camera behave the way I want it to.

The Problem: Now when I use WASD to move the character the movement is NOT relative to the view. So if I rotate the camera with the mouse the direction of movement is confusing using the WASD keys. In other words, when I push the W key I would like the character to move forward in relation to the view of the camera. Hopefully someone can offer me a solution to this. I am trying to learn and seeing this solution will help me.


Here is the FollowTrackingCamera script:


using UnityEngine;
using System.Collections;

public class FollowTrackingCamera : MonoBehaviour
	// Camera target to look at.
	public Transform target;
	// Exposed vars for the camera position from the target.
	public float height = 20f;
	public float distance = 20f;
	// Camera limits.
	public float min = 10f;
	public float max = 60;
	// Rotation.
	public float rotateSpeed = 1f;
	// Options.
	public bool doRotate;
	public bool doZoom;
	// The movement amount when zooming.
	public float zoomStep = 30f;
	public float zoomSpeed = 5f;
	private float heightWanted;
	private float distanceWanted;
	// Result vectors.
	private Vector3 zoomResult;
	private Quaternion rotationResult;
	private Vector3 targetAdjustedPosition;
	void Start(){
		// Initialise default zoom vals.
		heightWanted = height;
		distanceWanted = distance;
		// Setup our default camera.  We set the zoom result to be our default position.
		zoomResult = new Vector3(0f, height, -distance);
	void LateUpdate(){
		// Check target.
		if( !target ){
			Debug.LogError("This camera has no target, you need to assign a target in the inspector.");
		if( doZoom ){
			// Record our mouse input.  If we zoom add this to our height and distance.
			float mouseInput = Input.GetAxis("Mouse ScrollWheel");
			heightWanted -= zoomStep * mouseInput;
			distanceWanted -= zoomStep * mouseInput;
			// Make sure they meet our min/max values.
			heightWanted = Mathf.Clamp(heightWanted, min, max);
			distanceWanted = Mathf.Clamp(distanceWanted, min, max);
			height = Mathf.Lerp(height, heightWanted, Time.deltaTime * zoomSpeed);
			distance = Mathf.Lerp(distance, distanceWanted, Time.deltaTime * zoomSpeed);
			// Post our result.
			zoomResult = new Vector3(0f, height, -distance);
		if( doRotate ){
			// Work out the current and wanted rots.
			float currentRotationAngle = transform.eulerAngles.y;
			float wantedRotationAngle = target.eulerAngles.y;
			// Smooth the rotation.
			currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotateSpeed * Time.deltaTime);
			// Convert the angle into a rotation.
			rotationResult = Quaternion.Euler(0f, currentRotationAngle, 0f);
		// Set the camera position reference.
		targetAdjustedPosition = rotationResult * zoomResult;
		transform.position = target.position + targetAdjustedPosition;
		// Face the desired position.


Here is the script for the PlayerController:


using UnityEngine;
using System.Collections;

public class PlayerControllers : MonoBehaviour
	public float speed;
	public GUIText countText;
	public GUIText winText;
	private int count;

	void Start()
		count = 0;
		SetCountText ();
		winText.text = "";

	void FixedUpdate ()
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

		rigidbody.AddForce (movement * speed * Time.deltaTime);
	void OnTriggerEnter(Collider other)
		if (other.gameObject.tag == "PickUp") 
			other.gameObject.SetActive (false);
			count = count + 1;
	void SetCountText()

robertbu is correct. It works! Thank you. I added his suggestion, so my lines 23+24 are:

Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical );
movement = Camera.main.transform.TransformDirection(movement);

This line of code works, but the problem is, if I’m looking up, and holding W, the ball starts flying.