スマホゲームやアプリでは、メニューを上下にスクロールしたり、キャラクターを左右だけに移動させたい場面がよくあります。
しかし、Unityの標準的なスワイプ判定だと、斜めや微妙なズレた入力も拾ってしまい、操作ミスが発生しやすくなります。
この記事では、Unity×iOS環境でスワイプ方向を「上下のみ」「左右のみ」などに正しく限定する方法を、コピペで使えるスクリプト付きで解説します!
この記事で分かること
- なぜスワイプ方向を制限する必要があるのか
- スワイプの基本的な検出方法(Unity標準Input使用)
- 【コピペOK】上下・左右だけを認識する判定スクリプト
- 応用:斜め45度以内だけ許可する方法
- 実際のゲーム実装で気をつけたいポイント
なぜスワイプ方向を制限する必要があるのか?
Unityの標準タッチ検出(Input.GetTouchやInput.GetMouseButton)は、基本的に移動量(ベクトル)しか見ていません。
そのため、微妙に斜めに動かしただけでも、左右移動のつもりが上下に判定されるなどの操作ミスが発生しがちです。
ユーザーが意図した操作方向のみを認識することで、以下のメリットがあります:
- 操作ミスを防ぎ、快適な操作感を提供できる
- 特定のゲーム設計(例:左右移動のみのランゲーム)と完全に一致できる
- 誤判定によるプレイヤーのストレスを最小限にできる
Unityでのスワイプ基本検出(おさらい)
まずは、シンプルなスワイプ検出の流れを確認しましょう。
startPos:タッチ開始地点
endPos:指を離した地点
diff:移動ベクトル(向きと距離)
swipeThreshold:スワイプと認識する最低距離
void Update()
{
if (Input.GetMouseButtonDown(0))
startPos = Input.mousePosition;
if (Input.GetMouseButtonUp(0))
{
Vector2 endPos = Input.mousePosition;
Vector2 diff = endPos - startPos;
if (diff.magnitude > swipeThreshold)
{
Vector2 direction = diff.normalized;
Debug.Log($"スワイプ方向: {direction}");
}
}
}
ここまでは一般的な実装ですが、ここから特定方向だけ許可するロジックを追加していきます!
【コピペOK】上下・左右だけを認識するスクリプト
方向を限定するためには、X軸成分とY軸成分を比較するのが簡単かつ効果的です。
using UnityEngine;
public class SwipeDirectionDetector : MonoBehaviour
{
public float swipeThreshold = 50f; // スワイプ判定の最小距離
private Vector2 startPos;
void Update()
{
if (Input.GetMouseButtonDown(0))
startPos = Input.mousePosition;
if (Input.GetMouseButtonUp(0))
{
Vector2 endPos = Input.mousePosition;
Vector2 diff = endPos - startPos;
if (diff.magnitude < swipeThreshold) return; // 小さすぎる動きは無視
// どちらの軸方向に強いかを判定
if (Mathf.Abs(diff.x) > Mathf.Abs(diff.y))
{
// 横方向のスワイプ(左右)
if (diff.x > 0)
Debug.Log("右スワイプ");
else
Debug.Log("左スワイプ");
}
else
{
// 縦方向のスワイプ(上下)
if (diff.y > 0)
Debug.Log("上スワイプ");
else
Debug.Log("下スワイプ");
}
}
}
}
このスクリプトでできること
- 横移動(右・左)だけ判定
- 縦移動(上・下)だけ判定
- 必要なら、縦・横どちらかのみ無視することも可能
例えば、横方向だけ有効にしたい場合はこうします:
if (Mathf.Abs(diff.x) > Mathf.Abs(diff.y))
{
// 横だけ許可
if (diff.x > 0) Debug.Log("右スワイプ");
else Debug.Log("左スワイプ");
}
// else 無視(縦スワイプは何もしない)
応用:斜め45度以内だけ許可する方法
さらにこだわる場合、「ほぼ真横、ほぼ真上だけ許可したい」というケースもあります。
その場合は、ベクトルの角度を使った判定が有効です。
float angle = Vector2.Angle(Vector2.right, diff.normalized); // 右方向との角度
if (angle < 30f)
{
Debug.Log("右スワイプ(±30°以内)");
}
else if (angle > 150f)
{
Debug.Log("左スワイプ(±30°以内)");
}
else
{
// 横以外は無視
}
これで、30度以内の許容範囲だけをスワイプと認識できるようになります!
実際のゲーム実装で気をつけたいポイント
- しきい値(swipeThreshold)は端末サイズに合わせて調整
- 高解像度端末では50〜100pxくらいがちょうどいい
- 斜めスワイプの「曖昧さ」を許容するかはゲーム性に合わせる
- 例えばアクションゲームなら「多少斜めでも右スワイプ扱い」が親切
- 最初にタッチしたUI(ボタンなど)がスワイプ対象か確認する
- EventSystem.current.IsPointerOverGameObject() を使えばUI上のタッチを除外できます
まとめ
- Unity標準Inputで簡単にスワイプ方向を検出できる
- 横/縦のみを許可するだけで操作ミスを大幅に削減できる
- さらにベクトル角度判定を加えれば高精度な操作制御も可能
- iOSアプリの快適な操作感作りには必須のテクニック!
ぜひ、この記事のテクニックを使って、あなたのUnity×iOSプロジェクトの操作性をぐっと向上させてください!