タップ・クリックした先にあるオブジェクトの名前を取得するときに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);
}
}
さらっと解説
- rayはVector3なので、origin.xなどでxとyを取得し、Vector2に無理やりした。
- Physics2D.Raycastは原点と方向が必要なので、同じray2D(つまり、同じx,y)を引数とした。
- Physics2Dの当たり情報は戻り値であるRaycastHit2D。
Physics の当たり情報はout hitの中にある。
もっと良いやり方や語弊もあるかもしれないが、初心者の私の理解したままを記す。
にしても、このことに気づくまで時間を費やしてしまった。
参考サイト
いつもお世話になるテックさん。
【初心者Unity】Raycastの基本的な使い方(オブジェクトをクリックで取得) | TECH PROjin
この方の記事を何気なく読んでピンときました。
Unity公式
Physics-Raycast - Unity スクリプトリファレンス
Casts a ray, from point origin, in direction direction, of length maxDistance, against all colliders in the Scene.
Physics2D-Raycast - Unity スクリプトリファレンス
Casts a ray against colliders in the Scene.
コメント