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
\$\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\$

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\$
  • \$\begingroup\$ What if you want the camera looking at where the player is looking? \$\endgroup\$ – trainoasis Jul 8 at 17:23
-2
\$\begingroup\$

Have you tried making the Main Camera a child of your character in the hierarchy?

Remember to put in the position you want to.

Try and see if it works for you...

\$\endgroup\$
  • 1
    \$\begingroup\$ This sounds like you intended to post a comment asking for clarification. Please do not use answers to post comments. \$\endgroup\$ – Gnemlock Sep 28 '16 at 4:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.