using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class PinchControl : MonoBehaviour, IDragHandler, IBeginDragHandler
public event Action<float> OnPinchDelta = delegate { };
private float prePinchInterval = float.NegativeInfinity;
public void OnBeginDrag(PointerEventData data)
prePinchInterval = float.NegativeInfinity;
public void OnDrag(PointerEventData data)
if (Input.touchCount < 2)
prePinchInterval = float.NegativeInfinity;
var interval = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
if (float.IsInfinity(prePinchInterval)) prePinchInterval = interval;
OnPinchDelta(interval / prePinchInterval);
prePinchInterval = interval;
OnDrag関数で2つのタッチ座標から距離を取得し、前フレームとの差を使用します。
前フレームとの差はだいたい 0.9 ~ 1.1
になるので使うスクリプトで乗算しましょう。
using UnityEngine;
public class Sample : MonoBehaviour
[SerializeField] private PinchControl pinch;
public void OnEnable()
pinch.OnPinchDelta += OnPinch;
public void OnDisable()
pinch.OnPinchDelta -= OnPinch;
private void OnPinch(float scale)
transform.localScale *= scale;
モバイル端末にビルドして動作確認をすると、Raycastに反応するuGUIでピンチイン・ピンチアウトができるようになります。
using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class PinchControl : MonoBehaviour, IDragHandler, IBeginDragHandler
public event Action<float> OnPinchDelta = delegate { };
private float prePinchInterval = float.NegativeInfinity;
public void OnBeginDrag(PointerEventData data)
prePinchInterval = float.NegativeInfinity;
public void OnDrag(PointerEventData data)
if (Input.touchCount < 2)
prePinchInterval = float.NegativeInfinity;
var interval = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
if (float.IsInfinity(prePinchInterval)) prePinchInterval = interval;
OnPinchDelta(interval / prePinchInterval);
prePinchInterval = interval;
OnDrag関数で2つのタッチ座標から距離を取得し、前フレームとの差を使用します。
前フレームとの差はだいたい 0.9 ~ 1.1
になるので使うスクリプトで乗算しましょう。
using UnityEngine;
public class Sample : MonoBehaviour
[SerializeField] private PinchControl pinch;
public void OnEnable()
pinch.OnPinchDelta += OnPinch;
public void OnDisable()
pinch.OnPinchDelta -= OnPinch;
private void OnPinch(float scale)
transform.localScale *= scale;
モバイル端末にビルドして動作確認をすると、Raycastに反応するuGUIでピンチイン・ピンチアウトができるようになります。