UnityのDetonatorで爆発させる


# サンプルシーン

![sample](https://www.evernote.com/shard/s22/sh/c953d715-f59f-4a1b-ae1e-cb036a9e726e/e9642ebdfdd532370784045f953143ec/deep/0/Main.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)

https://dl.dropboxusercontent.com/u/6626376/Unity/UnityDetonatorSozai.zip

スライド
https://speakerdeck.com/yandod/detonatordebao-fa-shimokita-dot-unity

# Detonatorの概要

Detonatorは無料で利用できる爆発エフェクトのフレームワークです。アセットに含まれるスクリプトなどを使うことで手軽にリッチな爆発エフェクトを利用できます。
またパラメーターを調整する事でかなり細かいカスタマイズを行うことができます。

おおまかには下記の機能を含んでいます。

- 爆発の煙や光、衝撃波といったエフェクトを表示させる
- 爆発の衝撃を物理エンジンを通じて他のオブジェクトに伝える
- 爆発の音を再生する
- 設定や爆発そのものにスクリプトからアクセス可能

画像や音声なども基本的なものは付属しています。素材を入れ替えればよりオリジナリティの高い爆発を実装できます。

# インストール

アセットストアからインストール可能。アカウントが無い場合は作成しておく。

<code>Window > Asset Store</code>でアセットストアを開き、Detonatorで検索し、Importをクリック。

![store](https://www.evernote.com/shard/s22/sh/0d7c2955-2267-489d-8f29-d2ea7a48ca52/bc44d75cc793c9baf74204d4f8ad9272/deep/0/スクリーンショット-2014-06-17-0-06.png)

インポートが完了するとプロジェクトビューにフォルダが作成され、プレハブやスクリプトなどの素材が配置されています。

![sozai](https://www.evernote.com/shard/s22/sh/2f4a209f-47ec-4c82-87ec-484b5f03f617/0db1d0b4a15ca12ac2be7104d112138b/deep/0/Main.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)


|フォルダ|内容|
|---|---|
|Prefab Examples|ステージに配置するとすぐ動作するプレハブ|
|Resources|煙などのテクスチャ|
|Sample Supporting Emitter|爆発をエミッタで拡張した例|
|Sounds|爆発音|
|System|スクリプト本体|
|TestScene|爆発をテストする為のシーン|

とりあえずテストシーンで遊んでもいいが、デモ以上の意味合いは無いので今回は割愛する。

# プレハブで爆発テスト

プレハブとして提供されたオブジェクトはシーンに配置すると即座に爆発する。
またインスペクタから設定の調整も可能。

![prefab](https://www.evernote.com/shard/s22/sh/4a58da89-1311-4f70-aabb-b23aa31ee174/462d0bfe035eb4c00571c301b7f90c1c/deep/0/Main.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)

<code>Detonator-Base</code>を基本として、さまざまなコンポーネントと設定を組み合わせている。プレハブの設定を変更したプレハブを作ったり、プレハブから自分用プレハブを作ってシーンに配置して利用できる。
スタート同時に爆発するのを止めるには<code>Explode on start</code>を外す。

![exp](https://www.evernote.com/shard/s22/sh/70dd700b-e0a8-4be0-9e6a-6ddb0970973a/e0254648df23c61987964329a0a2696e/deep/0/Main.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone-と-UnityのDetonatorで爆発させる-と-Kobito.png)

これだとまったく爆発しないので発火させるスクリプトを作成して設定。

<code>Add Compnent > New Script</code>として下記のスクリプトを設定

```UnityScript:Spaceで発火
#pragma strict

function Update () {

	if(Input.GetKeyDown(KeyCode.Space)){
		this.SendMessage('Explode');
	}

}
```

これでスペースで爆発だ。

http://youtu.be/c55BQRtNtRs
<iframe width="480" height="360" src="//www.youtube.com/embed/c55BQRtNtRs" frameborder="0" allowfullscreen></iframe>


# シンプルな爆発

プレハブを使った爆発以外にも、既存のオブジェクトに爆発を追加することもできる。（おそらくこちらのやり方が本流）
爆発を追加したいゲームオブジェクトのインスペクタから<code>Add Component > Detonator</code>を選択し任意のコンポーネントを追加する。

![add](https://www.evernote.com/shard/s22/sh/d7983227-3cbd-4981-8f09-03a5455d0e4b/37773d39f891bfbb1e895fd437188787/deep/0/UnityEditor.AddComponentWindow-と-Main.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone-と-Facebook-と-UnityのDetonatorで爆発させる-と-Kobito.png)

これによりコンポーネントを設定したオブジェクトが **問答無用で** 爆発する。

Detonatorコンポーネントの各設定項目はつぎのとおり。

![param](https://www.evernote.com/shard/s22/sh/7514d1b7-56c1-44af-a019-30f18e66be34/035ecbfcccecac6034594eba1bc840ef/deep/0/Main.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)

|項目|意味|
|:--|:--|
|Script|DetonatorはCSスクリプトになっている|
|Size|爆発のサイズ、単位はメートル|
|Color|爆風の色|
|Explode On Start|自動的に爆発|
|Duration|爆発の継続時間(秒)|
|Detail|爆発の中心部分の半径|
|Upwards Bias|上方へのバイアス|
|Destroy Time|爆発したオブジェクトが消えるまでの秒数(0で消えない)|
|Use World Space|爆発エフェクトにワールド座標を使う|
|Auto Create Fireball|火球を自動生成|
|Auto Create Sparks|火花を自動生成|
|Auto Create Shockwave|衝撃波を自動生成|
|Auto Create Smoke|煙を自動生成|
|Auto Create Glow|光を自動生成|
|Auto Create Light|明かりを自動生成|
|Auto Create Force|力を自動生成|
|Auto Create Heatwave|熱波を自動生成|

Auto Create Fireballなどの設定項目はそれぞれのコンポーネントを追加してもよいが、Detonatorから自動生成もできる。細かいカスタマイズは個別のコンポーネントを使う。マテリアルなども差し替えができる。


# スクリプトから爆発

爆発を制御するにはプレハブを使った時と同様に<code>Explode On Start</code>を外し、スクリプトからExplodeをコールする。手軽に実行するならば<code>SendMessage</code>が便利。SendMessageは該当のゲームオブジェクトの全てのコンポーネントに指定したメソッドを実行しようとする。
非常に便利だが戻り値を受け取れないので呼び出すだけでよい時に用途は限られる。


```UnityScript:Spaceで発火(SendMessage版)
#pragma strict

function Update () {

	if(Input.GetKeyDown(KeyCode.Space)){
		this.SendMessage('Explode');
	}

}
```

別のコンポーネントを取り出して操作するにはGameObjectのGetComponetメソッドを使う。

```CSharp:Spaceで発火(GetComponent版)
using UnityEngine;
using System.Collections;

public class Exp3Script : MonoBehaviour {

	// Use this for initialization
	void Start () {

	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKeyDown(KeyCode.Space)) {
			this.gameObject.GetComponent<Detonator>().Explode();
		}
	}
}

```

同じやり方でJavaScriptのスクリプトはそのままでは動かない。これはDetonatorがCsharpで書かれており、クラスを読み込めないから。
ただし、言語が異なっていても<code>Standard Assets</code>と<code>Plugin</code>のスクリプトは事前にコンパイルされるので読み込める。Detonatorはこのどちらにも入っていない。

実行時にはメソッドがあるはず！ということで呼び出すのならばstrictチェックを外して対処する。


```UnityScript:Spaceで発火(GetComponent版JS)
function Update () {
	if (Input.GetKeyDown(KeyCode.Space)) {
		this.gameObject.GetComponent('Detonator').Explode();
	}
}
```

# 周りのものを吹き飛ばす

Rigidbodyが付いているオブジェクトは爆発のforceの影響を受ける。樽や車にRigidbodyを付けていく。また重さを設定したりMaterialを設定して納得感のある動きにする。

- 樽のコライダーにWood Phsycis Materialを設定
- 車にRigidbodyを設定し、Massを5に

http://youtu.be/-HHOzIsxzXc

# 音がでる爆発

Detonator Soundをアタッチすれば音が鳴る。

![sound](https://www.evernote.com/shard/s22/sh/89c2a67b-00d4-4cc7-8b7e-c80325c7e4e3/035d4cd19279b66ae02093c4d40e9571/deep/0/Step4.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)

Near SoundsとFar SoundsのSizeを2に設定し、効果音を設定すると距離に応じてランダムに再生される。

![sound](https://www.evernote.com/shard/s22/sh/43865d28-a189-4a1d-ad41-a82ccb18f3f7/c429a3485f85f41a36e57bc100921dca/deep/0/Step4.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)


しかしエラーになる。DetonatorSound.csのバグらしい。下記のコードを<code>override public void Init()</code>の前に入れる。

ここをダブルクリック

![sound](https://www.evernote.com/shard/s22/sh/fcb678d8-334e-4e06-a2f3-fd0ad5c90d54/5498bedd087f999d10b95863f1b9a9c9/deep/0/Step4.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)



```
void Awake()
{
    Init();
}
```

これでエラーも消えて音がなる！

http://youtu.be/6yH5xOW1q8c

### ライブラリを修正しない方法を思いついた

下記のスクリプトを作成し、DetonatorSoundの変わりに使えばバグフリーで同じ使い勝手になる。


```CSharp:DetonatorSoundP.cs
using UnityEngine;
using System.Collections;

public class DetonatorSoundP : DetonatorSound {

	// need to call Init from Awake to use this component without Explode On Start setting.
	void Awake()
	{
		Init();
	}

}
```

# 破片が飛ぶ爆発

Object Spraysを使うと破片をばらまくことができる。<code>Add Component > Detonator > Object Sprays</code>で設定。

![](https://www.evernote.com/shard/s22/sh/83f56836-6d67-4285-a393-97253be25760/748d66fba6ea05b3dca4bd189b4b1bc7/deep/0/Step4.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)

<code>Spray Object</code>に破片としてバラマキたいGameObjectを設定する。あとはパラメータを調整すれば様々な破片を散布できる。

![](https://www.evernote.com/shard/s22/sh/837a4e8f-0180-44f8-a8f0-88c83da42259/6a2f2b3494f70ee59f687be7e8205c4b/deep/0/Step4.unity---UnityDetonator---PC,-Mac-&-Linux-Standalone.png)


次のようなスクリプトにすれば破片をまき散らす際に元のオブジェクトを非表示に切り替える。

```UnityScript:爆発して非表示
#pragma strict

function Update () {

	if(Input.GetKeyDown(KeyCode.Space) && renderer.enabled){
		this.SendMessage('Explode');
		renderer.enabled = false;
	}

}
```

http://youtu.be/QzlqoHEWvbg

# まとめ

Detonatorはとても強力なアセット。C#で作られている点とSoundの際のバグにだけ気をつけておけばとても便利に使えるので爆発させまくりましょう。

参考資料

- [How to use Explosion/Detonator Framework - Unity Answers](http://answers.unity3d.com/questions/152878/how-to-use-explosiondetonator-framework.html)