короче тут поменять надо, когда кручу колесо мышки там будет не зум а просто типо движение камеры вперед и назад типо бесконечно а не пока упрется. но типо надо сделать так чтобы все равно нижней границы нельзя было прокрутить так. типо щас сделано так что камера вообще чисто физически не может провалится под пол, и тебе надо чтобы так и оставалось, но вот только чтобы колесо мышки можно было камеру бесконечно вперед двигать без привязки к какому либо объекту для зума. using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Управляет камерой в 3D сцене, позволяя вращение, масштабирование и перемещение камеры вокруг целевого объекта.
/// </summary>
public class CameraController : MonoBehaviour
{
    [Header("Настройки камеры")]
    [Tooltip("Целевой объект, вокруг которого будет вращаться камера.")]
    public Transform target;

    [Tooltip("Скорость вращения камеры.")]
    public float rotationSpeed = 3f;

    [Tooltip("Скорость приближения камеры.")]
    public float zoomSpeed = 5f;

    [Tooltip("Скорость движения камеры.")]
    public float moveSpeed = 0.2f;

    [Tooltip("Минимальное расстояние до цели.")]
    public float minZoom = 2f;

    [Tooltip("Максимальное расстояние до цели.")]
    public float maxZoom = 20f;

    [Tooltip("Минимальный угол по оси X.")]
    public float minVerticalAngle = 5f;

    [Tooltip("Максимальный угол по оси X.")]
    public float maxVerticalAngle = 80f;

    private float currentZoom;
    private float currentXRotation;
    private float currentYRotation;
    private Vector3 pivotPoint;

    private void Start()
    {
        InitializeCamera();
    }

    private void Update()
    {
        HandleInput();
    }

    /// <summary>
    /// Инициализирует начальное состояние камеры.
    /// </summary>
    private void InitializeCamera()
    {
        currentZoom = Vector3.Distance(transform.position, target.position);
        currentXRotation = transform.eulerAngles.x;
        currentYRotation = transform.eulerAngles.y;
        pivotPoint = target.position;
        UpdateCameraPosition();
    }

    /// <summary>
    /// Обрабатывает входные данные для управления камерой.
    /// </summary>
    private void HandleInput()
    {
        ZoomCamera();
        RotateCamera();
        MoveCamera();

        if (Input.GetKeyDown(KeyCode.F))
        {
            CenterCamera();
        }
    }

    /// <summary>
    /// Управляет масштабированием камеры.
    /// </summary>
    private void ZoomCamera()
    {
        float zoomInput = Input.GetAxis("Mouse ScrollWheel");
        currentZoom = Mathf.Clamp(currentZoom - zoomInput * zoomSpeed, minZoom, maxZoom);
        UpdateCameraPosition();
    }

    /// <summary>
    /// Управляет вращением камеры вокруг целевого объекта.
    /// </summary>
    private void RotateCamera()
    {
        if (Input.GetMouseButton(1))
        {
            float horizontalInput = Input.GetAxis("Mouse X") * rotationSpeed;
            float verticalInput = Input.GetAxis("Mouse Y") * rotationSpeed;

            currentYRotation += horizontalInput;
            currentXRotation = Mathf.Clamp(currentXRotation - verticalInput, minVerticalAngle, maxVerticalAngle);

            UpdateCameraPosition();
        }
    }

    /// <summary>
    /// Управляет перемещением камеры с использованием средней кнопки мыши.
    /// </summary>
    private void MoveCamera()
    {
        if (Input.GetMouseButton(2))
        {
            float horizontalInput = Input.GetAxis("Mouse X") * moveSpeed;
            float verticalInput = Input.GetAxis("Mouse Y") * moveSpeed;

            Vector3 move = new Vector3(-horizontalInput, -verticalInput, 0);
            transform.Translate(move, Space.Self);

            // Обновляем pivotPoint на текущую позицию камеры
            pivotPoint = transform.position + transform.forward * currentZoom;

            // Ограничиваем позицию по оси Y, чтобы она не опускалась ниже 0
            pivotPoint.y = Mathf.Max(pivotPoint.y, 0);

            UpdateCameraPosition();
        }
    }

    /// <summary>
    /// Обновляет позицию камеры на основе текущих значений масштаба, углов вращения и точки вращения.
    /// </summary>
    private void UpdateCameraPosition()
    {
        Quaternion rotation = Quaternion.Euler(currentXRotation, currentYRotation, 0);
        Vector3 direction = rotation * Vector3.back * currentZoom;
        transform.position = pivotPoint + direction;

        // Ограничиваем позицию по оси Y, чтобы она не опускалась ниже 0
        transform.position = new Vector3(transform.position.x, Mathf.Max(transform.position.y, 0), transform.position.z);

        transform.LookAt(pivotPoint);
    }

    /// <summary>
    /// Центрирует камеру на целевом объекте с заданными параметрами по умолчанию.
    /// </summary>
    public void CenterCamera()
    {
        currentZoom = 10f;
        currentXRotation = 20f;
        currentYRotation = 0f;
        pivotPoint = target.position;
        UpdateCameraPosition();
    }
}