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

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

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

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

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

2014-9-12-fdsadao
2014-0912-fdsa

コード

空の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)Cocos2d-xスマートフォン2Dゲーム開発講座 Cocos2d-x 3対応 (SMART GAME DEVELOPER)
株式会社TKS2

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

Amazonで詳しく見る