Unity を使って狙ったところのオブジェクト情報を取得してみた

Grappling Hook でもって、クリックした先にフックを引っ掛けるような動作をさせようとしたときに、自キャラとカーソルの先にあるブロックの情報を取得しようとしてできなかったので、その情報を得るだけのサンプルを作ってみました。

作ろうとしたもの

画面内にブロックをたくさんと自キャラを配置し、自キャラとクリックした位置の先にあるブロックの情報を表示するサンプル。

途中経過

RayCastInformation_blocks

ブロックと自キャラ(緑)を配置した。

RayCastInformation_rays

Game ビューでクリックすると Scene ビューで Debug.DrawRay() の線が描画された。 あ、ここまででブロックには Blocks っていう名前のレイヤーを定義しておいた。

できたもの

動いた。 主なコードは下記の通り。

void Update()
{
  if (Input.GetButtonDown("Fire1"))
  {
     Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - OwnCharacter.transform.position;
     RaycastHit2D hit = Physics2D.Raycast(OwnCharacter.transform.position, direction, Mathf.Infinity, 1 << LayerMask.NameToLayer("Blocks"));
     if (hit)
     {
        Debug.Log(hit.collider);
        Debug.Log(hit.point);
      }

      Debug.DrawRay(OwnCharacter.transform.position, direction, Color.red, 10f);
   }
}

感想、今後の予定

ここまでに勘違いしてたことは

  • Physics2D.RayCast() の2番目の引数は「目的座標」じゃなくて「向き」であるということ。
  • Debug.DrawRay() の内容は Scene ビューにしか表示されないこと。

です。
正しく理解できてよかった。

今回のソースコードは、下記プロジェクトのリポジトリ中の RayCastInformation です。
https://bitbucket.org/satofumi/unity_learning