【Unity 2D】GameObjectにタッチ処理を実装する

  • |
【Unity 2D】GameObjectにタッチ処理を実装する
   

第14回目は、「個別のオブジェクトに関するタッチ処理です」。
以前[【Unity NGUI】個別のオブジェクトにタッチ処理を実装する。 | albatrus.com]という記事を書いたのですが、一部上手くいかない部分があり、再度色々と考えました。
何とか形にすることができたので、改めてブログに書いていきたいと思います。

前回:【Unity 2D】スワイプでオブジェクトを回転させる


個別のオブジェクトに関するタッチ処理です

まずは、例としてこのようなモノを作成しました。

2014-9-12-fdsadao


2014-0912-fdsa

コード

空のGameObjectに以下のようなスクリプトを作成します。
	public GameObject prefab;

  	void Update () {
		 
		 if(Input.touchCount > 0){


			Touch _touch = Input.GetTouch(0);
			Vector2 worldPoint = Camera.main.ScreenToWorldPoint(_touch.position);

			if(_touch.phase == TouchPhase.Began){

				Debug.Log("worldPoint :x"+  worldPoint.x + "y:" + worldPoint.y);
                 
                //タッチをした位置にオブジェクトがあるかどうかを判定
				RaycastHit2D hit = Physics2D.Raycast(worldPoint,Vector2.zero);

				if(hit){
					
					Bounds rect =  hit.collider.bounds;
					
            //オブジェクトがある場合は、そのオブジェクトを消している
					if(rect.Contains(worldPoint)){
						
						Debug.Log("hit object is " + hit.collider.gameObject.name);
						Destroy(hit.collider.gameObject);
						
					}
						
						
				}else{
					
					
            //オブジェクトがある場合は、オブジェクトを作成
					Instantiate(prefab,worldPoint,Quaternion.identity);

				}


			}
		}
	}


このコードを書く際に苦労したことを書きます。

オブジェクトがあるかどうか判定する

RaycastHit2Dというクラスを使えば判定ができます。
やりたいことは、わかっているのですが、どうすれば実装できるかに時間がかかります。
[Physics2D.Raycast]の第2引数に注意です。

RaycastHit2D hit = Physics2D.Raycast(worldPoint,Vector2.zero);


タッチした際にそこにオブジェクトがあるか

何か2度手間のような気がするのですが、この判定を入れないと上手く動作しませんでした。
タッチしていないのに、オブジェクトが消えてしまう現象が起こります。
オブジェクトから、[Collider2D]の範囲を取り出してタッチした位置と比較をしています。
Bounds rect =  hit.collider.bounds;
if(rect.Contains(worldPoint)){

   
}

最後に

このように、個別にタッチ処理を書くのではなく、ゲーム全体を管理するManager的なオブジェクトを作成し、そこでタッチ処理を管理すると上手くいきました。
便利な関数やクラスがUnityには用意されているのですが、それを調べるのがとても大変です。


Cocos2d-xスマートフォン2Dゲーム開発講座 Cocos2d-x 3対応 (SMART GAME DEVELOPER)Cocos2d-xスマートフォン2Dゲーム開発講座 Cocos2d-x 3対応 (SMART GAME DEVELOPER)
株式会社TKS2

翔泳社
売り上げランキング : 630

Amazonで詳しく見る

Related Posts Plugin for WordPress, Blogger...