60 lines
3.3 KiB
C#
60 lines
3.3 KiB
C#
using UnityEngine;
|
||
|
||
public class CameraFollow : MonoBehaviour
|
||
{
|
||
[Header("Цель и Смещение")]
|
||
[Tooltip("Объект, за которым следует камера (ваш шарик).")]
|
||
[SerializeField] private Transform target;
|
||
|
||
[Tooltip("Стандартное смещение камеры относительно шарика (например, 0, 5, -8).")]
|
||
[SerializeField] private Vector3 offset = new Vector3(0f, 5f, -8f);
|
||
|
||
[Header("Настройки Дистанции")]
|
||
[Tooltip("Минимальное расстояние камеры от шарика.")]
|
||
[SerializeField] private float minDistance = 5f;
|
||
|
||
[Tooltip("Максимальное расстояние камеры от шарика.")]
|
||
[SerializeField] private float maxDistance = 15f;
|
||
|
||
[Header("Настройки Сглаживания")]
|
||
[Tooltip("Скорость, с которой камера догоняет цель. Меньше = плавнее.")]
|
||
[SerializeField] private float smoothSpeed = 5f;
|
||
|
||
// Используем LateUpdate, чтобы камера двигалась после того, как шарик закончит свое движение
|
||
void LateUpdate()
|
||
{
|
||
if (target == null)
|
||
{
|
||
Debug.LogWarning("CameraFollow: Цель (Target) не установлена. Назначьте объект шарика!");
|
||
return;
|
||
}
|
||
|
||
// 1. Определяем желаемую позицию без ограничений
|
||
Vector3 desiredPosition = target.position + offset;
|
||
|
||
// 2. Рассчитываем вектор от цели до желаемой позиции
|
||
// Этот вектор определяет, в каком направлении находится камера относительно цели
|
||
Vector3 cameraDirection = desiredPosition - target.position;
|
||
|
||
// 3. Ограничиваем длину этого вектора (дистанцию)
|
||
// Используем ClampMagnitude, чтобы гарантировать, что длина (дистанция)
|
||
// находится между minDistance и maxDistance.
|
||
float currentDistance = cameraDirection.magnitude;
|
||
float clampedDistance = Mathf.Clamp(currentDistance, minDistance, maxDistance);
|
||
|
||
// Пересчитываем вектор, используя ограниченную дистанцию
|
||
Vector3 finalCameraDirection = cameraDirection.normalized * clampedDistance;
|
||
|
||
// 4. Определяем конечную позицию с учетом ограничений
|
||
Vector3 finalDesiredPosition = target.position + finalCameraDirection;
|
||
|
||
// 5. Используем Lerp для плавного перемещения к конечной позиции
|
||
Vector3 smoothedPosition = Vector3.Lerp(transform.position, finalDesiredPosition, smoothSpeed * Time.deltaTime);
|
||
|
||
// 6. Применяем сглаженную позицию
|
||
transform.position = smoothedPosition;
|
||
|
||
// 7. Поворачиваем камеру, чтобы она всегда смотрела на шарик
|
||
transform.LookAt(target);
|
||
}
|
||
} |