Edited at

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

More than 3 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;
}
}