あいさつ
どうも、はかせです。
今回はマウスの位置からRayを飛ばしてみるのと
その可視化をやってみます。
実行結果
今回はまず先にどういう結果が出るのかからお見せします。
画像右にある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.mainでMainCameraタグの付いたカメラを取得できます。
その後取得したカメラのScreenPointToRayを呼び出します。
この関数の引数にはRayの原点となるピクセル座標を渡します。
今回はInput.mousePositionでマウスのピクセル座標を引数に渡しています。
以上でメインカメラの視点でマウス位置からのRayが生成できました。
あとはいつも通りPhysics.Raycastを使ってRayを打ち結果を得るだけです。
ただこのRayがどう飛んでいるのか頭の計算上では分かっていても
実際に目で見てみたいものです。
そういう時にはDebug.DrawRayを使います。
この関数は5つの引数を取りそれぞれ
①原点
②向きと距離のベクトル
③描画する色
④描画時間(単位:秒)
⑤ラインが他のオブジェクトに隠れた時ラインを隠すか
の値となります。
①②は打ったRayから取得できます。
長さの調節をしたい場合は
②に入れる長さに係数を掛けてあげるといいです。
③④はそのままです。何色で何秒描画するか。
⑤はまどろっこしい書き方ですが、
要は被った時見えるか見えないかという話です。