はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity マウスからRayを打つ ~可視化もするよ~

あいさつ

どうも、はかせです。

今回はマウスの位置からRayを飛ばしてみるのと
その可視化をやってみます。

実行結果

今回はまず先にどういう結果が出るのかからお見せします。
f:id:hakase0274:20191112185207p:plain

画像右にあるGameビューから適当にクリックして
Rayを打ってみました。

画像左にあるSceneビューの
緑色の線が実際に打ったRayになります。

実装

ではコードです。

using UnityEngine;

public class MouseClick : MonoBehaviour
{
    public float DebugDrawRayDistance = 15.0f;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out var hit))  
            {
                string objectName = hit.collider.gameObject.name; 
                Debug.Log("右クリック:" + objectName); 
            }
            Debug.DrawRay(ray.origin, ray.direction * DebugDrawRayDistance, Color.green, 5, false);
        }
        if (Input.GetMouseButtonDown(1))
        {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out var hit))
            {
                string objectName = hit.collider.gameObject.name;
                Debug.Log("左クリック:" + objectName);
            }
            Debug.DrawRay(ray.origin, ray.direction * DebugDrawRayDistance, Color.green, 5, false);
        }
        if (Input.GetMouseButtonDown(2))
        {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out var hit))
            {
                string objectName = hit.collider.gameObject.name;
                Debug.Log("ホイール:" + objectName);
            }
            Debug.DrawRay(ray.origin, ray.direction * DebugDrawRayDistance, Color.green, 5, false);
        }
    }
}

まずInput.GetMouseButtonDown
マウスのボタンが押された瞬間を検出しています。
この関数には引数で0~2の数値を渡します。
0は右クリック、1は左クリック、2はホイール押し込みにそれぞれ対応します。

次にCamera.main.ScreenPointToRay
メインカメラからのRayを生成します。

UnityはCamera.mainMainCameraタグの付いたカメラを取得できます
その後取得したカメラのScreenPointToRayを呼び出します。
この関数の引数にはRayの原点となるピクセル座標を渡します。
今回はInput.mousePositionでマウスのピクセル座標を引数に渡しています。

以上でメインカメラの視点でマウス位置からのRayが生成できました。
あとはいつも通りPhysics.Raycastを使ってRayを打ち結果を得るだけです。

ただこのRayがどう飛んでいるのか頭の計算上では分かっていても
実際に目で見てみたいものです。

そういう時にはDebug.DrawRayを使います。
この関数は5つの引数を取りそれぞれ
①原点
②向きと距離のベクトル
③描画する色

④描画時間(単位:秒)
⑤ラインが他のオブジェクトに隠れた時ラインを隠すか
の値となります。

①②は打ったRayから取得できます。
長さの調節をしたい場合は
②に入れる長さに係数を掛けてあげるといいです。
③④はそのままです。何色で何秒描画するか。
⑤はまどろっこしい書き方ですが、
要は被った時見えるか見えないかという話です。

あとがき

今回はマウス位置からRayを打ちそれを可視化してみました。
マウスを使う探索ゲームやFPSゲームデバッグの際に有用だと思います。
(少なくとも私は使っています)

それでは今回はこの辺でノシ