Unityで0からゲームを作る試み その2
その1の時点ではパーティクルは自動的に消えてくれませんでした。そこでスクリプトでパーティクルの発生を止めて、パーティクルを消去することにします。
パーティクルの発生を司るクラス「ParticleEmitter」のリファレンスを見てみると、Variableに
emit Should particles be automatically emitted each frame?
という記述があるのが分かります。これをスクリプトでfalseにしてあげればパーティクルの発生は止まるでしょう。
以下に示すJavaScriptコードは、次図に示す「EffectBomb」プレハブに適用されていることを前提としています。この「EffectBomb」プレハブ自体はEmptyGameObjectであり、子として複数のEffectを持っています。
var elimination_time = 2.0; function Start() { audio.Play(); yield WaitForSeconds( elimination_time ); var max_second = 0.0; var emitters = gameObject.GetComponentsInChildren( ParticleEmitter ); for ( var emitter : ParticleEmitter in emitters ) { emitter.emit = false; if ( emitter.maxEnergy > max_second ) { max_second = emitter.maxEnergy; } } Destroy( gameObject, max_second ); }
以下コードの解説。
var emitters = gameObject.GetComponentsInChildren( ParticleEmitter );
「EffectBomb」の子オブジェクトの中から、「ParticleEmitter」クラスコンポーネントを列挙しているのが分かります。
emitter.emit = false;
そして、それぞれに対して発生を司るフラグをfalseにしています。
if ( emitter.maxEnergy > max_second ) { max_second = emitter.maxEnergy; } ... Destroy( gameObject, max_second );
ここではパーティクルの生存時間が一番長い要素を探し、オブジェクト破壊までのタイミングを測っています。実際にDestroy関数に渡しているのは、このゲームオブジェクト自身と、先ほど測ったタイミング時間です。
今日はこれで終わりです。