今回はUnityのパーティクルシステム(通称Shuriken)に新しく追加された、Lightモジュールを使用して色々と遊んでみます。
パーティクルに光を追加する
Unity 5.5で追加されたLightモジュールは、パーティクルの生成する要素の幾つかに光の処理を追加するモジュールです。
BloomやFlareで用いるような画面効果ベースの光表現ではなく、本当にライトを追加してしまうのが、このモジュールの面白いところです。
「ライト」の設定
Lightモジュールが表現するライトは、シーン内もしくはPrefabとして存在するLightコンポーネントから取得するみたいです。
LightsのLightに設定したライティング設定を「基本的に」使用します。例えばコンポーネントのIntensityを上げれば輝度が上がりますし、Rangeを上げれば光が影響する範囲が広がります。
ここで「基本的に」と言うのは、Lightsコンポーネントでもある程度の値が調整出来る為です。例えば Range Multiplier で光が影響する範囲が広がりますし、 Intensity Multiplier で輝度が上昇します。
この二つの項目があるのは、Lightコンポーネントの設定を使いまわしする為じゃないかなと個人的に思います。基本的な設定はLightコンポーネントで行い、微調整をLightsモジュールで行う感じです。
なお上記にも書きましたが、参照するLightコンポーネントはPrefabやインスタンス化前のオブジェクトでも動作します。また、Lightコンポーネントを追加しているGameObjectが非アクティブでも動作します。
要するにLightコンポーネントの設定取ってるだけっぽいです。
どの程度光表現を行うか
もう一つ重要な要素が、どの程度ライティングを行うかです。
ライト表現はかなり重い処理で、特にForwardレンダリングを行っている場合にはポイントライトの数はとても強く制限されます。
Deferredレンダリングではある程度の緩和があるとは言え、少ないに越したことは無いです。
Lightsモジュールで光を表現する上で見るべき項目は、RatioとMaximum Lightsの二つです。Ratioは出てくる粒子が光を持ってる割合、Maximum Lightsはライトを表現出来る最大数についてです。
Ratioはパーティクルにライトを付与する割合で、この値が1だとパーティクルを出力する際に全ての粒子にライトを付けようとします(実際にはMaximum Lightsの制限により無いパーティクルが存在します)
Ratioを1かつMaximum Lightsが十分に無い場合、後から生成された粒子に殆どライトが付与されていないという状態が起こり、ライトのON/OFFが切り替わったような表現になってしまいます。
下の図は、Maximum Lightsを3かつRatioを1に設定した状態で、3個3個と連続して出したケースです。あとから出したパーティクルにライトはありません。
平均して明かりを維持したいならば、Ratioは1を設定しない方が良さそうです。
Maximum Lightsはその名の通りライトを表現出来る最大数です。単純に指定した数分ライトが表現出来る訳ですが、Maximum lights の 0 は例外な値らしく、置けるだけポイントライトが置かれていました。
Forwardレンダリングの場合さらにQualityの設定により削減されます。(Standaloneで4つ、Mobileで一つしかライトを置けない)
下の図は先ほどの設定をQuality SettingsでPixel Light Countを1に設定した場合です。Maximum Lightは3なのですが、一つしかライトが表現されていません。
パーティクル表現の影響を受ける
Lightsモジュールは、パーティクル表現によって「ライトの色」や「ライトの範囲」「ライトの強さ」が変化するオプションがあるみたいです。
例えばUse particle Colorにチェックが入っていれば、パーティクルの色がライトの光の色に影響します。これはStart ColorだけでなくColor Over Lifetime等も同様です。
またSize Affect Rangeにチェックを入れて大きいパーティクルは広範囲・小さいパーティクルは狭い範囲に光の影響を与えるように出来ますし、Alpha Affects Intensity で透明度が薄いパーティクルの輝度を下げるオプションもあります。
勿論Range MultipleやIntensity MultipleをCurve制御して頑張る事も出来ると思いますが、パーティクルのサイズや透明度で調整出来るのは割と良さそうです。
その他「Light」との違い
確実に違うかはまだ微妙なところですが、いろいろと検証した感じ以下の項目が通常のライトと違うっぽいです。
- 使用できるLightコンポーネントはPointのみ
- Shadowは使用できない
- FlareとHalo、Cokieは使用できないぽい
- Bounce intensity動いてないっぽい?
- 画面外に粒子が移動すると、Lightを他のパーティクルに付け替えられる
(ので、余り広いRangeは使用しない方がよいかもしれない)
おまけ
このLightsモジュールと、ノーマル付きのテクスチャシートアニメーションを駆使すると、中々に面白い表現が出来そうです。
ParticleのLightモジュールと煙につけたノーマルマップを組み合わせて、弾頭を光らせる #unity pic.twitter.com/cBWmgXFyes
— 椿 (@tsubaki_t1) 2016年12月3日
その辺りは、新しく追加されたパーティクルのデモ「Unity Particle Pack」が色々と参考になりそうです。
Unity Particle Pack by Unity Technologies https://t.co/il0CDaqcWi #AssetStore Unity 5.5向けの新しいパーティクルサンプル pic.twitter.com/Ch2EYHnMNP
— 椿 (@tsubaki_t1) 2016年10月26日
関連
次は5.5の目玉トレイルについて書きたい