2017-01-27 6 views
3

Я пытаюсь переустановить систему pinch-to-zoom в приложении Unity UI. Около шести месяцев назад я смог взломать один из них, сделав холст пользовательского интерфейса дочерним элементом обычного GameObject и манипулируя преобразованием этого объекта, но так как обновление до Unity 5.5+ я считаю, что это не работает. Самое близкое, что я могу получить, позволяет жесту щепотка изменить масштабный масштабный файл canvas, который: a) может неправильно изменять размеры изображений, панелей и т. Д. В зависимости от их выравнивания, и b) не позволит мне кастрюли после увеличения.Pinch-To-Zoom с Unity 5 UI

То, что я до сих пор это:

public class PinchToZoomScaler : MonoBehaviour { 

    public Canvas canvas; // The canvas 
    public float zoomSpeed = 0.5f;  // The rate of change of the canvas scale factor 

    public float _resetDuration = 3.0f; 
    float _durationTimer = 0.0f; 

    float _startScale = 0.0f; 

    void Start() { 
     _startScale = canvas.scaleFactor; 
    } 

    void Update() 
    { 
      // If there are two touches on the device... 
      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; 

       // ... change the canvas size based on the change in distance between the touches. 
       canvas.scaleFactor -= deltaMagnitudeDiff * zoomSpeed; 

       // Make sure the canvas size never drops below 0.1 
       canvas.scaleFactor = Mathf.Max (canvas.scaleFactor, _startScale); 
       canvas.scaleFactor = Mathf.Min (canvas.scaleFactor, _startScale * 3.0f); 

       _durationTimer = 0.0f; 
      } else { 
       _durationTimer += Time.deltaTime; 

       if (_durationTimer >= _resetDuration) { 
        canvas.scaleFactor = _startScale; 
       } 
      } 
    } 
} 

Как я уже сказал, это работает в определенной степени, но не дает мне хорошее равномерное масштабирование, не позволяет ли она мне панорамировать холст. Заранее благодарю за любую помощь.

ответ

0

Вы можете использовать эту функцию (просто передать ему отрицательный deltaMagnitudeDiff) Также хорошо Multiplay deltaMagnitudeDiff с соотношением типа (0.05)

float currentScale = 1f; 
void Zoom (float increment) 
{ 
    currentScale += increment; 
    if (currentScale >= maxScale) 
    { 
     currentScale = maxScale; 
    } 
    else if (currentScale <= minScale) 
    { 
     currentScale = minScale; 
    } 
    rectTransform.localScale = new Vector3 (currentScale, currentScale, 1); 

    pan.ValidatePosition(); 
} 

Для панорамирования, вы можете использовать что-то вроде этого:

public class Pan : MonoBehaviour 
{ 
    public float Speed; 

    Vector3 startDragPosition; 

    public void BeginDrag() 
    { 
     startDragPosition = Input.mousePosition; 
    } 

    public void Drag() 
    { 
     transform.localPosition += (Input.mousePosition - startDragPosition) * Speed; 
     startDragPosition = Input.mousePosition; 

     ValidatePosition(); 
    } 

    public void ValidatePosition() 
    { 
     var temp = transform.localPosition; 

     var width = ((RectTransform)transform).sizeDelta.x; 
     var height = ((RectTransform)transform).sizeDelta.y; 

     var MaxX = 0.5f * width * Mathf.Max (0, transform.localScale.x - 1); 
     var MaxY = 0.5f * height * Mathf.Max (0, transform.localScale.y - 1); 

     var offsetX = transform.localScale.x * width * (((RectTransform)transform).pivot.x - 0.5f); 
     var offsetY = transform.localScale.y * width * (((RectTransform)transform).pivot.y - 0.5f); 

     if (temp.x < -MaxX + offsetX) 
      temp.x = -MaxX + offsetX; 
     else if (temp.x > MaxX + offsetX) 
      temp.x = MaxX + offsetX; 

     if (temp.y < -MaxY + offsetY) 
      temp.y = -MaxY + offsetY; 
     else if (temp.y > MaxY + offsetY) 
      temp.y = MaxY + offsetY; 

     transform.localPosition = temp; 
} 

Просто позвоните функции (BeginDrag & Drag) из событий триггера компонента.

Смежные вопросы