今回は「期限が来ても即座に消滅させないパーティクル」について紹介します。
時間で消滅するパーティクル、しないパーティクル
パーティクルは大きく分けて2種類のパーティクルがあります。つまり、時間と共に消えるパーティクルと、消えないパーティクルです。
消えないパーティクルは、無限にその場に存在し続けるタイプのパーティクルです。例えば星空であったり、煙突の煙であったり、燃える家であったり、そういった少なくともワンシーン内では消滅しそうにない物です。
消えるパーティクルは、爆発の一時的な炎上や煙であったり、ホースから一時的に出る水であったり、バーニアの炎であったり、そういった一定時間後にエフェクトが収まるタイプのパーティクルです。
パーティクルの停止と消滅
よく見るパーティクルを止める実装は、Destoryに時間指定を入れて停止するアプローチです。このアプローチで停止する場合、パーティクルのタイプによっては非常に唐突にパーティクルが消滅します。
これはSetActiveを弄った場合も同様です。
パーティクルの生成(Emission)を止めたい場合
いきなり消滅するのではなく、「生成」する所を止めたい場合はDurationが使えます。
Durationに制限時間を設定しLoopingのチェックを外して置くと、時間切れで勝手に停止してくれます。
停止しているかどうかはParticleSystem.IsAliveで確認します。
このアプローチで停止したパーティクルの面白い挙動の一つに、オブジェクトを非アクティブ→アクティブ切替する事で、再度パーティクルが生成される処があります。
そのため、下のようなオブジェクトを非アクティブにするコードがあれば何度も再利用出来たりします。
パーティクルを任意のタイミングで停止する
Durationは便利ですが、事前に決めたタイミングでしか停止することが出来ない問題があります。爆発や爆発時の煙といったエフェクトに関してはこれでほぼ問題が無いのですが、噴水といった任意のタイミングでON/OFFしたい場合には少し厄介です。
なので外部からパーティクルを停止させます。停止するにはStopを使用します。Pauseはパーティクルの動きを一時停止させます。
ただ、不思議な事にStandardAssetsのParticleSystemに含まれるParticleSystemDestroyer.csでは、パーティクルの停止にはemission.enabledを使用していました。このアセットはパーティクル終了時にパーティクルを削除してくれるアセットなのですが、何故この実装を行ってるかは製作者のみぞ知る・・・
ちなみにパーティクルを削除や非アクティブと同じように「一括で消す」場合、Stopの後か前にClearを挟みます。これ上手く動かない場合はUnity 5.3.2以降のバージョンなら動くかもしれません。