I'm trying to create a camera like in Fortnite or Gears of War. It's focus must be to the right side from the character:enter image description here

But when I rotate the camera, the character slightly shivers. Lerping and multiplying by Time.deltatTime doesn't help.

This is my code:

    using UnityEngine;


    public class ThirdPersonCamera : MonoBehaviour
        [SerializeField] private float xSensitivity;
        [SerializeField] private float ySensitivity;

    [Header("Limit angles")]
    [SerializeField] private float upLimit;
    [SerializeField] private float downLimit;

    [SerializeField] private Vector3 offset;
    [SerializeField] private float maxDistanceFromPlayer;
    [SerializeField] private Transform player;

    private float rotationAboutX;
    private float rotationAboutY;

    // Start is called before the first frame update
    void Start()
        rotationAboutX = transform.localEulerAngles.x;
        rotationAboutY = transform.localEulerAngles.y;

    void Update()
        rotationAboutX -= Input.GetAxis("Mouse Y") * ySensitivity;
        rotationAboutY += Input.GetAxis("Mouse X") * xSensitivity;

        rotationAboutX = Mathf.Clamp(rotationAboutX, downLimit, upLimit);

    // Adjust camera position.
    void LateUpdate()
        Vector3 direction = new Vector3(0.0f, 0.0f, -maxDistanceFromPlayer);
        Quaternion rotation = Quaternion.Euler(rotationAboutX, rotationAboutY, 0);
        // Point to look at in the runitme.
        Vector3 focus = player.position + transform.TransformDirection(offset);

        // Rotate vector according to mouse inputs.
        transform.position = focus + rotation * direction;


It shivers only if offset is not zero. Otherwise it's ok.

  • 1
    \$\begingroup\$ You have a feedback loop here: the current rotation changes focus, and focus changes the current rotation, which means you compute a different focus next frame, which means you compute a different rotation, which means... \$\endgroup\$
    – DMGregory
    Jan 16, 2019 at 18:50

1 Answer 1


I have solved the problem. It was enough to use this simple code instead of computing focus manually:

transform.Translate(offset, transform);

You must log in to answer this question.

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