Увеличение изображения и перемещение по нему двумя пальцами (мобильное приложение Unity 2d C#)

Делаю мобильное приложение на Unity 2D (С#) под Android. Есть сцена, где пользователь перелистывает изображение кнопками. У меня есть реализация увеличения картинки на весь экран при нажатии на неё. Но после того, как картинка увеличилась, мне нужно, чтобы пользователь мог увеличивать/уменьшать и также двумя пальцами двигаться по ней (как в мобильном ВК).

Я добавил в элемент Image (где у меня хранится изображение) своего Canvas компонент Button, чтобы картинка отслеживала нажатие на неё. После того, как нажимается картинка, она увеличивается. Нажатие на картинку отслеживается в методе:

public void onImageClick()
{ 
    rectTransform = im.GetComponent<RectTransform>();
    var bgTransform = bg.GetComponent<RectTransform>();

    if (rectTransform.sizeDelta.x < 530)
    {
        if (rectTransform.sizeDelta.x <= width || rectTransform.sizeDelta.y <= height)
        {
            imageClicked = true;
            bgTransform.position = can.GetComponent<RectTransform>().position;
            transparentChange = true;
        }
    }
    else
    {
        if (rectTransform.sizeDelta.x >= can.GetComponent<RectTransform>().sizeDelta.x || rectTransform.sizeDelta.y >= can.GetComponent<RectTransform>().sizeDelta.y)
        {
            imageClickedReturn = true;
            transparentChangeReturn = true;
        }
    }

}

Unity:

Элемент Image с картинкой в Unity

Поля

private bool transparentChange;
private bool transparentChangeReturn;
private bool imageClicked;
private bool imageClickedReturn;

нужны для того, чтобы в методе Update() отслеживать, увеличилась ли картинка или нет.

Метод Update():

    private void Update()
    {
        if (transparentChange)
        {
            bg.color = new Color(0, 0, 0, transparentCounter += 0.1f);
    
            if (transparentCounter >= 1)
            {
                transparentChange = false;
                transparentCounter = 1;
            }
        }
        if (transparentChangeReturn)
        {
            bg.color = new Color(0, 0, 0, transparentCounter -= 0.1f);
            if (transparentCounter <= 0)
            {
                var bgTransform = bg.GetComponent<RectTransform>();
                bgTransform.position = new Vector3(13.945f, -511f);
                transparentChangeReturn = false;
                transparentCounter = 0;
            }
        }
        if (imageClicked)
        {
            rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x + 10f, rectTransform.sizeDelta.y + 10f);
            rectTransform.position = new Vector3(rectTransform.position.x + 11.44f, rectTransform.position.y - 0.77385f);
            if (rectTransform.sizeDelta.x >= can.GetComponent<RectTransform>().sizeDelta.x || rectTransform.sizeDelta.y >= can.GetComponent<RectTransform>().sizeDelta.y) imageClicked = false;
        }
        if (imageClickedReturn)
        {
            rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x - 10f, rectTransform.sizeDelta.y - 10f);
            rectTransform.position = new Vector3(rectTransform.position.x - 11.44f, rectTransform.position.y + 0.77385f);
            if (rectTransform.sizeDelta.x <= width || rectTransform.sizeDelta.y <= height) imageClickedReturn = false;
        }
    
        if (Input.touchCount == 2)
        {
            // Store both touches.
            Touch touchZero = Input.GetTouch(0);
            Touch touchOne = Input.GetTouch(1);
    
            // Find the position in the previous frame of each touch.
            Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
            Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;
    
            // Find the magnitude of the vector (the distance) between the touches in each frame.
            float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
            float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;
    
            // Find the difference in the distances between each frame.
            float deltaMagnitudeDiff = (prevTouchDeltaMag - touchDeltaMag) / 100;
    
            if (zoom.x <= 1 & deltaMagnitudeDiff > 0)
            {
                deltaMagnitudeDiff = 0;
            }
    
            if (zoom.x >= 3 & deltaMagnitudeDiff < 0)
            {
                deltaMagnitudeDiff = 0;
            }
    
            zoom = new Vector3(zoom.x -= deltaMagnitudeDiff, zoom.y -= deltaMagnitudeDiff, 1);
            im.transform.localScale = zoom;
            im.transform.localScale = zoom;
        }
    }

Все числа, которые там написаны подсчитаны для того, чтобы картинка увеличивалась до нужного размера, can - это мой канвас.

И теперь самое важное. Как мне со всем этим реализовать зум картинки и передвижение по ней двумя пальцами? В методе Update() есть условие, что если 2 тача, то мы просто зумим, но не двигаемся по картинке. Я нашёл код на одном форуме. Но это позволяет просто увеличивать картинку без возможности передвижения по ней (для рассмотрения деталей, например).

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

Сцена с картинками: сцена

Сцена при увеличении картинки: введите сюда описание изображения


Ответы (0 шт):