Unity 2Dでスマホのタッチ認識をしてみる(3)

シェアする

  • このエントリーをはてなブックマークに追加

前回はTouch構造体の中身を見てみました。
今回は実践ということで、タッチでGameObjectを消す、というのをやってみたいと思います。
(書き忘れていましたが、2Dプロジェクトで考えています)

まず、シンプルに、マルチタッチは無視して、最初のタッチだけを判別対象にします ⇒ GetTouch(0)を使用
そうすると、Touch構造体からタッチのXY座標が取れるので、それが目的のGameObjectのColliderにヒットするか、というのを判別すれば良さそうですね。

サンプルスクリプトを探してみると、「Rayを飛ばす」方法もあるらしいのですが、これは3D空間ぽい考えですね。今回は2Dで行いたいので、プリミティブに座標を使ってみたいと思います。

Touch構造体から帰ってくるタッチのXY座標は、画面の左下を原点とするスクリーン上の座標です。これを、Unityのワールドの座標に置き換えるには、Cameraクラスが持つ、ScreenToWorldPoint()メソッドを使用するようです。

ScreenToWorldPoint()は、返却も入力もVector3型と書いてあるので、Vector3の変数を作って対応します(Z座標は0で)

そして、Colliderを使った当たり判定を行うには、Physics2Dクラスにメソッドがたくさんあります。その中で、座標点で判定するには、OverlapPointを使うようですね。
OverlapPointからは、ヒットしたCollider2Dが1個だけ返ってくるので、重なっていた場合の挙動には注意しないといけなさそうです。
Collider2DからGameObjectを取得するには、gameObjectプロパティを参照すればいいようです(transformのgameObjectを取得するサンプルソースもありますが、違いがよくわかりません)

ということで、出来上がったソースはこちら。
あ、別途、Collider2Dを持ったゲームオブジェクト(スプライトなど)を適宜配置しておきます。

void Update()
{
		if(Input.touchCount > 0)
		{
			Touch t = Input.GetTouch(0);
 
			Vector3 touchPoint_screen = new Vector3(t.position.x,t.position.y,0);
			Vector3 touchPoint_world = Camera.main.ScreenToWorldPoint(touchPoint_screen);
 
			Collider2D col =  Physics2D.OverlapPoint(touchPoint_world);
			if(col)
			{
				GameObject obj = col.gameObject; //col.transform.gameObjectでも同じ?
				Destroy(obj);
			}
		}
}

試してみるとわかりますが、1本目の指をおいたまま、2本目の指でタップしても反応しません。
また、タッチしただけでなく、スワイプしてスプライトを触っても消えます。これは、TouchPhaseで場合分けすれば制御できそうですね。

というわけで、Touchの挙動がまた少しわかりました。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

App Store