やまめも

【 ゲーム開発・日々のことについて 】

2Dでスワイプ(フリック)を取得する方法

Rayを使って、最初と最後の入力の位置を獲得して、自分でRayを定義してあげる。
(スワイプの取得方法で、他にいい方法があれば教えて欲しいです。)

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class FlickManager : MonoBehaviour {

	public float distance;
	public Vector2 UnitVector;

	public float Flick;
	public float angle;
	public float UnitVectorSignY;

	public static FlickManager instance = null;
	void Awake () {
		if(instance == null){
			instance = null;
		}
	}
	void Start () {
	}

	void Update () {
		if(Input.GetMouseButtonDown(0)){
			HitFirst();
		}
		if(Input.GetMouseButton(0)){
			HitLast();
		}
		if(Input.GetMouseButtonUp(0)){
			// 距離
			distance = Vector2.Distance(hitPoint2, hitPoint1);
			// ベクトル
			UnitVector = (hitPoint2-hitPoint1).normalized;
			// ベクトルのy方向の正負
			UnitVectorSignY = Mathf.Sign(UnitVector.y);
			// ベクトルの角度
			angle =Vector2.Angle(new Vector2(0,1),UnitVector);

			// print("distance = " +distance);
			// print(" UnitVector = " + UnitVector);
			// print("y = " + UnitVectorSignY);
			// print("Angle = " +angle);
			// フリックかどうかを判定する。

			// 大きさが1以上で、ベクトルがy軸に対して30度未満のものをフリック入力として受け取る。
			if(distance > 1f){
				if(UnitVectorSignY == 1){
					if(angle < 30){
						// Bandit
						Flick = 1f;
						print("Flick" +Flick);
					}
				}
				if(UnitVectorSignY == -1f){
					if(angle > 150){
						// Hostage
						Flick = -1f;
						print("Flick" +Flick);
					}
				}
			}else{
				// Empty
				Flick = 0;
				print("Flick" +Flick);
			}
		}
	}
	// 最初の位置を得る。
	Vector2 hitPoint1;
	RaycastHit2D hit1;
	void HitFirst(){
		// if(PlayerPrefs.GetInt("play") == 1){
			Vector2 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
			RaycastHit2D hit1 = Physics2D.Raycast(worldPoint,Vector2.zero);
			if(hit1){
	            if( hit1.transform.gameObject.layer == 8){
		            Bounds rect =  hit1.collider.bounds;
		            if(rect.Contains(worldPoint)){
		            	hitPoint1= hit1.point;
					}
				}
				else{
					return;
				}
			}
		// }
	}
	// 最後の位置を得る。
	Vector2 hitPoint2;
	RaycastHit2D hit2;
	void HitLast(){
		// if(PlayerPrefs.GetInt("play") == 1){
			Vector2 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
			hit2 = Physics2D.Raycast(worldPoint,Vector2.zero);
			if(hit2){
	            Bounds rect =  hit2.collider.bounds;
	            if(rect.Contains(worldPoint)){
	            	if( hit2.transform.gameObject.layer == 8){
		            	hitPoint2= hit2.point;

					}else{

						return;
					}
				}
			}
		// }
	}
}