パーティクルシステムで効果を追加しよう
UnityではParticleSysytemというコンポーネントを使用して簡単に派手な効果を追加する事が可能になっています。
パーティクルシステムを追加しよう
パーティクルシステムはCube
などの他のオブジェクト同様に下記のどれかの手順で追加する事が可能です。
- メインメニューから、
GameObject > Effects > Particle System
- ヒエラルキーウィンドウから、
Create > Effects > Particle System
- 右クリックから、
Effects > Particle System
配置し、ヒエラルキーウィンドウ上で選択すると、Sceneビューの右下にParticle Effect
と書かれたデバッグ用のパネルが表示されるようになっています。
ここでSimulate
、Pause
、Stop
などを切り替えて好みのパーティクルを作成していきましょう。
パーティクルを編集しよう
パーティクルシステムは、インスペクタウィンドウ上からパーティクルを放出する数や角度、タイミングなど、多くの設定を自由自在に行う事ができます。
今回はチュートリアルなので、下記のような設定でササッと作ってしまいましょう。
大まかに説明すると
- 衝突時に一度パーティクルを放出するだけなので
Looping
、Play 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);
}
}
再生するとこのようになります。