パーティクルシステムの使い方
車両から出る排気煙

シンプルな爆発

パーティクルシステムを使用することでリアルな爆発を引き起こすことができますが、力学的には、最初に見るものよりももう少し複雑です。そのコアから、爆発で粒子が外側に飛び散ります。しかし、それをはるかにリアルに見えるようにするためには、簡単な修正がいくつか必要です。

 開発中のパーティクルシステムによる爆発
開発中のパーティクルシステムによる爆発

粒子のタイムライン

シンプルな爆発は、全方向へ急速に飛散する炎のボールを生成します。初期の飛散には多くのエネルギーがあり、非常に熱く(明るく)、高速に動きます。このエネルギーは、すぐに炎の拡大と冷却(明るさを失う)の後、消散します。最後に、すべての燃料が消費され、炎の勢いは次第に弱まり、やがて消滅します。

爆発する粒子の寿命は短いですが、その寿命の間でいくつかの特性を変化させることでエフェクトをシミュレートできます。粒子は非常に高速で移動するところからスタートしますが、それは爆発の中心から離れるにつれて、その速度を大幅に減らす必要があります。また、色は始め明るくなければなりませんが、その後暗くなり、最終的には透明になっていきます。最後に燃料が使い果たされるように、粒子サイズを小さくすると、その寿命にわたって分散している炎に影響を与えます。

実装

デフォルトのパーティクルシステムオブジェクトから始め  (menu: GameObject > Create General > Particle System)、 Shape モジュールに移動し、emitter shape を small Sphere に設定し、半径を約 0.5ユニットにします。爆発のために非常に適している Fire Add と呼ばれるマテリアルが標準アセットの中の粒子に含まれています (menu: Assets > Import Package > Particles)。 レンダラー_モジュールを使用してシステムに、このマテリアルを設定することができます。 Renderer_ 開いた状態で、Cast ShadowsReceive Shadows を無効にする必要があります。なぜなら、爆発の炎がそれを受けるのではなく、光を放つことになってるからです。

この段階では、システムは、中心点から投げられるたくさんの小さな火の玉のように見えます。爆発はもちろん、すべて一度に多くの粒子のバーストを作成する必要があります。Emission モジュールにおいて、Rate 値を 0 に設定することと、時間 0 での粒子の単一の Burst を追加できます。バーストの中の粒子の数は、爆発させたい大きさや強度に依存しますが、よい出発点は約50の粒子です。バーストをセットアップすると、システムが今、ずっと似たような爆発に見え始めますが、むしろ遅くて、炎は長い時間、まわりをうろついているように見えます。(GameObject として同じ名前をもつ、例えば、“Explosion” )Particle System モジュールでは、system の Duration と particles の Start Lifetime の両方を2秒に設定してください。

それらの燃料を使いきって、炎のエフェクトを作成するための Size Over Lifetime モジュールを使用することができます。“ramp down” プリセットを使用してサイズカーブを設定します(すなわち、サイズは100%で始まり、0 まで減少します)。炎を暗く、薄れさせていくためには、Color Over Lifetime モジュールを有効にし、右側で黒で終了する勾配を設定してください。Fire Add マテリアルの用途やレンダリングのための付加的なシェーダーから、カラープロパティーのダークネスもまた、粒子の透明度を制御します; 色は黒に薄れ、炎は完全に透明になります。また、付加するマテリアルは、粒子の明るさを互いの上に描くように、一緒に粒子の明るさを “add” することができます。これは、粒子すべてが一緒に近い時に、爆発の開始時の明るいフラッシュの印象をさらに高めるのに役立ちます。

現状では、爆発ははっきりとした形をとっていますが、それは宇宙で起こっているかのように見えます。粒子は投げ出され、衰える前に、一定の速度で長い距離を進みます。ゲームが宇宙に設定されているならば、これは望んでいる正確なエフェクトかもしれません。しかし、大気中で起こる爆発は、周囲の空気によって、遅くなり、減衰します。Limit Velocity Over Lifetime モジュールを有効にし、Speed をおよそ3.0に、Dampen フラクションをおよそ0.4に設定し、それが進捗するにつれて爆発が少し力を失うのを見るべきです。

