プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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("キューブにヒット!");
                }
            }
        }
    }
}