Help us understand the problem. What is going on with this article?

UnityでiOS/Android/Editorの共通タッチ処理を実装する

More than 1 year has passed since last update.

UnityAsset「GodTouch」
↑Asset化しました☆


Unityでスマートフォンのタッチ処理を実装するには以下のようにするかと思う。

Touch.cs
if (Input.touchCount > 0)
{
    Touch touch = Input.GetTouch(0);
    if(touch.phase == TouchPhase.Began)
    {
        // タッチ開始
    }
    else if (touch.phase == TouchPhase.Moved)
    {
        // タッチ移動
    }
    else if (touch.phase == TouchPhase.Ended)
    {
        // タッチ終了
    }
}

でもこれってエディタ上では動作しなくて(タッチ数が常に0)、タッチの処理を毎回実機に転送して確認ってのはダルい。。
もちろんAssetStoreから適当なタッチAssetを取ってきてもいいけど(こんなんとか→ https://www.assetstore.unity3d.com/en/#!/content/3322 )、大抵の場合タッチ処理ってそんな複雑ことしなくていいから以下のようなものを使ってる。

AppUtil.cs
public static class AppUtil
{
    private static Vector3 TouchPosition = Vector3.zero;

    /// <summary>
    /// タッチ情報を取得(エディタと実機を考慮)
    /// </summary>
    /// <returns>タッチ情報。タッチされていない場合は null</returns>
    public static TouchInfo GetTouch()
    {
        if (AppConst.IsEditor)
        {
            if (Input.GetMouseButtonDown(0)) { return TouchInfo.Began; }
            if (Input.GetMouseButton(0)) { return TouchInfo.Moved; }
            if (Input.GetMouseButtonUp(0)) { return TouchInfo.Ended; }
        }
        else
        {
            if (Input.touchCount > 0)
            {
                return (TouchInfo)((int)Input.GetTouch(0).phase);
            }
        }
        return TouchInfo.None;
    }

    /// <summary>
    /// タッチポジションを取得(エディタと実機を考慮)
    /// </summary>
    /// <returns>タッチポジション。タッチされていない場合は (0, 0, 0)</returns>
    public static Vector3 GetTouchPosition()
    {
        if (AppConst.IsEditor)
        {
            TouchInfo touch = AppUtil.GetTouch();
            if (touch != TouchInfo.None) { return Input.mousePosition; }
        }
        else
        {
            if (Input.touchCount > 0)
            {
                Touch touch = Input.GetTouch(0);
                TouchPosition.x = touch.position.x;
                TouchPosition.y = touch.position.y;
                return TouchPosition;
            }
        }
        return Vector3.zero;
    }

    /// <summary>
    /// タッチワールドポジションを取得(エディタと実機を考慮)
    /// </summary>
    /// <param name='camera'>カメラ</param>
    /// <returns>タッチワールドポジション。タッチされていない場合は (0, 0, 0)</returns>
    public static Vector3 GetTouchWorldPosition(Camera camera)
    {
        return camera.ScreenToWorldPoint(GetTouchPosition());
    }
}

/// <summary>
/// タッチ情報。UnityEngine.TouchPhase に None の情報を追加拡張。
/// </summary>
public enum TouchInfo
{
    /// <summary>
    /// タッチなし
    /// </summary>
    None = 99,

    // 以下は UnityEngine.TouchPhase の値に対応
    /// <summary>
    /// タッチ開始
    /// </summary>
    Began = 0,
    /// <summary>
    /// タッチ移動
    /// </summary>
    Moved = 1,
    /// <summary>
    /// タッチ静止
    /// </summary>
    Stationary = 2,
    /// <summary>
    /// タッチ終了
    /// </summary>
    Ended = 3,
    /// <summary>
    /// タッチキャンセル
    /// </summary>
    Canceled = 4,
}

ついでに UnityEngine.TouchPhase 列挙型にタッチなし状態がなかったので追加。これでタッチ数気にせず GetTouch() で TouchInfo さえ取得すればタッチ判定を処理可能。

SceneStart.cs
// 以前はこう書いてたのを・・・
if(Input.touchCount > 0)
{
    Touch touch = Input.GetTouch(0);
    if(touch.phase == TouchPhase.Began)
    {
        // タッチ開始
    }
}

// こう書ける
TouchInfo info = AppUtil.GetTouch();
if (info == TouchInfo.Began)
{
    // タッチ開始
}

うん、スマート

tempura
フリーランスの天麩羅調理師 http://okamura0510.jp https://github.com/okamura0510 https://www.tempura.blog
http://okamura0510.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした