対象のオブジェクトがクリックされたか調べる(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】クリックしたゲームオブジェクトを取得する
ありがとうございます.