機械系大学生の修行ログ

sh-lu0's Tech Blog

アイドルが力をくれる

対象のオブジェクトがクリックされたか調べる(2D)

RayCastとは

Rayとは「画面から無限の奥までまっすぐに貫く光線」
クリックした位置から無限大の奥までRayを発射して,このレーザービームがゲームオブジェクトを貫いているかどうかを調べることで,クリックされたかどうか判断できる.これを「Rayを飛ばす」というらしい.

対象のオブジェクトをタッチしたときだけ処理するスクリプト(2D)

  • 対象のオブジェクトにスクリプトをアタッチ
  • 対象のオブジェクトに2Dコライダーを追加
  • タッチ判定の範囲を広げたかったらコライダーを変更する

対象のオブジェクトがタッチされると小さくなるスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayTest : MonoBehaviour {

    GameObject clickedGameObject;
    Vector2 smlSize;

    void Start(){
        smlSize = new Vector2(0.5f, 0.5f);
    }

    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {

            clickedGameObject = null;

            //指定の位置から発射されるRayを作成
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //Rayとオブジェクトの接触を調べる
            RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction);

            //接触してたらオブジェクトを小さくする
            if (hit2d)
            {
                clickedGameObject = hit2d.transform.gameObject;
                hit2d.transform.localScale = smlSize;
            }

            Debug.Log(clickedGameObject);
        }
    }

}

上のコードだと,スクリプトをアタッチしたオブジェクトの他にも2Dコライダーを持っているオブジェクトを感知してしまった.
接触してるかどうかを判別するコードを以下に変更

if (hit2d && clickedGameObject.name=="オブジェクト名")

詰まった点

  • Physics.Raycastは3Dでしか使えない→Physics2D.Raycast
  • 2DではRayが引数にできない
  • 3DではRaycastHitを参照渡しだったが,2Dだと返り値自体がRaycastHit2D

初心者本はInput.GetMouseButtonDownだけの例が多くて,どのオブジェクトがタッチされたかの判別はどうするんだ〜〜から「Rayを飛ばす」という言葉に出会って,2Dの書き方に変更するまでちょっと時間かかった.

参考にしたサイト

Physics2D.Raycast - Unity スクリプトリファレンス
RayCastその4、Raycastを2Dで使う【Unity】 - (:3[kanのメモ帳]
【Unity】クリックしたゲームオブジェクトを取得する
ありがとうございます.