Shaking occurs during turns when following an object. I didn’t understand why.
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();
}
}