LoginSignup
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-10-14

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;
        }
    }

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11