i-school - Rayによるクリック(タップ)判定の方法

Updateメソッドを使用する方法(未)

void Update() {
    //クリックされたら
    if (Input.GetMouseButtonDown(0)) {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        // オブジェクトを取得
        RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction);

        //何かしら取得でき、それが自分自身だったら
        if(hit2d && hit2d.transform.gameObject == this.gameObject) {
            // 処理を実装    
        }
    }
}

OnTriggerStay2Dメソッドを使用する方法


void OnTriggerStay2D(Collider2D col) {
        
    // クリック時イベント
    if (Input.GetMouseButtonUp(0)) {
        // このゲームオブジェクトがタッチされたらRayを発射
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit2D hit2d = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction);
        if (hit2d && hit2d.collider.gameObject == this.gameObject) {
            // Debug.Log("検知!");
            // SetActiveをOFFに
            this.gameObject.SetActive(false);
        }
    }
}

応用

ClickManagerを作成して、画面内のゲームオブジェクトへのタップ情報を管理する

 複数のゲームオブジェクトにそれぞれタップによる当たり判定を用意するは大変な作業です。
そこで管理用のクラスを1つ作成し、これがゲーム内におけるタップを判定し、指定したゲームオブジェクトに対して命令を出すような仕組みに変更をします。

 利点としては、Raycastによる判定処理を1つのクラス内にまとめることにより、複数のクラスに同じ処理を何回も書く手間と無駄が省けることです。

タップされるゲームオブジェクトには共通の親クラスをアタッチすることで、メソッドの呼び出しに自動的に多態性を持たせる

 またゲームオブジェクトには共通のクラス(親クラス分)をアタッチしておくことにより、親クラスを指定することで自動的に子クラスのメソッドへ分岐を作成できます。