6. 効果を追加しよう

パーティクルシステムで効果を追加しよう

UnityではParticleSysytemというコンポーネントを使用して簡単に派手な効果を追加する事が可能になっています。

パーティクルシステムを追加しよう

パーティクルシステムはCubeなどの他のオブジェクト同様に下記のどれかの手順で追加する事が可能です。

  • メインメニューから、GameObject > Effects > Particle System
  • ヒエラルキーウィンドウから、Create > Effects > Particle System
  • 右クリックから、Effects > Particle System

配置し、ヒエラルキーウィンドウ上で選択すると、Sceneビューの右下にParticle Effectと書かれたデバッグ用のパネルが表示されるようになっています。

ここでSimulatePauseStopなどを切り替えて好みのパーティクルを作成していきましょう。

パーティクルを編集しよう

パーティクルシステムは、インスペクタウィンドウ上からパーティクルを放出する数や角度、タイミングなど、多くの設定を自由自在に行う事ができます。

今回はチュートリアルなので、下記のような設定でササッと作ってしまいましょう。

大まかに説明すると

  • 衝突時に一度パーティクルを放出するだけなのでLoopingPlay On Awakeをオフに
  • Start Colorでマテリアル(後で追加します)に色を追加
  • Start Sizeで大きさを調整
  • Start Rotationで開始時の角度をランダムに
  • Emmisionは放出するパーティクルの数を(デフォルトのまま)
  • Shapeは放出されるパーティクルの範囲を設定
  • Color over Lifetimeでパーティクルがフェードイン、フェードアウトするように
  • Rotation over Lifetimeで放出されたパーティクルにランダムで回転するアニメーションを追加
  • Render > Materialで星型のマテリアルを追加

などの設定をしています。

パーティクルの形状を星型にしたかったので、新しいパーティクル用のマテリアルを作成し、Renderに追加しています。

画像は任意で好きなものを入れて大丈夫ですが、何もない人は下記を使用してください。

右クリックでダウンロード

透明の上に白い星型が描画された画像なので、プレビューでは何も無いように見えるかもしれないです。 白い画像で作成しておくとUnity上で自由に色をつける事ができるようになっているので、このように素材を作成しています。

パーティクルのオン、オフをプログラムで制御しよう

Goal.csのスクリプトから配置したパーティクルの再生を制御してみましょう。 public ParticleSystem particle;を追加する事で、Goalのプログラムにエディタ上でパーティクルシステムをアサインする事ができるようになります。

あとは、衝突のタイミングで発火するOnTriggerEnterメソッドの中にアタッチしているパーティクルシステムのパーティクルを再生するparticle.Play();を記述するだけです!

public class Goal : MonoBehaviour
{
	//パーティクルを登録する
	public ParticleSystem particle;

	//コライダーに衝突すると実行される
	void OnTriggerEnter(Collider other)
	{
		//パーティクルを再生する
		particle.Play();
	}
}

不要になったオブジェクトをプログラムから削除しよう

ゴールはボールとの衝突後、パーティクルはその効果の終了後にそれぞれ役目を終えますが、 ステージ上に不要な要素を残しておくと負荷がかかる事があるので、もう使わない要素は削除しておく癖をつけておきましょう。

削除するにはDestoryを実行します。 Destory()の第一引数には削除する対象を、第二引数には削除するまでの猶予を入れます。 なのでゴールの旗を削除するにはDestroy(this.gameObject);を、パーティクルを再生終了後に削除するにはDestroy(particle.gameObject, particle.main.duration);を再生する必要があります。

削除の対象がthis.gameObjectとなっているのは、thisはスクリプトそのものを指していて、旗はそれがアタッチしているゲームオブジェクト、すなわちthis.gameObjectだから、という事を理解しておきましょう。

public class Goal : MonoBehaviour
{
	~
	void OnTriggerEnter(Collider other)
	{
		~
		// パーティクルを再生後に削除する
		Destroy(particle.gameObject, particle.main.duration);

		// 衝突したら自身を削除する
		Destroy(this.gameObject);
	}
}

再生するとこのようになります。