mayonage-koboの日記

我ら真夜中ゲーム工房の進捗と、ゲーム開発のメモを残しておくブログ

タップ操作を作りたい(2014/12/20)

hisojiです。

様々な諸事情により進捗が少なめになってしまいました。年末のせいにします。
なので今日はざっくりとタップ入力について調べました。

MouseとTouch

タップを扱う手段として2つ考えてます。Input.GetMouseButton系の関数と、Input.GetTouch系の関数です。
(他にもNGUI、Asset storeなど手段はあるようなのですが省きます。)

以前、タップでオブジェクトを検出する際にInput.GetMouseButtonDown(0)を使いました。
名前から分かる通り、もともとはマウスの入力を取得する関数です。ただandroidのタッチに対しても同じように反応するので、「押された瞬間」「押している状態」などが分かります。

一方で、unityにはタッチ用の機能も存在します。Input.GetTouchなどです。こちらだと現在タップしている指の状態(触り始めたか、動いているか)をTouchPhase列挙子で受け取ることができます。また、タップしている指の数を調べたりできます。以前制作された「NightBat」ではスマートフォン用の入力にこちらを使ってました。

ここで「1本指ならどっちでもいいんじゃね。てかどっち使おう」という考えが浮かびました。
とりあえず機能的には同じなのか?という疑問に関しては以下のサイトで回答されています。
Input.mousePosition equivalent to first finger touch? - Unity Answers
えいごわかんない人なんですが、多分「最初の指に対してはどちらも同じように動きますよ」的な事が書かれています。

制作中のGrowは今の所1本指でのタップとスワイプしか使わないので、とりあえずInput.GetMouseButton系の関数を使う事にします。これだとマウスの処理と区別する必要が無いので実装が若干楽になります。後に2本指とか使う場合は場合分けしないといけないので、操作方法については検討する必要がありそうです。

スワイプ

タップするだけなら上記のを使えばいいので、スワイプについて考えます。とりあえずInput.GetMouseButtonだけを使ってみます。
押された瞬間にその位置を記録して、今押している位置との差異をなんやかんやすればスワイプ方向を検出出来そうです。以下、未検証なコード。

public class TapCursor : MonoBehaviour {
...
public enum Direction{
	None,
	Left,
	Right,
	Up,
};

Vector2 from;
Vector2 to;

void Update () {
	Vector2 input = Input.mousePosition;
	Vector2 v = new Vector2(input.x,Screen.height-input.y);
	if(Input.GetMouseButtonDown(0)){
		from =v;
		to = v;
	}
	if(Input.GetMouseButton(0)){
		to = v;
	}
	if(Input.GetMouseButtonUp(0)){
		from = v;
		to = v;
	}
}

public bool isDirection(Direction d){
	Vector2 v = to - from;
	switch(d){
	case Direction.Left:
		return v.x < -10.0f;
	case Direction.Right:
		return v.x > 10.0f;
	case Direction.Up:
		return v.y < -10.0f;
	default:
		return false;
	}
	return false;
}
}

isDirection関数によって、方向が右である時と上である時の条件などが同時に行えます。
updateのmousePositionをいじってるのはy軸方向が違うらしいからです。
もしかしてInput.Touchの方が楽とか...?後で調べておきたいです。

そしてタップ操作が追加されるという事はそろそろ実機でテストプレイが出来るとか出来ないとか...?