Unity Multi-Touch (Pinch) для масштабирования объекта - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь использовать мультитач (Pinch) для масштабирования объекта.
Работает нормально, но когда я позволяю go из 2 касаний и пытаюсь снова увеличить и уменьшить масштаб,
Объект продолжает пытаться go вернуться к своему первоначальному масштабу.

Я использовал код ниже.

if (Input.touchCount == 2 && Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved)
{
    Touch touchZero = Input.GetTouch(0); 
    Touch touchOne = Input.GetTouch(1);

    Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
    Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

    float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
    float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

    float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag;
    float pinchAmount = deltaMagnitudeDiff * 0.02f * Time.deltaTime;
    objectImRotating.transform.localScale += new Vector3(pinchAmount, pinchAmount, pinchAmount);
}

1 Ответ

1 голос
/ 23 марта 2020

Я не знаю причину проблемы, но вот что я хотел бы сделать: вместо масштабного дополнения использовать масштабирование, а сделать что-то вроде

private Vector2 initialDistance;
private Vector3 initialScale;

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

        // if one of the touches Ended or Canceled do nothing
        if(touchZero.phase == TouchPhase.Ended || touchZero.phase == TouchPhase.Canceled  
           || touchOne.phase == TouchPhase.Ended || touchOne.phase == TouchPhase.Canceled) 
        {
            return;
        }

        // It is enough to check whether one of them began since we
        // already excluded the Ended and Canceled phase in the line before
        if(touchZero.phase == TouchPhase.Began || touchOne.phase == TouchPhase.Began)
        {
            // track the initial values
            initialDistance = Vector2.Distance(touchZero.position, touchOne.position);
            initialScale = objectImRotating.transform.localScale;
        }
        // else now is any other case where touchZero and/or touchOne are in one of the states
        // of Stationary or Moved
        else
        {
            // otherwise get the current distance
            var currentDistance = Vector2.Distance(touchZero.position, touchOne.position);

            // A little emergency brake ;)
            if(Mathf.Approximately(initialDistance, 0)) return;

            // get the scale factor of the current distance relative to the inital one
            var factor = currentDistance / initialDistance;

            // apply the scale
            // instead of a continuous addition rather always base the 
            // calculation on the initial and current value only
            objectImRotating.transform.localScale = initialScale * factor;
        }
    }
}

Напечатано на смартфоне, но я надеюсь, что идея становится ясной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...