Edited at

UnityのDetonatorで爆発させる

More than 5 years have passed since last update.


サンプルシーン

sample

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

スライド

https://speakerdeck.com/yandod/detonatordebao-fa-shimokita-dot-unity


Detonatorの概要

Detonatorは無料で利用できる爆発エフェクトのフレームワークです。アセットに含まれるスクリプトなどを使うことで手軽にリッチな爆発エフェクトを利用できます。

またパラメーターを調整する事でかなり細かいカスタマイズを行うことができます。

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


  • 爆発の煙や光、衝撃波といったエフェクトを表示させる

  • 爆発の衝撃を物理エンジンを通じて他のオブジェクトに伝える

  • 爆発の音を再生する

  • 設定や爆発そのものにスクリプトからアクセス可能

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


インストール

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

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

store

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

sozai

フォルダ
内容

Prefab Examples
ステージに配置するとすぐ動作するプレハブ

Resources
煙などのテクスチャ

Sample Supporting Emitter
爆発をエミッタで拡張した例

Sounds
爆発音

System
スクリプト本体

TestScene
爆発をテストする為のシーン

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


プレハブで爆発テスト

プレハブとして提供されたオブジェクトはシーンに配置すると即座に爆発する。

またインスペクタから設定の調整も可能。

prefab

Detonator-Baseを基本として、さまざまなコンポーネントと設定を組み合わせている。プレハブの設定を変更したプレハブを作ったり、プレハブから自分用プレハブを作ってシーンに配置して利用できる。

スタート同時に爆発するのを止めるにはExplode on startを外す。

exp

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

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


Spaceで発火

#pragma strict

function Update () {

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

}


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

http://youtu.be/c55BQRtNtRs


シンプルな爆発

プレハブを使った爆発以外にも、既存のオブジェクトに爆発を追加することもできる。(おそらくこちらのやり方が本流)

爆発を追加したいゲームオブジェクトのインスペクタからAdd Component > Detonatorを選択し任意のコンポーネントを追加する。

add

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

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

param

項目
意味

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から自動生成もできる。細かいカスタマイズは個別のコンポーネントを使う。マテリアルなども差し替えができる。


スクリプトから爆発

爆発を制御するにはプレハブを使った時と同様にExplode On Startを外し、スクリプトからExplodeをコールする。手軽に実行するならばSendMessageが便利。SendMessageは該当のゲームオブジェクトの全てのコンポーネントに指定したメソッドを実行しようとする。

非常に便利だが戻り値を受け取れないので呼び出すだけでよい時に用途は限られる。


Spaceで発火(SendMessage版)

#pragma strict

function Update () {

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

}


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


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で書かれており、クラスを読み込めないから。

ただし、言語が異なっていてもStandard AssetsPluginのスクリプトは事前にコンパイルされるので読み込める。Detonatorはこのどちらにも入っていない。

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


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

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

sound

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

ここをダブルクリック

sound

void Awake()

{
Init();
}

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

http://youtu.be/6yH5xOW1q8c


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

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


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を使うと破片をばらまくことができる。Add Component > Detonator > Object Spraysで設定。

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

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


爆発して非表示

#pragma strict

function Update () {

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

}


http://youtu.be/QzlqoHEWvbg


まとめ

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

参考資料