[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック

#この解説は
Unityのサイトに昔からあるチュートリアルに、以下があります。
[「はじめてのUnity」(旧）
http://tutorial.unity3d.jp/archive/my-first-unity/](http://tutorial.unity3d.jp/archive/my-first-unity/)
これを独自にC#化したものをベースとしています。以下を
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。現時点(20151026)では、[新しい「はじめてのUnity」の玉転がしゲーム](https://github.com/unity3d-jp/FirstTutorial/wiki)が公開されています。本サイトのブロック崩しと併せて学習すると広がりがあり、初期の学習にはとても有効です。


* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置](http://qiita.com/JunShimura/items/cbb0db8087a5cc75735e)
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(2)色を変える](http://qiita.com/JunShimura/items/1b2b4842e983022075de )
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(3)動くボール](http://qiita.com/JunShimura/items/dfb2bdbbc328869f62ec )
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(4)ラケットを動かす]
(http://qiita.com/JunShimura/items/5fac20966bba6b223427)
* [__[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック__](http://qiita.com/JunShimura/items/867179092a2a564bc88c)
*  [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(6)ブロックを手作業で並べる](http://qiita.com/JunShimura/items/1f39e52414171c67bc71)

#消えるブロック
「ブロック崩し」ですから、ブロックが在って消えないとはじまりません。ブロックを配置し`Ball`と衝突すると消えるようにしましょう。

##ブロックを配置する
先ずはブロックを用意します。
上に在るメニューの[GameObject]>[3D Object]>[Cube]を選んで下さい。
[![Gyazo](https://i.gyazo.com/a401d69d2a423a3aeae5e24ca6d826ac.gif)](https://gyazo.com/a401d69d2a423a3aeae5e24ca6d826ac)

名前を他と迷わないよう、`Block`にしておきます。
[![Gyazo](https://i.gyazo.com/3abd5de0c355852273cf220321984b5b.png)](https://gyazo.com/3abd5de0c355852273cf220321984b5b)

###大きさを考える
次に、どう配置するかを考えます。今回のステージの枠の内側は、`TopWall`の幅と一致していますから、`Scale`で10の幅が在ります。
[![Gyazo](https://i.gyazo.com/4a030f3069dc30fda3a95af5ec4b946a.png)](https://gyazo.com/4a030f3069dc30fda3a95af5ec4b946a)

ここにきれいに`Block`を並べたいので、整数で割り切れる大きさが望ましいことになります。ここでは判りやすい大きさとして、横の幅を`2`とし、横に5個を並べることにします。縦はとりあえず、そのまま`1`にしておきましょう。
[![Gyazo](https://i.gyazo.com/1644841b907659a937c2aa5e692a588f.png)](https://gyazo.com/1644841b907659a937c2aa5e692a588f)

###位置を考える
`Block`をステージの左上に一つ、配置してみましょう。このとき、`Block`の座標をいくつにするかを考えます。中心点は以下になっています。

* 左右の中心点は、幅=`2`なので左から`1`のところ
* 上下の中心点は、高さ=`1`なので0.5のところ

ステージの端の角は、(-5,0,9.5)のところに在ります。ここに`Block`をぴたりとおさめるには、その座標から中心点のオフセットを加算したところを、`Transform`の`Position`にすればいいことになります。
以上から、設定する値は、以下になります。

|座標|値|
|:--|:--|
|`Position.x`|-5+1=-4|
|`Position.y`|0|
|`Position.z`|9.5-0.5=9.0|

[![Gyazo](https://i.gyazo.com/bf2453165aada01a1d26d7e4f49abaec.png)](https://gyazo.com/bf2453165aada01a1d26d7e4f49abaec)

[![Gyazo](https://i.gyazo.com/a454290ffcc141f61bddb3aa5dea4c28.png)](https://gyazo.com/a454290ffcc141f61bddb3aa5dea4c28)

##`Ball`と衝突すると消えるようにする
消えるようにするには、当たり判定で相手が`ball`のときに消える、という動作になります。相手を判断する方法と、消える部分の制作をします。

###`Ball`に`Tag`を入れる
当たり判定で反応したときに、その当たった相手が何かを判定するのによく用いられるのが`Tag`です。`Tag`はProject毎に設定できる、`GameObject`に付与するキーワードです。同じ`Tag`を複数の`GameObject`に付与することが可能です。
先ず、`Tag`の一覧に`Ball`を追加します。
[Inspector]タブの`Tag`のところで`Untagged`をクリックして出るプルダウンから、`Add tag...`を選びます。
[![Gyazo](https://i.gyazo.com/bca20b8ed51b0890fa96c59f747edf9c.gif)](https://gyazo.com/bca20b8ed51b0890fa96c59f747edf9c)

出てきたTagの一覧の左にある'+'をクリックし、出てきた空欄に`Ball`を追加します。

[![Gyazo](https://i.gyazo.com/bc87ca91aa326c6c6f2593354c649d19.gif)](https://gyazo.com/bc87ca91aa326c6c6f2593354c649d19)

[![Gyazo](https://i.gyazo.com/0da22972509d807ca863bb0058dd1394.png)](https://gyazo.com/0da22972509d807ca863bb0058dd1394)

これで`Ball`という`Tag`が使えるようになりました。

`Ball`を再度選択します。その状態で[Inspector]タブの`Tag`のプルダウンを選ぶと、`Ball`が現れるのでそれを選択します。
[![Gyazo](https://i.gyazo.com/52bd80247e97454c4e99ed2e012aad90.gif)](https://gyazo.com/52bd80247e97454c4e99ed2e012aad90)

[![Gyazo](https://i.gyazo.com/d3340212b69fa21accd1f17fcb907718.png)](https://gyazo.com/d3340212b69fa21accd1f17fcb907718)

###`Block`が`Ball`と当たると消える処理の追加

上記の`Tag`を用いて、`Block`側で当たり判定を用意し、`Ball`との当たり判定の処理を加えます。

####`Block.cs`を作成しコンポーネントに追加
`Block`を選択した状態で、インスペクターの一番下にある[Add compornent]をクリックして、Scriptアセットを作成、追加します。

* ファイル名は`Block`と入力してください。
* ファイル形式は`cs`を選びます。

[![Gyazo](https://i.gyazo.com/5cdc2386c308511e22131e5f9445a3ea.gif)](https://gyazo.com/5cdc2386c308511e22131e5f9445a3ea)

[Create and Add]のボタンを押すと、`Block.cs`が[Asset]タブにできています。
[![Gyazo](https://i.gyazo.com/bdc23e1338712b6bd6abec8fe1b01f88.png)](https://gyazo.com/bdc23e1338712b6bd6abec8fe1b01f88)

####衝突判定の処理を入れる
`Block.cs`をダブルクリックし、編集します。

```csharp:Block.cs
using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
    void OnCollisionEnter(Collision collision) {
        //衝突判定
        if (collision.gameObject.tag == "Ball") {
            //相手のタグがBallならば、自分を消す
            Destroy(this.gameObject);
        }
    }
}
```

内容を解説します。

|`code`|説明|
|:--|:--|
|`void OnCollisionEnter(Collision collision) {`|`Scene`中の`Gameobject`でColliderが有効な物同士が衝突すると呼び出される関数です。ぶつかった相手の情報は`collosion`に入ってきます。つまり、この関数の中ではcollisionを調べると、相手が判ります。|
|`if (collision.gameObject.tag == "Ball") {`|相手の`gameObject`の持っている`tag`の内容が`"Ball"`かを確認します。|
|`Destroy(this.gameObject);`|`Destroy`関数は、引数で指定されたGameObjectを`Scene`から消去します。|

くわしくは、以下を参考にして下さい。

* [Unity - スクリプトリファレンス　 OnCollisionEnter　http://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.OnCollisionEnter.html](http://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.OnCollisionEnter.html)
* [Unity - スクリプトリファレンス GameObject.tag http://docs.unity3d.com/ja/current/ScriptReference/GameObject-tag.html](http://docs.unity3d.com/ja/current/ScriptReference/GameObject-tag.html)

これで衝突すると消える`Block`になりました。`Block`になかなか衝突しない場合は、実行中に`Block`を[Inspector]タブで`Transform`の値を変えて、ぶつかりやすくしてみましょう。

***
#まとめ

* 衝突は`Scene`にある`Collider`コンポーネント同士で検出し、`OnCollisionEnter`が呼び出される
* 衝突した相手を判定するには、`tag`で判定する方法がある
* `Destoroy`関数で、`Scene`中の`gameObject`を消すことが出来る

***
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。

* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置](http://qiita.com/JunShimura/items/cbb0db8087a5cc75735e)
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(2)色を変える](http://qiita.com/JunShimura/items/1b2b4842e983022075de )
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(3)動くボール](http://qiita.com/JunShimura/items/dfb2bdbbc328869f62ec )
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(4)ラケットを動かす]
(http://qiita.com/JunShimura/items/5fac20966bba6b223427)
* [__[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック__](http://qiita.com/JunShimura/items/867179092a2a564bc88c)
*  [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(6)ブロックを手作業で並べる](http://qiita.com/JunShimura/items/1f39e52414171c67bc71)