Unity

Unity2d クリック(タップ) されたオブジェクトを特定するやり方

More than 1 year has passed since last update.

初投稿です。

以前、自前のブログにUnity上でオブジェクトがタップされたかを検知するというので、
http://kibunhaossan.blog.fc2.com/blog-entry-37.html
上記記事を書いた後、ドヤ顔でUnity4.3から追加された2Dモードで同じことをしようとして、ものの見事に2日程詰まったので、2Dでのタップ判定について記載します。

色々書きそうなので、最初に要点を記します。

  1. SpriteはColliderが設定されていないので、Colliderの設定をする。
  2. 3D用の当たり判定は2D用では使えない。コードを2Dように書く必要がある
  3. Colliderを重ねると、Order in Layerの0から優先して評価される。

んじゃ、順に書いていきます。

1. SpriteはColliderが設定されていないので、Colliderの設定をする。

Unity3D標準のGameObjectのCubeとかは特性上勝手にColliderが指定されているので、特に意識する必要は無いですが、SpriteはColliderが勝手に入ってくれません。
まずは、その設定をしましょう。

当たり判定を入れたいObjectを選択して、
Objectを選択

Componentから、今回の例では、Box Collider 2Dを選択します。
Component追加
Component追加

インスペクタに追加されたことを確認します。
また、Is Triggerにチェックを入れておきます。
IsTriggerにチェック

これでEditor上の設定は完了したので、次にコードを2D用にしていきます。

2. 3D用の当たり判定は2D用では使えない。コードを2Dように書く必要がある

まず、大事なのが。
2Dと3DのPhysicは同居できるが、お互いが干渉しあうことはありません。
(なので、2Dと3DのPhysicをぶつけるとすり抜けてしまいます)
ココらへんの説明は、
http://www.slideshare.net/keigoando/unity2-dnew-gui#btnNext
上記の資料+上記で提示されているGitのSampleが非常にわかりやすいので、見たことない人は是非とも見てください。

んで、何が言いたいのかって言うと、3D用のPhysics.Raycastは2Dで展開されているSpriteを検知することはできません。
んじゃどうするか?2D用にちゃんと以下が用意されているので、それを使います。

  • RaycastHit2d
  • Physics2D ** Physics2D.Raycast

以下、上記を使ったSample

if (Input.GetMouseButtonDown(0)) {
    var tapPoint : Vector2 = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    var collition2d : Collider2D = Physics2D.OverlapPoint(tapPoint);
    if (collition2d) {
        var hitObject : RaycastHit2D = Physics2D.Raycast(tapPoint,-Vector2.up);
        if (hitObject) {
            Debug.Log("hit object is " + hitObject.collider.gameObject.name);
        }
    }
}

※私のブログの方のTE様より、collition2dが取得できない時不具合が発生するとのご指摘を頂きましたので、collition2dの判定を加えています。

これで取得することができます。

3. Colliderを重ねると、Order in Layerの0から優先して評価される。

これはおまけです。(ここでも詰まったので…)
どうやら、2つのSpriteそれぞれにColliderを設定し、タップすると、Order in Layerの0から優先して評価されてしまいます。
(ごちゃごちゃやっている際に、背景にCollider指定を入れてしまい、これに気づくまで本気で積みました)

これは、例えば以下のようにして回避できます。
Sortの優先度を上げる

Unity4.3は出て間もないというのもあり、色々試行錯誤してやっとここまでこぎつけたって感じなので、非常に無駄な事等やってましたら優しく突っ込んでやってくださいまし(^^;