Unity×iOS

【Unity×iOS】スワイプを特定方向だけ認識する方法|上下左右の制御テクニック

スマホゲームやアプリでは、メニューを上下にスクロールしたり、キャラクターを左右だけに移動させたい場面がよくあります。
しかし、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プロジェクトの操作性をぐっと向上させてください!