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

シンプルな爆発

パーティクルシステムを使用することでリアルな爆発を引き起こすことができますが、その仕組みは、見た目より少し複雑です。爆発の実体は、単にパーティクルの外側への飛散ですが、それをずっとリアルに見せるために使える、簡単な修正方法がいくつかあります。

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

パーティクルのタイムライン

単純な爆発は、全方向へ高速で弾け飛ぶ火の玉を生成します。最初の爆発はエネルギーが大きいため、非常に熱く (つまり、明るく) 高速で動きます。このエネルギーは急速に消散し、その結果、炎の拡大が遅くなり、さらに、冷却 (つまり、明るさが減少) します。最後に、すべての燃料が使い尽くされるにつれ炎が消えてゆき、やがて完全に消滅します。

爆発のパーティクルは通常、短い生存期間しかありません。その生存期間中にいくつかの特性を変化させて、効果をシミュレーションできます。パーティクルは非常に高速で移動するところから開始しますが、それは爆発の中心から離れるにつれて、大幅に減速します。また、色は始めは明るく、その後暗くなり、最終的には透明になっていきます。最後に、生存期間を通してパーティクルのサイズを減少していくと、燃料が使い果たされるにつれ炎が消失するような効果が得られます。

実装

Starting with the default particle system object (menu: GameObject > Create General > Particle System), go to the Shape module and set the emitter shape to a small Sphere, say about 0.5 units in radius. The particles in the standard assets include a material called Fire Add which is very suitable for explosions (menu: Assets > Import Package > Particles). You can set this material for the system using the Renderer module. With the Renderer open, you should also disable Cast Shadows and Receive Shadows since the explosion flames are supposed to give out light rather than receive it.

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

また、 Size Over Lifetime モジュールを使用して、燃料を使いきる炎の効果を作成することができます。「右肩下がり」のプリセット (つまり、サイズは100 %で始まり、0 に向かって減少します) を使用してサイズのカーブを設定します。炎を暗く薄れさせていくためには、Color Over Lifetime モジュールを有効にし、カーブの左端が白で始まり、右側で黒で終了するようなグラデーションに設定します。Fire Add マテリアルはレンダリングに追加シェーダーを使用するので、color プロパティーの暗さもまた、パーティクルの透明度を制御します。色が黒くうすれていくにつれ、炎は完全に透明になってゆきます。また、付加するマテリアルは、互いの上に重ねて描画すると、パーティクルの明るさを増加することができます。これは、パーティクルすべてが近くにまとまっている爆発の開始時で、明るいフラッシュの印象をさらに高めるのに役立ちます。

現状では、爆発はそれらしくはなってきていますが、まるで宇宙で起こっているように見えます。パーティクルは放出され、フェードする前に一定の速度で長い距離を進みます。ゲームが宇宙に設定されているならば、これは望んでいる正確な効果かもしれません。しかし、大気中で起こる爆発は、周囲の空気によって遅くなり、減衰します。Limit Velocity Over Lifetime モジュールを有効にし、Speed をおよそ3.0に、Dampen をおよそ 0.4 に設定すると、それが進むにつれて爆発が少しずつ力を失っていく様子が表現されます。

最後に気を付けるのは、パーティクルが爆発の中心から遠ざかるにつれて、個々の形状がより認識できるようになるという点です。具体的には、同じ大きさで同じ回転をするパーティクルを表示すると、同じグラフィックスが各パーティクルで再利用されていることが明らかになってしまいます。これを回避するためには、パーティクルが生成されるときに、サイズと回転にランダムな値を加えます。インスペクターの上部にある Particle System モジュールで、Start SizeStart Rotation プロパティーの右側にある小さな矢印をクリックし、その両方を Random Between Two Constants に設定してください。回転の場合、0 と 360 の 2 つの値を設定します (つまり、完全にランダムな回転)。サイズに関しては、大きすぎたり小さすぎたりするパーティクルを作らないようにすると同時に、いくつかのバリエーションを与えるため、0.5 と 1.5 に値を設定してください。これで、パーティクルグラフィックスの繰り返しが、かなり目立たないようになるはずです。

使用方法

テストの間、繰り返し爆発を見ることができるように、Looping プロパティーを有効にしておくと便利です。しかし、完成したゲームでは、爆発が 1 度だけ起こるように、これを無効にします。爆発する可能性があるオブジェクト(例えば、燃料タンク)の爆発を設計している場合は、オブジェクトに Particle System コンポーネントを加えて Play On Awake プロパティーを無効にしておく場合もあります。それから、必要に応じてスクリプトから爆発をオフに設定することができます。

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

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

    // 少し遅れて爆発が発生します。
        public float fuseTime;

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



        // 当たった瞬間に爆発します。
        void OnCollisionEnter(Collision coll) {
            Explode();
        }

爆発が、実際のゲームにおいて表示されないオブジェクト (例えば、非常に速く移動するミサイル)によって発生する場合は、単に適切な場所で爆発をインスタンス化するだけです。例えば、raycast で接触点を決める場合もあります。

    // 爆発オブジェクトにおいて
        void Start() {
            var exp = GetComponent&lt;ParticleSystem&gt;();
            exp.Play();
            Destroy(gameObject, exp.duration);
        }

    
        // 可能な砲弾スクリプト
        public GameObject explosionPrefab;

        void Update() {
            RaycastHit hit;

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

その他のアイデア

ここで開発された爆発は非常に基本的なものですが、ゲームに求めているものを忠実に表現するために、さまざまな面を修正できます。

使用するパーティクルグラフィックスは、プレイヤーがどのように爆発を「認識する」 かに大きな影響を及ぼします。たくさんの小さな個々に認識できる炎は、飛び散って燃える火の粉を表します。完全に他と分離した動かない大きなパーティクルは、破壊された燃料タンクから発生する火の玉のように見えます。通常は、効果を完成させるために、一緒にいくつかのプロパティーを変更する必要があります。たとえば、火の玉は消滅するまでには長く持続し、さほど拡大することがありません。逆に、密閉された燃料タンクの破裂は、燃焼する破片をかなりの距離まで飛び散らせたりします。

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

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