Pinch to Zoom

난이도: 초급

In this video you will learn to make a basic pinch to zoom mechanic using the multitouch inputs of a mobile device.

Pinch to Zoom

초급 Mobile & Touch

Code snippet

``````using UnityEngine;

public class PinchZoom : MonoBehaviour
{
public float perspectiveZoomSpeed = 0.5f;        // The rate of change of the field of view in perspective mode.
public float orthoZoomSpeed = 0.5f;        // The rate of change of the orthographic size in orthographic mode.

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;

// If the camera is orthographic...
if (camera.isOrthoGraphic)
{
// ... change the orthographic size based on the change in distance between the touches.
camera.orthographicSize += deltaMagnitudeDiff * orthoZoomSpeed;

// Make sure the orthographic size never drops below zero.
camera.orthographicSize = Mathf.Max(camera.orthographicSize, 0.1f);
}
else
{
// Otherwise change the field of view based on the change in distance between the touches.
camera.fieldOfView += deltaMagnitudeDiff * perspectiveZoomSpeed;

// Clamp the field of view to make sure it's between 0 and 180.
camera.fieldOfView = Mathf.Clamp(camera.fieldOfView, 0.1f, 179.9f);
}
}
}
}``````
``````#pragma strict

public var perspectiveZoomSpeed : float = 0.5f;        // The rate of change of the field of view in perspective mode.
public var orthoZoomSpeed : float = 0.5f;        // The rate of change of the orthographic size in orthographic mode.

function Update()
{
// If there are two touches on the device...
if (Input.touchCount == 2)
{
// Store both touches.
var touchZero = Input.GetTouch(0);
var touchOne = Input.GetTouch(1);

// Find the position in the previous frame of each touch.
var touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
var touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

// Find the magnitude of the vector (the distance) between the touches in each frame.
var prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
var touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

// Find the difference in the distances between each frame.
var deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag;

// If the camera is orthographic...
if (camera.isOrthoGraphic)
{
// ... change the orthographic size based on the change in distance between the touches.
camera.orthographicSize += deltaMagnitudeDiff * orthoZoomSpeed;

// Make sure the orthographic size never drops below zero.
camera.orthographicSize = Mathf.Max(camera.orthographicSize, 0.1f);
}
else
{
// Otherwise change the field of view based on the change in distance between the touches.
camera.fieldOfView += deltaMagnitudeDiff * perspectiveZoomSpeed;

// Clamp the field of view to make sure it's between 0 and 180.
camera.fieldOfView = Mathf.Clamp(camera.fieldOfView, 0.1f, 179.9f);
}
}
}``````
``````import UnityEngine

public class PinchZoom(MonoBehaviour):

public perspectiveZoomSpeed as single = 0.5F

// The rate of change of the field of view in perspective mode.
public orthoZoomSpeed as single = 0.5F

// The rate of change of the orthographic size in orthographic mode.

private def Update():
// If there are two touches on the device...
if Input.touchCount == 2:
// Store both touches.
touchZero as Touch = Input.GetTouch(0)
touchOne as Touch = Input.GetTouch(1)

// Find the position in the previous frame of each touch.
touchZeroPrevPos as Vector2 = (touchZero.position - touchZero.deltaPosition)
touchOnePrevPos as Vector2 = (touchOne.position - touchOne.deltaPosition)

// Find the magnitude of the vector (the distance) between the touches in each frame.
prevTouchDeltaMag as single = (touchZeroPrevPos - touchOnePrevPos).magnitude
touchDeltaMag as single = (touchZero.position - touchOne.position).magnitude

// Find the difference in the distances between each frame.
deltaMagnitudeDiff as single = (prevTouchDeltaMag - touchDeltaMag)

// If the camera is orthographic...
if camera.isOrthoGraphic:
// ... change the orthographic size based on the change in distance between the touches.
camera.orthographicSize += (deltaMagnitudeDiff * orthoZoomSpeed)

// Make sure the orthographic size never drops below zero.
camera.orthographicSize = Mathf.Max(camera.orthographicSize, 0.1F)
else:
// Otherwise change the field of view based on the change in distance between the touches.
camera.fieldOfView += (deltaMagnitudeDiff * perspectiveZoomSpeed)

// Clamp the field of view to make sure it's between 0 and 180.
camera.fieldOfView = Mathf.Clamp(camera.fieldOfView, 0.10000000149F, 179.9F)``````

Mobile & Touch

1. Multi Touch Input
2. Accelerometer Input
3. Pinch to Zoom