第14回目は、「個別のオブジェクトに関するタッチ処理です」。 以前[【Unity NGUI】個別のオブジェクトにタッチ処理を実装する。 | albatrus.com]という記事を書いたのですが、一部上手くいかない部分があり、再度色々と考えました。 何とか形にすることができたので、改めてブログに書いていきたいと思います。
前回:【Unity 2D】スワイプでオブジェクトを回転させる
個別のオブジェクトに関するタッチ処理です
まずは、例としてこのようなモノを作成しました。
コード
空のGameObjectに以下のようなスクリプトを作成します。 [c] 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);
}
}
}
}
[/c]
このコードを書く際に苦労したことを書きます。
オブジェクトがあるかどうか判定する
RaycastHit2Dというクラスを使えば判定ができます。 やりたいことは、わかっているのですが、どうすれば実装できるかに時間がかかります。 [Physics2D.Raycast]の第2引数に注意です。 [c]
RaycastHit2D hit = Physics2D.Raycast(worldPoint,Vector2.zero);
[/c]
タッチした際にそこにオブジェクトがあるか
何か2度手間のような気がするのですが、この判定を入れないと上手く動作しませんでした。 タッチしていないのに、オブジェクトが消えてしまう現象が起こります。 オブジェクトから、[Collider2D]の範囲を取り出してタッチした位置と比較をしています。 [c] Bounds rect = hit.collider.bounds; if(rect.Contains(worldPoint)){
} [/c]
最後に
このように、個別にタッチ処理を書くのではなく、ゲーム全体を管理するManager的なオブジェクトを作成し、そこでタッチ処理を管理すると上手くいきました。 便利な関数やクラスがUnityには用意されているのですが、それを調べるのがとても大変です。
Cocos2d-xスマートフォン2Dゲーム開発講座 Cocos2d-x 3対応 (SMART GAME DEVELOPER) 株式会社TKS2 翔泳社 売り上げランキング : 630 Amazonで詳しく見る |