こんにちは。情熱開発部アートデザイン課の菅野です!
春を迎え暖かくなり、段々と日も延びてきましたね。
今回は光にまつわる話題で、Unityで負荷をかけずにライトの点滅を作る方法についてご紹介します。
※使用するUnityのバージョン:2021.3.11f1
ライトの種類
ゲーム制作を行う上で、ライトは必要不可欠ですよね。
ライトが無いと真っ暗になってしまい、何も見えなくなります。
ゲーム制作では「リアルタイムライト」と「ライトベイク」という2種類のライトを使用します。
「リアルタイムライト」とは、その名の通りリアルタイムで周りを照らす事が出来るライトです。
ライトの計算を毎フレーム行うため、ライトや影を動かしたり、ライトを点滅させる事も出来ます。
「ライトベイク」とは、ライトから当たった光や落ちた影の情報を画像として保存し、オブジェクトに貼り付ける方法です。
負荷削減のためにゲーム制作ではよく「ライトベイク」を使用しますが、上記の通り画像で保存されているため、以下のように光や影を動かす事が出来ません。
上:リアルタイムのライトを使用 下:ライトベイクを使用
残念ながら “ライトの点滅” など動きのあるライトの表現は不可能です。
リアルタイムライトを使用すればライトを点滅させる事が出来ますが、負荷が高くなってしまいます。
どうすれば負荷をかけずにライトの点滅が表現できるのでしょうか?
そこで役に立つのが「パーティクルシステム」です。
パーティクルシステムとは?
シーン内で大量の小さな 2D 画像を生成し、それらをアニメーション化することによって、液体、雲、炎などの流体をシミュレーションする方法を「パーティクルシステム」といいます。(※以降「パーティクル」と表記)
早速ですが、Unityで「パーティクル」をシーンに追加してみましょう。
メニューバーの [Game Object]→[Effects]→[Particle System]
からシーンに追加する事が出来ます。
すると、画像のような球体のアニメーションがシーンに追加されると思います。これが「パーティクル」です。
今回はこの「パーティクル」を流体ではなくライトに見立て、ライトの点滅を表現してみます。
それでは実際に作ってみましょう!
パーティクルでライトの点滅を作成
1.今回は流体として使用しないためアニメーションを停止させ、パーティクルの数を減らします。
先程追加したパーティクルを選択し、[Inspector]→[Particle System] の
・Start Lifetime (パーティクを生成する時間)を「2.5」
・Start Speed (アニメーションのスピード)を「0」
・Max Particles (パーティクルの数)を「15」に設定
2.オブジェクトに沿ってパーティクルを生成させます。
まず、シーンに”木”など、パーティクルを生成させたいオブジェクトを追加
次にパーティクルを選択し、[Inspector]→[Particle System]→[Shape] の
・「Shape」を「Mesh」に選択
・「Mesh」に「沿って生成させたいオブジェクト」をアタッチ
・「Scale」(アタッチしたオブジェクトの大きさ)等はお好みで変更
3.パーティクルを点滅させます。
パーティクルを選択し、[Inspector]→[Particle System] の
・「Color over Lifetime」で「Color」をクリック
クリックすると「Gradient Editor」が出てきます。
下のタブは色を表しており、以下の画像のように 白→黒→白 になるよう設定すると、パーティクルを点滅させる事が出来ます。
上のタブは透明度を表しており、黒くなる瞬間に透明度も下げるようにすると綺麗に点滅して見えます。
上記の方法で、簡単にライトの点滅を表現する事が出来ます。
4.パーティクルの放射の頻度とタイミングを調整します。
パーティクルを選択し、[Inspector]→[Particle System]→[Emission] の
・「Rate over Time」を「5」に設定
・「Bursts」の「+」を押すとパーティクル放出の詳細設定ができる
※この辺の調整は個々の好みだと思うので、実際に色々調整してみて下さい。
Unity公式に Emissionモジュール という記事があるのでご参考にどうぞ!
シーンに追加した木の位置にパーティクルの位置を合わせて、それらを複製してみました。
リアルタイムライトのようにライトの周囲を照らす事は出来ませんが、パーティクルでライトの点滅のような表現をする事が出来ました!
気になる負荷は?
Unityでパフォーマンス情報を取得するためのツールである「プロファイラー」を使用して、負荷を確認してみましょう。
「プロファイラー」は、 [Windows]→[Analysis]→[Profiler] で表示できます。
パーティクルで負荷削減が出来たのかを調査します。
試しにパーティクルと同じ数のリアルタイムライトを置き、ランダムではありませんが、点滅させてみました。
ちなみに、リアルタイムライトは周囲を照らしてくれますが、ライトそのものが表示される訳ではありません。ライトの形のオブジェクトを置き、それを照らす事でライトの点滅を表現しています。
(※リアルタイムライトの点滅の詳細については説明を省きます。)
パーティクルとリアルタイムライトの負荷を比較してみましたが、以下のような結果になりました。
プロファイラーの見方ですが、簡単に言うと「縦線グラフが上に行けば行くほど負荷がかかっている」状態です。
リアルタイムライトは全体的に5ms(200FPS)のラインを上回っており、10ms(100FPS)のラインにも到達しそうですが、パーティクルは全体的に5ms(200FPS)のラインを下回っています。
これにより、パーティクルを使用する事で大幅に負荷削減できた事が分かりました。
まとめ
今回はUnityの「パーティクル」にスポットライトを当ててみました。
ライトベイクでは出来ない “ライトの点滅” をパーティクルで表現する事によって、リアルタイムライトを使用した時より負荷を軽減する事が出来ました。
反対に、リアルタイムライトのように周囲を照らしたり影を生成したりする事は、パーティクルでは実現出来ません。
どんなシーンでライトの点滅を使用するかによって、パーティクルとリアルタイムライトのどちらが最適なのかが変わると思います。
パーティクルでライトの点滅を表現する際には、ぜひ当記事を参考にしてみてください!
参考資料
・パーティクルシステム – Unity Documentation
・【Unity 入門】パーティクルを覚える
・【Unity】パーティクル徹底解説!基本的なモジュールの使用方法から応用例まで
・【Unity】Profilerの実用的な使い方!パフォーマンス改善に必要な部分だけサクッとまとめ
・【Unity】CPUプロファイラでパフォーマンスを改善する 前編
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。