【Unity】Raycastが機能しないと思ったら2Dだった話

タップ・クリックした先にあるオブジェクトの名前を取得するときにRayを使ったけど、なんか取得できないな~と思い調べた話。

バージョン

2021.3.3f1

結論

BoxCollider2DにはPhysics2D.Raycastを使うこと

以下、雑記

結論にもある通り、2DのcolliderにはPhysics2Dを使いましょうよってことです。
※2DのcolliderにPhysics.Raycastは反応しないようです。

コード的には若干違うので、ただ”2D”の文字を追加するだけではダメ。

Qiitaのコードを使っていたので、これを強引に2D対応させた。

詳細はこちら
クリックしたオブジェクトの名前を取得

抜粋してコメントアウトを削除したものが下記。

これが3D用だったので、ずっと躓いてた。

if (Input.GetMouseButtonDown(0))
{
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      RaycastHit hit = new RaycastHit();
      if (Physics.Raycast(ray, out hit, distance))
      {
        string objectName = hit.collider.gameObject.name;
        Debug.Log(objectName);
      }
}

これを2D用にするには

if (Input.GetMouseButtonDown(0)) 
{
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      Vector2 ray2D = new Vector2(ray.origin.x , ray.origin.y);
      RaycastHit2D hit2D = Physics2D.Raycast(ray2D, ray2D);
      if (hit2D)
      {
        string objectName = hit2D.collider.gameObject.name;
        Debug.Log(objectName);
      }
}

さらっと解説

  1. rayはVector3なので、origin.xなどでxとyを取得し、Vector2に無理やりした。
  2. Physics2D.Raycastは原点と方向が必要なので、同じray2D(つまり、同じx,y)を引数とした。
  3. Physics2Dの当たり情報は戻り値であるRaycastHit2D。
    Physics  の当たり情報はout hitの中にある。

もっと良いやり方や語弊もあるかもしれないが、初心者の私の理解したままを記す。

にしても、このことに気づくまで時間を費やしてしまった。

参考サイト

いつもお世話になるテックさん。

【初心者Unity】Raycastの基本的な使い方(オブジェクトをクリックで取得) | TECH PROjin

この方の記事を何気なく読んでピンときました。

Unity公式

Physics-Raycast - Unity スクリプトリファレンス
Castsaray,frompointorigin,indirectiondirection,oflengthmaxDistance,againstallcollidersintheScene.
Physics2D-Raycast - Unity スクリプトリファレンス
CastsarayagainstcollidersintheScene.

コメント

タイトルとURLをコピーしました