PCでは快適に遊べていたゲームを、いざAndroidやiPhoneで動かしてみると——ピンチでズームできない、ボタンを押したつもりがキャラも一緒に動く、スコア表示がノッチの裏に隠れて読めない。 スマホ対応の問題は、実機に入れた瞬間、全部まとめて自分ごとになりま す。
この記事では、New Input System の Enhanced Touch を軸に、タップ・ドラッグ・長押し・ピンチというモバイルの基本操作と、UIとの競合を防ぐガード、そして Safe Area 対応までを一気に整えます。最後は「1本指でパン、2本指でピンチズームできる見下ろしマップ」を完成させます。
この記事でわかること
- マウス互換だけでは足りない理由と Enhanced Touch の有効化
- タップ・ドラッグ・長押し をしきい値で判定する定番ロジック
- 2本指の ピンチ(ズーム)とパン の計算
- UI上のタッチをゲーム操作へ通さない ガード(
IsPointerOverGameObject)Screen.safeAreaでノッチ・パンチホールを避けるUI配置- 実践:ピンチズームできる見下ろしマップを完成させる
動作確認環境: Unity 6 (6000.x)・Input System
マウス互換だけでは足りない理由
Unityはタッチをある程度マウスとして扱ってくれるので、「タップ=クリック」だけのゲームなら、PC向けのコードがそのまま動くこともあります。それでもタッチ専用の書き方が必要になるのは、タッチとマウスが根本的に違うからです。
- 指は複数ある: マウスカーソルは常に1つですが、指は2本、3本と同時に画面へ触れます。ピンチズームはその代表です
- 「触れていない時の位置」が無い: マウスは動かすだけで位置が取れますが、指は触れた瞬間に突然現れ、離れた瞬間に消えます。ホバー(マウスオーバー)も存在しません
- 1本の指には一生がある: 触れる(began)→ 動く(moved)→ 離れる(ended)という 状態の流れ を追いかけて、初めてドラッグや長押しを区別できます
この「複数の指を、IDと状態付きで追いかける」ためのAPIが、New Input Systemの Enhanced Touch です。
Enhanced Touch を有効にする
Enhanced Touchは省電力のため標準では眠っています。使う前に1回だけ有効化してください。
using UnityEngine;
using UnityEngine.InputSystem.EnhancedTouch;
// Touch型の名前が衝突しないよう、別名を付けておくと安全
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
public class TouchBootstrap : MonoBehaviour
{
void OnEnable()
{
EnhancedTouchSupport.Enable();
}
void OnDisable()
{
EnhancedTouchSupport.Disable();
}
}
有効化すると、 Touch.activeTouches で「いま画面に触れているすべての指」が読めるようになります。
void Update()
{
foreach (Touch touch in Touch.activeTouches)
{
// 指ごとに、ID・位置・状態が取れる
Debug.Log($"指{touch.touchId}: {touch.screenPosition} ({touch.phase})");
}
}
touch.phase が指の一生を表します。Began(触れた瞬間)→ Moved / Stationary(動いた・止まっている)→ Ended / Canceled(離れた・中断)。以降のジェスチャー判定は、ぜんぶこの流れの読み取りです。
タップ・ドラッグ・長押しを判定する
1本指の基本ジェスチャーは、 「どれだけ動いたか」と「どれだけ長く触れていたか」の2つのしきい値 で区別できます。
