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関数に渡しているのは、このゲームオブジェクト自身と、先ほど測ったタイミング時間です。

 今日はこれで終わりです。