注意すべき最後の事は、粒子が爆発の中心から離れて移動すると、それら個々の形状がより認識できるようになるということです。具体的には、同じ大きさ、かつ同じ回転をするすべて粒子を見ると、同じグラフィックが各粒子に再利用されていることが明らかになってしまいます。これを回避する簡単な方法は、生成された粒子のサイズおよび回転にランダムに変化させたビットを追加することです。インスペクターの上部にある Particle System モジュールで、Start SizeStart Rotation プロパティーの右側にある小さな矢印をクリックして、その両方を Random Between Two Constants にセットしてください。回転の場合、0と360の二つの値を設定します(つまり、完全にランダムな回転)。サイズについては、非常に多くの巨大な、または小さな粒子を持つリスクなしで、いくつかのバリエーションを与えるために0.5と1.5に値を設定してください。これで、現在、粒子グラフィックの繰り返しが、非常に目立たないように表示されるはずです。

使用方法

テストの間、繰り返し爆発を見ることができるように、Looping プロパティーのスイッチを入れておくことは役に立ちます。しかし、完成したゲームにおいて、爆発が一度だけ起こるように、このスイッチを切らなければなりません。爆発する可能性があるオブジェクト(燃料タンク、と言います)のために爆発を設計されている場合は、無効にされてる Play On Awake プロパティーのオブジェクトに Particle System コンポーネントを追加したいかもしれません。それ後、必要に応じてスクリプトから爆発をオフに設定することができます。

    void Explode() {
        var exp = GetComponent<ParticleSystem>();
        exp.Play();
        Destroy(gameObject, exp.duration);
    }

他のケースでは、爆発の衝撃の地点で起こります。爆発がオブジェクトに由来する場合(例えば、手榴弾)、時間遅延の後、あるいは、それがターゲットと接触したときに上記で詳述した Explode 関数を呼び出すことができます。

    // Grenade explodes after a time delay.
    public float fuseTime;

    void Start() {
        Invoke("Explode", fuseTime);
    }



    // Grenade explodes on impact.
    void OnCollisionEnter(Collision coll) {
        Explode();
    }

爆発が、実際のゲームにおいて表されないオブジェクト(eg、例えば、非常に速く移動する発射体)から来て、ちょうど適切な場所で爆発をインスタンス化することができます。例えば、raycast から接触点を決めるかもしれません。

    // On the explosion object.
    void Start() {
        var exp = GetComponent<ParticleSystem>();
        exp.Play();
        Destroy(gameObject, exp.duration);
    }

    
    // Possible projectile script.
    public GameObject explosionPrefab;

    void Update() {
        RaycastHit hit;

        if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit)) {
            Instantiate (explosionPrefab, hit.point, Quaternion.identity);
        }
    }

さらなるアイデア

ここで開発された爆発は非常に基本的なものですが、ゲームにおいて正確な感じを受けるようにするために、それのさまざまな面を修正することができます。

使用するパーティクルグラフィックは、プレーヤーがどのように爆発を “reads” するかで、大きな影響を及ぼします。たくさんの小さな、別に認識できる炎を持つ、投げ出されて燃えてる断片を提案します。完全に離れて、移動しないさらに大きな粒子は、破壊された燃料タンクから供給される火の玉のようにたくさん出現します。通常は、エフェクトを完了するために、一緒にいくつかのプロパティーを変更する必要があります。たとえば、シャープな飛散が、燃焼する破片をかなりのいくらかの距離にまき散らしている間、それが消える前に火の玉が拡大することなく、長く持続します。

いくつかのプロパティーは、ここではランダムな値に設定されています。しかし、他の多くのプロパティーは Random Between Two Constants/Curves オプションを持っており、いろいろな方法でバリエーションを追加するためにこれらを使用することができます。粒子が、エフェクトを繰り返していると目立つのを回避するために、サイズと回転を変化させる Start DelayStart Lifetime および Start Speed が役立ちますが、さらにいくつかのランダム性を追加することを検討してください。小さな変化は、制御された機械的なプロセスよりもむしろ “natural” で予測不能なエフェクトである爆発の印象を補強するのに役立ちます。より大きな変化は、“dirty” な爆発を示唆します。たとえば、車両の燃料タンクがおそらく別々に着火されているので、Start Delay を変化させることで、もうシャープではないけども、よりゆっくりと飛散する爆発をもたらします。

パーティクルシステムの使い方
車両から出る排気煙