Unity備忘録49頁目「Raycastで3D空間をクリック」

江上宿六です。

 

どうでも良い話、目の前に明確な目標がある時ほどサボりがちです。

今でいうとキャラセレクトとか発言とかではなく、ゲーム本編とか。

やろうと思った時に一気にやるのが好きというか、謎のスタイル。

 

さて今回は新たに進めてきた中で是非とも覚えておきたいというか

記録しておきたい事をまとめて記しておこうという感じのやつ、でしたが

いきなり長くなったのでまずはRay単品にしておきます。

 

Rayというのは光線の事です。 主な用途はクリックの判定でしょう。

他の使い道はさておき、3D空間上のものをクリックして制御するのであれば

Rayを使ってカメラからクリックした方向に光線を放ち、オブジェクトとの

当たり判定を行うという風にするのが良いのだと思います。

void Update()

{

    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 10.0f)) {
            Debug.Log(hit.collider.gameObject.transform.position);

        }
        Debug.DrawRay(ray.origin, ray.direction * 10.0f, Color.red, 5);
    }

}

Update内で左クリックした時の処理です。

ScreenPointToRayを使ってカメラ位置からクリックした位置へ向かう光線を

生成してRayに入れています。 それをRaycastHitを使って判定しています。

 

if文は10.0fの距離内にこのRayと重なるColliderがあるかを判定していて

あった場合はそのオブジェクトの位置をデバッグに表示するようになっています。

そして下のDrawRayはRayを描画してくれます、多分Sceneタブの方に。

f:id:y6yegami:20220324213903p:plain

こんな感じでカメラから光線を発射して3D空間上のオブジェクトに干渉を

しているわけですが、上記のやつだと一番最初に重なったものに対して

操作を行うようになってますけど、奥にあるものとかが選べなかったり

ゲーム的には難があったりするので現実的にはRayと重なったものすべてを

取得して、必要なものに対して判定を行う事になると思います。

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        foreach (RaycastHit hit in Physics.RaycastAll(ray))
        {
            Debug.Log(hit.collider.gameObject.transform.position);
        }

foreachとRaycastAllを使ってRayと重なったものすべてを取得する感じです。

この取得されたものの中から、例えばキャラだったりそうじゃないオブジェクトを

タグなどを使って判別して処理を行えば欲しい結果が得られそうです。

 

現に自分の場合ではポーカーテーブルと重なっているキャラをクリックして

選択するのに活用されています。

 

そんな感じです。

これをカメラが複数あった場合だとそれぞれどういう風に位置を指定すれば

良いのかは調べていませんけど、やろうと思えばそういうのも出来るでしょうね。

 

あと記しておきたいのはTextMeshProの事とか、リストとか配列とかの

Elementの名前の変更方法とか、classをインスペクターでいじれるように

する方法とかそんな感じかな、意外と多くなかった。