Unity3D 【詳細】Physics.RayCast
■Unity3Dの「Physics.RayCast」について使い方を基本的なところから詳しく解説する
「Physics.RayCast」って?
⇒スマホをタップ(PCの場合はクリック)した際の位置を取得して、オブジェクトを操作したりする際に使うもの
※以後、「タップ」と標記するがPCの場合はクリックと代読
・まずはタップした位置の取得方法から
Vector3型の「Input.mousePosition」を使う
Vector3 pos = Input.mousePosition;
但しこれはローカル座標であることを理解しておく
※カメラから見た位置でSCENEの絶対座標(グローバル座標もしくはワールド座標)ではないということ
・グローバル座標を取得する場合は「Camera.main.ScreenToViewportPoint(<タップした位置 ※ローカル座標>)」を使う
Vector3 pos = Input.mousePosition;
Vector3 worldPos = Camera.main.ScreenToViewportPoint(pos);
・「Ray」って?
⇒「Ray」はタップした地点から奥に伸びる光線(直線)のようなもの
「Camera.main.ScreenPointToRay(<タップした位置 ※ローカル座標>)」でタップした位置からRayを飛ばす
Vector3 pos = Input.mousePosition;
Ray ray = Camera.main.ScreenPointToRay(pos);
・「Physics.RayCast」を使って「Ray」でスマホをタップした際の位置を取得して、オブジェクトとの当たり判定を取得
「Physics.Raycast(ray, out <RaycastHit>, 長さ)」で取得する
Vector3 pos = Input.mousePosition;
Ray ray = Camera.main.ScreenPointToRay(pos);
RaycastHit hit;
bool isBool = Physics.Raycast(ray, out hit, 100f);
※「hit」にPhysics.Raycastメソッドの結果が代入される
・キューブをタップした際にデバッグログに表示する方法
※予め「Cube」のGameObjectを作成してスクリプトをアタッチしておく
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// タップ時
if (Input.GetMouseButtonDown(0)) {
// タップしたローカル座標を取得し、Ray型の変数rayにセット
Vector3 pos = Input.mousePosition;
Ray ray = Camera.main.ScreenPointToRay(pos);
// RaycastHit型の変数を宣言
RaycastHit hit;
// タップした箇所がオブジェクトにヒットした場合 ※100fで奥行(Z軸)100までrayを飛ばしている
if (Physics.Raycast(ray, out hit, 100f)) {
// ヒットしたオブジェクトがこのスクリプトに紐づけたキューブだった場合
if (hit.collider.gameObject == this.gameObject) {
// デバッグログに「キューブにヒット!」と出力
Debug.Log("キューブにヒット!");
}
}
}
}
}