Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

「UnityでiOS/Android/Editorの共通タッチ処理を実装する」にdeltaを取れるように追加してみた

More than 5 years have passed since last update.

UnityでiOS/Android/Editorの共通タッチ処理を実装するの記事が便利そうだったのだが、deltaPositionを取れないのがちょっと不満だったので追加修正してみたメモ。

コード

AppUtil.cs
using UnityEngine;
using System.Collections;

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

    /// <summary>
    /// タッチ情報を取得(エディタと実機を考慮)
    /// </summary>
    /// <returns>タッチ情報。タッチされていない場合は null</returns>
    public static TouchInfo GetTouch() {
        if (Application.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 (Application.isEditor){
            TouchInfo touch = AppUtil.GetTouch();
            if (touch != TouchInfo.None) {
                PreviousPosition = Input.mousePosition;
                return PreviousPosition;
            }
        } 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;
    }

    public static Vector3 GetDeltaPosition(){
        if(Application.isEditor){
            TouchInfo info = AppUtil.GetTouch();
            if(info != TouchInfo.None){
                Vector3 currentPosition = Input.mousePosition;
                Vector3 delta = currentPosition - PreviousPosition;
                PreviousPosition = currentPosition;
                return delta;
            }
        }else{
            if(Input.touchCount > 0){
                Touch touch = Input.GetTouch(0);
                PreviousPosition.x = touch.deltaPosition.x;
                PreviousPosition.y = touch.deltaPosition.y;
                return PreviousPosition;
            }
        }
        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 = -1,

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

使い方(例)

    public float speed = 1.0f;

    void Update () {
        TouchInfo info = AppUtil.GetTouch();
        switch(info){
        case TouchInfo.Began:
            break;
        case TouchInfo.Moved:
            Vector3 delta = AppUtil.GetDeltaPosition();
            float xMove = delta.x * speed *10;
            float yMove = delta.y * speed *10;

            float xAngle = yMove;
            float yAngle = -xMove;

            // ターゲットのGameObjectを回転させたりするつもりのコード
            target.Rotate(xAngle, yAngle, 0.0f, Space.World);
            break;
        case TouchInfo.Ended:
            break;
        }
    }
JunSuzukiJapan
基本、未来の自分あてに備忘録として書いてます。
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