I have a 3rd person view of the player character, and I wish my camera to follow the player both when he moves and when he rotates.

So far I have the movement correct:

    public class CameraController : MonoBehaviour {

    public GameObject player;
    private Vector3 offset;
    // Use this for initialization
    void Start()
        offset = transform.position - player.transform.position;

    // Update is called once per frame
    void LateUpdate()
        transform.position = player.transform.position + offset;

However the rotation of the camera does not change when the player looks in either direction. How can this be done?


Unity had it's own smooth follow script in previous versions. It looks something like this-

using UnityEngine;
using System.Collections;

public class SmoothFollow : MonoBehaviour {

    // The target we are following
    public Transform target;
    // The distance in the x-z plane to the target
        //So this would be your offset
    public float distance = 10.0f;
    // the height we want the camera to be above the target
    public float height = 5.0f;
    // How much we 
    public float heightDamping = 2.0f;
    public float rotationDamping = 3.0f;

    // Place the script in the Camera-Control group in the component menu
    [AddComponentMenu("Camera-Control/Smooth Follow")]

    void LateUpdate () {
        // Early out if we don't have a target
        if (!target) return;

        // Calculate the current rotation angles
        float wantedRotationAngle = target.eulerAngles.y;
        float wantedHeight = target.position.y + height;

        float currentRotationAngle = transform.eulerAngles.y;
        float currentHeight = transform.position.y;

        // Damp the rotation around the y-axis
        currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);

        // Damp the height
        currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);

        // Convert the angle into a rotation
        var currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);

        // Set the position of the camera on the x-z plane to:
        // distance meters behind the target
        transform.position = target.position;
        transform.position -= currentRotation * Vector3.forward * distance;

        // Set the height of the camera
        transform.position = new Vector3(transform.position.x,currentHeight,transform.position.z);

        // Always look at the target
  • \$\begingroup\$ Old but still working in 2020. Thanks for all old threads. LoL \$\endgroup\$
    – Shad
    Aug 18 '20 at 13:13

Shraa1's answer will work, but if you want something simple to add to your code, you can just use LookAt.


This keeps the camera pointed at the player.

  • \$\begingroup\$ What if you want the camera looking at where the player is looking? \$\endgroup\$
    – trainoasis
    Jul 8 '19 at 17:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .