- Particle Systemについて
- Particle Systemの作成方法
- Particle Systemモジュールについて
- Duration
- Looping
- Prewarm
- Start Delay
- Start Lifetime
- Start Speed
- Start Sizeと3D Start Size
- Start Rotation と 3D Start Rotation
- Flip Rotation
- Start Color
- Gravity Modifier
- Simulation Space
- Simulation Speed
- Delta Time
- Scaling Mode
- Play On Awake
- Emitter Velocity
- Max Particle
- Auto Random Seed
- Stop Action
- Culling Mode
- Ring Buffer Mode
- おわりに…
Particle Systemについて
Unityでエフェクトなどを表現したい場合、Particle Systemを使うのが一般的かなーと思います。
ただ一度Particle SystemのInspectorウィンドウを見たことある人は分かるかと思うのですが、
設定できる項目が多すぎて挫折しそうになります 笑
Particle Systemについては映像付きで説明しないと分かりにくいと思うんです。
ということで全ての項目の説明をここでしてみたいと思います!
めっちゃ数あるので途中で挫折しネット上に公開される可能性は低いかもしれませんが…
とりあえずいってみましょー!!
(追記:単純に途中で挫折しそうになりましたし2,3項目ほど訳わかめで挫折しました。苦笑)
Particle Systemの作成方法
そもそもParticle Systemを作成する方法についてです。
Hierarchyウィンドウ上で右クリック→Effects→Particle System
で作成できます。

作成されたParticle SystemのInspectorウィンドウを見てみてください。

めっちゃいっぱい項目ありますよね、この一個一個を「モジュール」と呼ぶそうです。
このモジュールをクリックすると更に詳細の設定項目が表示されます。
とりあえず一番重要そうなParticle Systemモジュールの説明をしていきます。
Particle Systemモジュールについて
Particle Systemのメインとなるモジュールです。
正直ここの設定項目が一番多いです。
詳細画面を開くと以下のようになっています。

それぞれの項目について以下で説明します!
Duration
Particle Systemの再生時間です。
デフォルトは「5」になっているので5秒間再生されます。
以下ではDurationを1秒に変えて再生しています。

以下で説明するLoopingがデフォルトでチェックされているので、このチェックを外すと分かりやすいです。
Looping
デフォルトでチェックが入っています。
このチェックが入っているとParticle Systemの再生がループします。
チェックが入っていない場合はdurationの秒数だけ再生されます。

Prewarm
Loopingのチェックがオンの時だけ設定できる項目です。
再生開始時に既に再生されていたかのように振舞えます。。。
何を言っているか訳わかめだと思うので、百閒は一見にしかずです。
以下をご覧ください。

まずLoopingをオンにして再生しています。
発生源から粒子が飛び出していくのが分かります。
次にPrewarmをオンにした状態で再生しています。
再生ボタンを押した瞬間に空中に粒子が表示されています。
非表示で再生していて途中から表示されたようなイメージでしょうか。
Start Delay
再生開始を待つ秒数です。
ここで設定された秒数だけ待ってその後にDurationだけ粒子が再生されます。
以下では2秒待ってから再生するように設定しています。

Start Lifetime
発生した粒子の生存時間です。
ここで指定した秒数だけ表示され、その後消滅します。
以下では生存時間を5秒と1秒に設定して再生しています。

Start Speed
粒子の速さです。これはイメージしやすいかと思います。
以下では5で設定したのと100で設定したのを比べています。

Start Sizeと3D Start Size
粒子の大きさを指定できます。
3D Start Sizeにチェックを入れるとX,Y,Z軸それぞれの大きさを指定できるようになります。
3Dから始めるとややこしいので、とりあえず3D Start Sizeのチェックは入れない状態で説明します。
まず大きさの指定方法なんですが以下の4つがあります。
・Constant
・Curve
・Random Between Two Constants
・Random Between Two Curves

Constant
大きさは一定で変化しません。
Constantの場合でStart Sizeを1と10で比べてみたのが以下になります。

余談ですが、ここからParticle SystemのEditorウィンドウを表示しています。
Particle SystemのOpen Editorをクリックすることで表示されます。

Curve
大きさを時間経過で変化させることができます。
最初は小さく最後は大きいみたいなことも出来るようになります。
カーブについては結構色々できるので公式の説明も参考にしてみてください。
Curveを選択すると右側のグラフに赤い線が表示されます。
Start Sizeの右側の下三角を押してCurveを選択しましょう

すると右側にグラフと赤い線が表示されました。

このグラフは横軸が時間で縦軸が粒子の大きさを表しています。
一旦この直線でどうなるかみてみましょうか。
この状態で再生してみたのが以下になります。

時間が経てば経つほど粒子の大きさが変化していきますね。
グラフの下にサンプルとなる曲線がいくつか用意されていて、こちらをクリックするとその曲線に設定されます。
いくつか試してみてもよいですね。

また、例えば曲線の途中も変化させたいという場合は
変化させたい箇所をダブルクリックすることでキーを追加できます。
このキーをドラッグ&ドロップすることで対象の箇所を変化させることも出来ます。
キーの削除は対象のキー上で右クリック→Delete Keyで行えます。

Random Between Two Constants
二つの数値を設定し、ランダムで2つの数値間の大きさの粒子が再生されます。
Constantが分かればなんとなくイメージできるかなーと思います。
例えばStart Sizeを1と10の二つ設定して再生してみたのが以下です。
この場合1~10の間の大きさの粒子が再生されます。
バラバラの大きさの粒子が再生されていることが分かるかと思います。

Random Between Two Curves
二つの曲線の間でランダムに大きさが変わります。
ここまで細かく設定できるのもすごいですが、なかなか使わなそうですね。
今回は以下のような曲線にしてみました。

この曲線では以下のようになりました。

Start Rotation と 3D Start Rotation
粒子の角度を指定できます。
Start Sizeと同様で3D Start Rotationのチェックをつけると
X,Y,Z軸それぞれの角度を指定できるようになります。
球体だと向きが分からないのでテクスチャを楕円に変更しました。
以下ではStart Rotationの値を変更していっています。
楕円の角度が変わっていっているのが分かるかと思います。

こちらもConstantやCurveも指定できます。
以下ではCurveを指定しました。
少しづつ楕円の角度が変わっていっているのが分かるかと思います。

Flip Rotation
真逆の向きで粒子を発生させる確率を設定します。
設定できる値は0~1の間です。
例えば以下ではStart Rotation = 45,Flip Rotation = 0.5
に設定してみました。
半々の確率で45度と135度の角度の粒子が発生しているのが分かるかと思います。

Start Color
粒子の色を指定できます。
これは直感的に分かりやすいかと思います。

色の設定方法は以下の通り5つあります。
・Color
・Gradient
・Random Between Two Colors
・Random Between Two Gradients
・Random Color

この中でとりあえずGradientを説明します。
これは文字の通りで色を少しづつ変化させることができます。
Gradientに設定して色の部分をクリックするとGradient Editorが開きます。

真ん中の長方形に色が表示されてますね。
長方形の左側から右側へ色が変化していきます。
そして長方形の上と下に矢印がありますよね。
上の矢印:透明度(Alpha)を設定できます。
下の矢印:色を設定できます。
変化させたい箇所で右クリックを押すと
矢印を追加できます。
以下では最初が赤色で途中で黄色になり最後は黒にしています。
そして少しづつ透明になっていき最後は再度不透明に設定しています。

この設定で再生したのが以下になります。

Gravity Modifier
粒子が受ける重力を設定できます。
0なら無重力です。
数値を上げていくと受ける重力が増していきます。
以下ではどんどん重力の数値を上げていっています。

Simulation Space
粒子の移動を制御します。
以下の3つから指定できます。
・Local
・World
・Custom

Localは発生源が移動すると粒子も移動します。

Worldは発生源が移動しても粒子は移動しません。

Customは別のオブジェクトの移動と一緒に移動します。
今回は球体を作成し、その球体に以下のScriptをアタッチしました。(Update関数のみ抜粋します。)
// Update is called once per frame
void Update()
{
transform.Translate(0.1f, 0, -0.1f);
}
ゲーム開始時から球体が移動していくということです。
この状態でSimulation SpaceをCustomに選択し
Custom Simulation Spaceに球体をアタッチします。

これでゲームを開始してみたのが以下です。

球体の移動につられて粒子も同じ方向に移動していっていますね。
Simulation Speed
システム自体の再生速度を変更します。
Start Speedとの違いが分からなかったので
今回はStart SpeedをCurveにして時間経過により1から50に変化させています。
以下がSimulation Speed = 1の場合です。

そして以下がSimulation Speed = 5の場合です。

最初のに比べて5倍速で再生されているようなイメージでしょうか。
Delta Time
Timeに依存させるかどうかです。
ScaledとUnscaledを選択できます。
まず2つのボタンを作成しました。
左側のボタンを押すとTime.TimeScale = 0(一時停止)の
状態になります。
右側のボタンを押すとTime.TimeScale = 1(ゲーム再開)の
状態になります。
この状態でScaledを選んだのが以下です。

Time.TimeScale = 0の時は粒子もちゃんと停止してくれていますね。
続いてUnscaledが以下です。

左側のボタンを押しても粒子は動き続けていますね。
Scaling Mode
粒子の大きさの決め方みたいなものです。
これは実際に見ないと分からないと思います。
Local
Particle System自身のScaleを変化させると粒子の大きさも変わります。
親オブジェクトの大きさが変わっても変化しません。

Hierarchy
親オブジェクトの大きさが変化すると粒子の大きさも変化します。
今回はCubeを作成し、その下にParticle Systemを配置しました。

Particle Systemの親オブジェクトはCubeということです。
この状態でScaling Mode = Hierarchyにしたら以下のようになります。

ここでScaleを変化させているのはCubeなのですが、それに連動して粒子の大きさも変化しているのが分かるかと思います。
ちなみに同じ状況でScaling Mode = Localの場合でCubeのScaleを変化させても粒子の大きさは変わりません。
Shape
粒子の大きさは変わりませんが粒子の発生源の大きさが変わります。
こちらは親オブジェクトのScaleが変化すると連動するようです。

発生源自体が見えないので分かりにくいのですが、上記ではScaleを大きくしているので最初は一点から粒子を射出していますが
最後は広い範囲でランダムで粒子が出ていっているのが分かるかと思います。
Play On Awake
ゲーム開始直後から粒子の再生を行うか否か選択できます。
チェックが入っているとゲーム開始と同時に再生されます。

チェックが外れていると再生されません。
逆にどうしたら再生されるのか気になりますよね。
そこで今回はまず以下のスクリプトを作成し、Particle Systemにアタッチしました。
public class test : MonoBehaviour
{
bool flg;
// Start is called before the first frame update
void Start()
{
flg = false;
}
// Update is called once per frame
void Update()
{
if (Time.time >= 3.0f)
{
if (!flg)
{
flg = true;
this.GetComponent<ParticleSystem>().Play();
}
}
}
}
ここでの処理はゲーム開始から3秒経ったらParticle Systemを再生するということだけです。
この状態でゲーム開始してみたのが以下です。

ちゃんとゲーム開始3秒後ぐらいから粒子が発生していますね。
Emitter Velocity
粒子の速度の計算方法を選択できます。
Rigidbodyがアタッチされている場合、そちらを元に速度計算します。
そうでなければTransform(発生源の位置の変化)で速度を計算します。
Inherit VelocityモジュールとEmissionモジュールに利用される計算方法の指定なので
具体的には各該当モジュールで説明しましょう。
Max Particle
ゲーム内で同時に存在できる粒子の数です。
ここで指定した数以上の粒子は削除されます。

こちらは分かりやすいですね。
Auto Random Seed
チェックを入れると再生毎に粒子の広がり方が違ってきます。
チェックを外すとRandom Seedを入力する項目が表示されます。
ここでRandom Seedの数値を入力すると、その数値での広がり方をします。
まずAuto Random Seedのチェックを入れた状態で
何度も再生してみたのが以下です。再生する毎に粒子の広がり方が違っているのが分かるでしょうか。

次にAuto Random Seedをオフ、Random Seed = 0に設定した状態で何度も再生してみたのが以下です。
毎回同じ広がり方をしているのが分かるでしょうか。

Stop Action
再生終了時の処理を選択できます。
Loopingがオンになっている場合は対象外です。(ただしスクリプトで再生を停止した場合は有効のようです)
具体的には以下4つです。
・None(何もしない)
・Disable(非表示)
・Destroy(破棄)
・Callback(停止をスクリプトに送信)

Disable
再生が終わったら非表示になります。
Hierarchyウィンドウを見ると分かりやすいです。
以下はDisableにしてゲーム開始してみた図です。
粒子が消えた瞬間にParticle Systemが非表示になりました。

Destroy
Particle System自体を破棄します。
以下を見ると実際に消えているのが分かるかと思います。

Callback
Particle Systemの再生終了時にアタッチされているスクリプトのOnParticleSystemStopped()が実行されます。
今回は以下のように記載しました。
void OnParticleSystemStopped()
{
Debug.Log("Particle Stopped");
}
これで再生すると以下のようになります。

Culling Mode
画面外の時に粒子を再生するか否かを決めれるようです。
どういった状態で発動するのか分かりませんでした(涙)
言葉の通りカメラから粒子が見えないようにカメラの位置を変更すれば発動するかと思ったのですが
どうも違ったようで他向いてても再生されているようでした。
何か発動する条件が漏れているように思いますが…分かりませんでした。
種類としては以下があります。
・Automatic(コンピューターに任せます!!)
・Pause And Catch-up(カメラから外れたら再生を一時停止するが、
もう一度カメラに入ったら一時停止していなかったように粒子の位置を計算して再生する)
・Pause(カメラから外れたら再生を一時停止する)
・Always Simulate(カメラから外れても再生しつづける)
処理負荷が高い場合の対処方法用の項目のようですね。
Particle Systemを多く使っているせいで処理負荷が高くなっちゃったよーっていう場合は
Pause And Catch-upにすると処理負荷が改善される場合があるようです。
Ring Buffer Mode
Max Particleの数以上の粒子を発生させようとした場合にどう処理するかを決めれるようです。
項目の種類は以下です。
・Disable
・Pause Until Replaced
・Loop Until Replaced

Disable
Max Particle以上の粒子は発生しません。
以下ではMax Particle = 1にしました。

Pause Until Replaced
Max Particle以上の粒子が発生した場合、古い粒子が新しい粒子に置き換わります。
つまり古い粒子は削除されて、その代わりに新しい粒子が発生します。
以下でもMax Particle = 1にしました。

粒子が小刻みに発生して消えてを繰り返しているのが分かるかと思います。
Max Particle = 1のため同時に2つの粒子が発生できないため、出ては消えてを速い間隔で繰り返していますね。
Loop Until Replaced
正直あまり意味が分からなかったのですが。
ゴイサギ日記様の記事が分かりやすかったので、こちらを見てください。
一応自分用に以下に理解したことを記載します。(違ってたらすいません。。)
Ring Buffer ModeをLoop Until Replaced
にすると
Loop Rangeという2つの数値を入力する欄が出現します。
ここにはMax Particle以下の場合に再生をループする「割合」を入力します。
割合なので0 ~ 1の間の数値のみ有効です。
例えば
Loop Range : 0 , 0.5
と入力したとします。
そしてStart Lifetime = 4
だとすると、Max Particle以下の場合は
Loop Rangeの割合だけ粒子が再生されるので
0秒 ~ (4 * 0.5 = )2秒
だけ再生され、それがループします。
Max Particle 以上の粒子が発生した場合は
一番古い粒子のループ再生は解除され、最大の割合の再生が行われたあとに消滅します。
つまりStart Lifetime = 4の場合、4秒再生された後に消滅します。
この間に既に新しい粒子は発生しているため、瞬間的にMax Particle以上の粒子が
発生することになるそうです。
おわりに…
やってみて分かりましたが、想像以上に疲れました。
色々勉強になりましたが、もういいです…(笑)