Camera Shake On Rotations

Shaking occurs during turns when following an object. I didn’t understand why.

199011-ezgifcom-gif-maker.gif

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;

public class CameraFollow : MonoBehaviour
{
    [Serializable] enum CameraUpdateMode { Update, FixedUpdate, LateUpdate };

    [SerializeField] private Transform target;
    [SerializeField] private Vector3 offset;
    [SerializeField] private float smooth = 0.125f;
    [SerializeField] private bool3 lockPosition = new bool3(false, false, false);
    [SerializeField] private bool3 lockLook = new bool3(false, false, false);
    [SerializeField] private CameraUpdateMode updateMode = CameraUpdateMode.LateUpdate;

    private Coroutine moveToCoroutine;
    private Vector3 velocity;

    private void Start()
    {
        offset = transform.position - target.position;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
        }

        if (updateMode == CameraUpdateMode.Update) SmoothFollow();
    }

    private void FixedUpdate()
    {
        if (updateMode == CameraUpdateMode.FixedUpdate) SmoothFollow();
    }

    private void LateUpdate()
    {
        if (updateMode == CameraUpdateMode.LateUpdate) SmoothFollow();
    }

    private void SmoothFollow()
    {
        if (GameManager.Instance.gameStatus == GameStatus.PLAY)
        {

            Vector3 targetPos = target.position + offset;
            if (lockPosition.x) targetPos.x = transform.position.x;
            if (lockPosition.y) targetPos.y = transform.position.y;
            if (lockPosition.z) targetPos.z = transform.position.z;

            Vector3 smoothFollow = Vector3.MoveTowards(transform.position, RotatePointAroundPivot(targetPos, target.position, Vector3.up * target.rotation.eulerAngles.y), smooth);
            transform.position = smoothFollow;

            Vector3 targetRot = target.rotation.eulerAngles;
            if (lockLook.x) targetRot.x = transform.rotation.eulerAngles.x;
            if (lockLook.y) targetRot.y = transform.rotation.eulerAngles.y;
            if (lockLook.z) targetRot.z = transform.rotation.eulerAngles.z;
            transform.rotation = Quaternion.Euler(targetRot);
        }
    }

    private Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
    {
        return Quaternion.Euler(angles) * (point - pivot) + pivot;
    }

    public void MoveTo(Transform to, float delay, float seconds, UnityAction callback)
    {
        if (moveToCoroutine != null) StopCoroutine(moveToCoroutine);
        moveToCoroutine = StartCoroutine(MoveToCoroutine(transform, to, delay, seconds, callback));
    }

    private IEnumerator MoveToCoroutine(Transform from, Transform to, float delay, float seconds, UnityAction callback)
    {
        yield return new WaitForSeconds(delay);
        float elapsedTime = 0;
        while (elapsedTime < seconds)
        {
            transform.position = Vector3.Lerp(from.position, to.position, elapsedTime / seconds);
            transform.rotation = Quaternion.Lerp(from.rotation, to.rotation, elapsedTime / seconds);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        callback?.Invoke();
    }
}

I solved the problem like this:
I set the smoothness value to the target framerate while rotating.

  •   private void SmoothFollow()
      {
          if (GameManager.Instance.gameStatus == GameStatus.PLAY)
          {
    
              Vector3 targetPos = target.position + offset;
              if (lockPosition.x) targetPos.x = transform.position.x;
              if (lockPosition.y) targetPos.y = transform.position.y;
              if (lockPosition.z) targetPos.z = transform.position.z;
    
              Vector3 smoothFollow = Vector3.MoveTowards(transform.position, RotatePointAroundPivot(targetPos, target.position, Vector3.up * target.rotation.eulerAngles.y), smooth);
              transform.position = smoothFollow;
    
              Vector3 targetRot = Quaternion.LookRotation(target.forward).eulerAngles;
              if (lockRotation.x) targetRot.x = rotationTemp.x;
              if (lockRotation.y) targetRot.y = rotationTemp.y;
              if (lockRotation.z) targetRot.z = rotationTemp.z;
              transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(targetRot), (updateMode == CameraUpdateMode.FixedUpdate ? Time.fixedDeltaTime : Time.deltaTime) * Application.targetFrameRate);
          }
      }