Unity チュートリアル#3 プレファブと当たり判定

# #3 プレファブと当たり判定

前回はコンポーネントの追加とスクリプトを記述し、Playerを動かせるようにしました。
今回はさらに、プレファブという概念を用いて、コインをコース上に複数配置し、コインを集められるようにしたいと思います。


### 目次
- [ダウンロード&スタート](https://qiita.com/kikpond15/items/4cb0f22eaa4bc9c1fca9) 
- [オブジェクトとマテリアル](https://qiita.com/kikpond15/items/715fda048755406fdd73)
- [コンポーネントとスクリプト](https://qiita.com/kikpond15/items/b29373a0d84ef0ec36e5)　
- **プレファブと当たり判定　←今ここ**
- [UI](https://qiita.com/kikpond15/items/80239c6c182c826f7436)
- [シーンの追加](https://qiita.com/kikpond15/items/c54647397724edbeb1b3)

## プレファブ
プレファブとは、簡単にいうとオブジェクトのコピーを作成する仕組みのことです。
コースを作成する際に、Cubeをヒエラルキーから1つずつ追加しましたね。
あの方法だと、何も機能を持たないまま生成されてしまうので、同じ機能を複数持たせたい場合など、全てのオブジェクトにアタッチするのは少し面倒です。

そこで、1つのオブジェクトに複数の機能を持たせた状態でプレファブ化することによって、同じ機能を持ったコピーをいくつも作成することが可能になるのです。とても便利ですね。

では早速コインを1つ作り、プレファブ化して見ましょう。
今回は簡易的に、3D Objectの**Cylinder**に黄色のマテリアルをつけたものをコインにします。
大きさと角度を調節して、コインぽくしましょう。

![スクリーンショット 2022-05-08 15.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/9c3fcaf2-f387-5a46-f470-948b9a2a8056.png)


さらに、スクリプトを加えて、回転するようにします。スクリプト名は**CoinMove**にし、下記のコードを書き込んでみましょう。

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoinMove : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(new Vector3(0,0,1));
    }
}
```


上記のコードでは、Z軸が縦になっているときに、Z方向に回転を加えることで、コインが横回転しているように見えます。縦軸が異なる場合は縦軸に合わせて、Rotateの数値を変更しましょう。打ち込めたら、Cylinderにスクリプトをアタッチしましょう。

これで最初のCylinderに、マテリアルとスクリプトの機能を持たせたオブジェクトが完成しました。
それでは、このオブジェクトをプレファブ化したいと思います。
方法は簡単です、ヒエラルキーのCylinderをプロジェクトにドラックするだけです。
プロジェクトに追加されたCylinderプレファブのインスペクターを見てみると、先ほど追加したマテリアルと、スクリプトが追加されているのが確認できます。

![スクリーンショット 2022-05-09 15.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/5affb99c-7f19-0dc5-eb38-292d6fb3ced6.png)


## スクリプトによる当たり判定
それでは、先ほど作成したコインをPlayerが触れたら、ゲット(消える)ようにしたいと思います。

それでは、前回作成した**PlayerMove.cs**を開いて、下記のコードを追加して見ましょう。

```cs
void Update()
{
	〜
}
//ここから追加
private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.tag == "coin")
    {
        Destroy(collision.gameObject);
    }
}

```

- **OnCollisionEnter(Collision collision)**  
Colliderコンポーネントを持つオブジェクト通しが触れた時に作動する(collisionには触れた相手の情報が入っている)
- **if (collision.gameObject.tag == "coin")**  
もし、触れた相手(collision)のオブジェクトの**Tag**が**"coin"**だったら
- **Destroy(collision.gameObject);**  
当たった相手のオブジェクトを削除する


コードを打ち込んだら、次にCylinderプレファブのインスペクターから**Tag**の設定を行います。
**Tag > Add Tag...**をクリックします。 
![スクリーンショット 2022-05-09 15.28.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/c902ea3d-ca64-e488-2770-d61beb7961b6.png)


＋マークをクリックし、New Tag Nameに**coin**と入力し、Saveボタンを押します。
![スクリーンショット 2022-05-09 15.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/03b2f5a4-df25-53f5-cbf6-a20b1472e6cf.png)


そして、再度CylinderプレファブのインスペクターからTagを開くと、coinが追加されているので、クリックしてダグを設定します。
![スクリーンショット 2022-05-09 15.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/41f999cb-33db-a9b5-2bb9-2f9f0907697a.png)


これで、Playerがcoinタグを持ったオブジェクトに触れる事で、coinタグを持ったオブジェクトを消す事ができます。それでは、先ほど作成したCylinderプレファブをシーン画面にドラックして、コース上の好きな位置に配置してみましょう。
![スクリーンショット 2022-05-09 16.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/02fff48c-3b0e-3087-a6b3-d4bb5aa8c27c.png)


これで、毎回マテリアルやスクリプトを追加する手間が省けました。ちなみにスクリプト内からでもプレファブ化したオブジェクトをシーンに追加することも可能です。


次のステップはこちら、[＃4UI](https://qiita.com/kikpond15/items/80239c6c182c826f7436)