【Unity】RayでGameObjectのクリックを検出する方法

unity

部屋の中にスイッチオブジェクトを導入してクリックすると鍵が現れる処理を実装してみました。

すいません、鍵の色が棚と被っており少し分かりづらいGIFになっています。

3Dのモデルは今まで通りSketchUpで作成しています。

鍵を隠しておく

鍵はゲーム開始時には出現しないようにします。

    GameObject key;

    // Start is called before the first frame update
    void Start()
    {
        key = GameObject.Find("Key");
        key.SetActive(false);
    }

SetActiveでfalseにするとフィールドに出現しません。

画面クリック時の処理

まずはスイッチにボックスコライダをセットします。

InspectorのAdd Componentを選択後、Physics➡︎Box Collider

黄色い線がコライダです。

サイズやポジションはスイッチが覆いかぶさる程度に調整します。

次にスクリプトを更新します。

処理の流れとしては以下の通り。

  1. クリックした時にRayで光線を出す
  2. 光線がオブジェクトに当たったらオブジェクトを取得する
  3. オブジェクトがスイッチだったら鍵を出現させる

Unityの世界は3次元ですが、私たちユーザがクリックするのは二次元平面です。

二次元でクリックされた場所を元に、3次元の世界に光線を出すためのクラスがRayです。

今回はこのRayクラスを使ってボタンをクリックしてみます。

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameObject clickedGameObject = null;

            // 光線を飛ばす
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit = new RaycastHit();

            // もし何かに当たったら
            if (Physics.Raycast(ray, out hit))
            {
                // オブジェクトを取得する
                clickedGameObject = hit.collider.gameObject;
            }
            else {
                return;
            }

            // スイッチだったら処理を行う。
            if (clickedGameObject.name == "Switch")
            {
                Debug.Log("switch clicked");
                keyAppear();
            }
        }
    }

keyApperの内容はもうお分かりですね。

falseにした鍵情報をtrueにすれば良いです。

    void keyAppear()
    {
        key.SetActive(true);
    }

おわり。

参考

https://senkouemaki.com/lab/?p=98

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog