Unity_lab3/Unity3_lab/Assets/Scripts/CameraFollow.cs

60 lines
3.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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