UnityのDetonatorで爆発させる

  • 50
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

サンプルシーン

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の際のバグにだけ気をつけておけばとても便利に使えるので爆発させまくりましょう。

参考資料