【Unity】クリック（タッチ）したオブジェクトを削除する方法2D

# 概要

今回はタッチしたオブジェクトを消すコードを書こうと思います。

ネットサーフィンをしていたらワンピース1000話を記念して[いらすとや](https://www.irasutoya.com/2021/01/onepiece.html)でワンピースコラボをしていました。
せっかくなので登場人物を並べて麦わらの一味をクリックしたら消えるゲームを実装してみようと思います。

## 大まかな流れ

①クリックを検知する。
②rayを飛ばしてオブジェクトに当たるか検知する。
③rayに当たったオブジェクトのタグを検知して、消すべきオブジェクトかどうかを判断する。
④消す。

という流れで麦わらの一味のみをクリックしたらデストロイしていきます。

# 実装
大まかな流れは理解できたと思うので実装していきましょう！
## 下準備
画像を用意して、Unityにダウンロードしましょう。
今回私は冒頭に述べた通り[いらすとやのワンピースコラボ](https://www.irasutoya.com/2021/01/onepiece.html)を使用しました。

ダウンロードしたら[Hierarchy]⇨[2D Object]⇨[Sprites]⇨[Square]で四角いスプライトを配置し、ダウンロードした画像のスプライトを入れていきます。

そして、オブジェクトにコライダーをつけましょう
今回は[Box Collider 2D]を作成しました。

（アラバスタ編までのキャラクターで作成をしました笑）
![スクリーンショット 2022-05-30 16.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2315135/3137ef8c-f557-03cb-1a27-3a6db7e6eeea.png)

## 全体を管理するオブジェクトの生成とスクリプトの作成

[Hierarchy]⇨[createEmpty]で作成し、[DeleteManager]という名前の[createEmpty]を作成しましょう。

そして、[TouchDeleteScript]という名前のスクリプトを作成し、[DeleteManager]に貼り付けます。

## クリックの検知

大まかな流れの①の部分を実装していきます。

クリックの検知は
```c#:TouchDeleteScript
        if (Input.GetMouseButtonDown(0)){

        }
```

で、できます。
ちなみに、()の中の数字は
0⇨左クリック
1⇨右クリック
になるので今回は0にしました。


## rayを飛ばす
大まかな流れの②の部分を実装していきます。

### rayとは
そもそもrayとは光線という意味です。
イメージはビームみたいなものを飛ばして（ビームは通常目には見ることができない）、「ビームが何かに当たったら〜」というようなコードを書くことが多いです。

FPSゲームやタップしたアイテムの取得などによく使用されます。

さらに詳しく知りたい方はぜひ調べてみてください！

### rayを発生させる

今回はクリックした場所にrayを発生させてみましょう。

```c#:TouchDeleteScript
        if (Input.GetMouseButtonDown(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //この行を追加で書いてください
        }
```
このように書くと左クリックをした瞬間にマウスの座標にrayのスタート地点となる座標を指定することができます。

### rayを飛ばして当たったオブジェクトを取得する

上の行ではまだrayを飛ばせていないので飛ばすコードを書きます。
```c#:TouchDeleteScript
     Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction);
```

必要な要素はray.origin(rayの開始地点)とray.direction(rayの向き)のみです。
これでクリックした場所から奥にrayを飛ばすことができます。

これを代入してみましょう

```c#:TouchDeleteScript
        if (Input.GetMouseButtonDown(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hitSprite = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); //この行を追加で書いてください
        }
```

## クリックしたオブジェクトが対象のオブジェクトかどうかを検知する

大まかな流れの③の部分を実装していきます。

### タグの用意
クリックしたら削除したいスプライトにタグをつけていきましょう。
今回は麦わらの一味なので[mugiwara]というタグを麦わらの一味のスプライトにつけました。

### 当たったオブジェクトのタグを確かめる

[hitSprite]が存在した時（rayを飛ばして、オブジェクトに当たった時）に[clickedGameObject]に当たったオブジェクトを代入しましょう。
そして、そのオブジェクトのタグが対象のタグであるかも確かめましょう。
```c#:TouchDeleteScript
        if (Input.GetMouseButtonDown(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hitSprite = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction); 
//ここから下の行を追加で書いてください
                      if (hitSprite == true)
                          {
                             clickedGameObject = hitSprite.transform.gameObject;
                             if (clickedGameObject.tag == "mugiwara")

                          }
       }
```
　以下のように追加で上の方で[clickedGameObject]の変数宣言をしておいてください。
```c#:TouchDeleteScript

  GameObject clickedGameObject;

```

## 削除する

大まかな流れの④の部分を実装していきます。
タグで削除するべきオブジェクトかどうかを判断したらあとはDestroyするだけです。
```c#:TouchDeleteScript
if (Input.GetMouseButtonDown(0))
        {

            clickedGameObject = null;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hitSprite = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction);

            if (hitSprite == true)
            {
                clickedGameObject = hitSprite.transform.gameObject;
                if (clickedGameObject.tag == "mugiwara")
                {
                    Destroy(clickedGameObject);//この行を追加で書いてください
                }
            }
        }
```
## 全体のコード
```c#:TouchDeleteScript

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchDeleteScript : MonoBehaviour
{
    GameObject clickedGameObject;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {

            clickedGameObject = null;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hitSprite = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction);

            if (hitSprite == true)
            {
                clickedGameObject = hitSprite.transform.gameObject;
                if (clickedGameObject.tag == "mugiwara")
                {
                    Destroy(clickedGameObject);
                }
            }
        }
    }
}

```
追加で[clickedGameObject]をnullにするコードを書きました。

これを実行すると以下のように、麦わらの一味だけクリックしたらデストロイすることができると思います。

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2315135/981911e7-9c6c-3296-e10d-8f3d6a17a6d3.gif)

# 完成

これでクリックの検知＆デストロイの実装は完了です。
同じようなやり方で3Dオブジェクトもデストロイできるのでぜひやってみてください！