4
\$\begingroup\$

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?

\$\endgroup\$

2 Answers 2

3
\$\begingroup\$

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
        transform.LookAt(target);
    }
}
\$\endgroup\$
1
  • \$\begingroup\$ Old but still working in 2020. Thanks for all old threads. LoL \$\endgroup\$
    – Shad
    Aug 18, 2020 at 13:13
1
\$\begingroup\$

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

transform.LookAt(player.transform);

This keeps the camera pointed at the player.

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

You must log in to answer this question.

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