Unity выходит за пределы значения, установленного в качестве предела, при использовании колеса прокрутки

Это довольно странно, и я понятия не имею, как это исправить.

Я использую набор ограничений (min и max), чтобы узнать, насколько колесо прокрутки может увеличить или уменьшить камеру. Проблема в том, что камера застревает, потому что я указываю, что увеличение должно происходить только в том случае, если положение y находится между min и max.

Unity всегда перескакивает при использовании колеса прокрутки мыши; если я устанавливаю 1.0 f и прокрутку; конечный результат в конечном итоге составляет 0.92; и то же самое происходит, если я устанавливаю максимум 5.0 f и с помощью колеса прокрутки, он перескакивает на 5.1.

Это приводит к тому, что камера застревает, потому что теперь значение y камеры установлено за пределами, поэтому очевидно, что она не будет двигаться.

Как вы на самом деле избегаете того, что единство выйдет за действительные пределы?

Это то, что я использую

float mouse = Input.GetAxis("Mouse ScrollWheel");
float zoom_speed = 1.0f; 
if (transform.position.y <= 3f && transform.position.y >= 1f)
    transform.Translate(0, -mouse * zoom_speed, mouse * zoom_speed, Space.World);

2 ответа

  1. Таким образом, этот код делает ваше путешествие преобразования между minZoomPos и maxZoomPos в мировом пространстве. CurrentZoom-это нормализованное значение, определяющее, насколько близко преобразование к minZoomPos и как var от maxZoomPos:

    Vector3 minZoomPos = new Vector3(0, 1f, -3f); //transform's position when zoomed in all the way
    Vector3 maxZoomPos = new Vector3(0, 3f, -1f); //position when zoomed out
    float currentZoom = 0f; //this is normalized value >> 0 means it's zoomed all the way in, 1 means it's on all the way out
    
    float zoom_speed = 1.0f; //if you keep these declarations in Update() function it will give you unnecessary overhead on garbage collection
    
    void Update(){
        currentZoom += Input.GetAxis("Mouse ScrollWheel") * zoom_speed;
        currentZoom = Mathf.Clamp01(currentZoom);
    
        //get point between minZoomPos and maxZoomPos depending on currentZoom
        transform.position = Vector3.Lerp (minZoomPos, maxZoomPos, currentZoom);
    }
    
  2. Найти решение.

    В основном, если я иду ниже или выше предела; я просто устанавливаю предел вручную. Не элегантный, но с 4 строками кода я получаю то, что мне нужно.

    Я также изменил способ управления зумом; так как мне не нужно двигаться по оси Y и Z, я просто опускаю камеру по оси Y, что лучше работает для моего сценария

    float mouse = Input.GetAxis("Mouse ScrollWheel");
    float zoom_speed = 1.0f; 
    
    if (transform.position.y <= 3f && transform.position.y >= 1f)
        transform.Translate(0, -mouse * zoom_speed, 0);
        if (transform.position.y < 1f)
            transform.position = new Vector3(transform.position.x, 1f, transform.position.z)
        if (transform.position.y > 3f)
            transform.position = new Vector3(transform.position.x, 3f, transform.position.z)
    

    При этом значение настраивается, как только оно изменяется, это происходит так быстро, что камера не дрожит и даже не движется немного. Уверен, что есть лучшие способы сделать это, но это, кажется, работает сейчас.