2026-07-15 15:16:00 +03:00

61 lines
2.0 KiB
C#

using UnityEngine;
using RaceFields.Vehicles;
namespace RaceFields.CameraSystem
{
[DisallowMultipleComponent]
public sealed class BuggyFollowCamera : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private Vector3 followOffset = new Vector3(0f, 3.2f, -6.2f);
[SerializeField] private Vector3 lookOffset = new Vector3(0f, 1.1f, 1.2f);
[SerializeField] private float positionSmoothTime = 0.12f;
[SerializeField] private float rotationLerp = 12f;
[SerializeField] private bool autoFindTarget = true;
private Vector3 velocity;
private void Start()
{
ResolveTarget();
SnapToTarget();
}
private void LateUpdate()
{
ResolveTarget();
if (target == null)
return;
Vector3 desiredPosition = target.TransformPoint(followOffset);
transform.position = Vector3.SmoothDamp(transform.position, desiredPosition, ref velocity, positionSmoothTime);
Vector3 lookPoint = target.TransformPoint(lookOffset);
Quaternion desiredRotation = Quaternion.LookRotation(lookPoint - transform.position, Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, desiredRotation, rotationLerp * Time.deltaTime);
}
[ContextMenu("Snap To Target")]
public void SnapToTarget()
{
ResolveTarget();
if (target == null)
return;
transform.position = target.TransformPoint(followOffset);
transform.LookAt(target.TransformPoint(lookOffset), Vector3.up);
velocity = Vector3.zero;
}
private void ResolveTarget()
{
if (target != null || !autoFindTarget)
return;
ArcadeBuggyController controller = Object.FindFirstObjectByType<ArcadeBuggyController>();
if (controller != null)
target = controller.transform;
}
}
}