petushok55
@petushok55
Обучаюсь на практике.

Почему при зуме камера приближается к центру картинки?

Есть следующие элементы UI
62f0351ec592b692109013.png
map_content это большая карта, которая на экране видна лишь частично, её можно двигать по "x" и "y"

На map_content повесил следующий скрипт:
using UnityEngine;

// код собран из разных частей интернета

public class PinchToChangeScaleMap : MonoBehaviour
{

    private float initialDistance;
    private Vector3 initialScale;


    void Update()
    {
        // scale using pinch involves two touches
        // we need to count both the touches, store it somewhere, measure the distance between pinch 
        // and scale gameobject depending on the pinch distance
        // we also need to ignore if the pinch distance is small (cases where two touches are registered accidently)


        if (Input.touchCount == 2)
        {
            var touchZero = Input.GetTouch(0);
            var touchOne = Input.GetTouch(1);

            // if any one of touchzero or touchOne is cancelled or maybe ended then do nothing
            if (touchZero.phase == TouchPhase.Ended || touchZero.phase == TouchPhase.Canceled ||
                touchOne.phase == TouchPhase.Ended || touchOne.phase == TouchPhase.Canceled)
            {
                return; // basically do nothing
            }

            if (touchZero.phase == TouchPhase.Began || touchOne.phase == TouchPhase.Began)
            {
                initialDistance = Vector2.Distance(touchZero.position, touchOne.position);
                initialScale = gameObject.transform.localScale;
            }
            else // if touch is moved
            {
                var currentDistance = Vector2.Distance(touchZero.position, touchOne.position);

                //if accidentally touched or pinch movement is very very small
                if (Mathf.Approximately(initialDistance, 0))
                {
                    return; // do nothing if it can be ignored where inital distance is very close to zero
                }

                var factor = currentDistance / initialDistance;
                gameObject.transform.localScale = initialScale * factor; // scale multiplied by the factor we calculated
                
            }
        }

    }
}


Не знаю как это точно объяснить, но попробую.
При увеличении карты, наш экран смещается к центру. То есть, мы в углу увеличиваем карту, а она помимо увеличения приближается к центру.
При отдалении карты, наоборот, отдаляется от центра экран

#жесть
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Какой код написал, такой результат и получил, чему удивляться то.

В нормальной реализации, ты должен отождествлять каждый палец на карте и увеличивать карту и двигать её так, чтобы под пальцами оказывались те же самые точки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы