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); } }