【Unity】GameObjectメニューのLightについて解説【初心者向け】

【Unity】GameObjectメニューのLightについて解説【初心者向け】

メニューバーの『GameObject』から作成できるGameObjectの種類について解説するシリーズ第5弾。

今回は「Light」のメニューから作成できるオブジェクトについて解説を行います。

ライティングはゲーム画面の見え方に密接に関わる要素。特に3Dゲームでは超重要と言っても過言ではありません。

その光を生み出すオブジェクトが今回解説するLightです。

 

環境

macOS 10.14 Mojave

Unity2018.3.14f1

Unity Hub 1.6.2

メニューバーの『GameObject』について

『GameObject』は画面左から5番目、『Assets』と『Component』に挟まれています。

左から5番目にあるのだポッター
左から5番目にあるのだポッター

 

個々のGameObject作成に関してはそれぞれ別記事として作成し、それ以外の項目については以下の記事で解説を行なっています。

 

この記事では以下の項目を解説していきます。

Light
Light

 

便宜のため区切り線で領域を分け、それっぽく名前を付けます。

上から、ライトの作成、ライティング環境の作成と呼びます。この呼び方は私が勝手に呼んでいるだけのものなので注意。

ライトの作成

Unity世界を照らすライトを作成する機能です。あなたのゲームを彩るのは光なのです。

ライトの種類についての詳細はマニュアルが充実しています。

Directional Light

Directional Lightのオブジェクトを作成します。アイコンが太陽になっているのがヒントです。

Directional Light
Directional Light

 

このDirectional Lightは太陽のような役割を果たす光源です。

シーン内の特定の位置に光源が配置されるのではなく、シーンの外から照らしているイメージです。なのでシーン全体に影響が出ます。

通常、シーンの作成直後には『Directional Light』がひとつ作成されています。試しにSphereオブジェクトを配置して、マテリアルを設定すると以下のようになります。

Directional Lightがひとつ
Directional Lightがひとつ

 

続いて、もうひとつ『Directional Light』を作成してみます。ライトの色は紫っぽくしてみました。

Directional Lightがふたつ
Directional Lightがふたつ

 

光源がふたつあるのでさっきより明るくなりました。注目して欲しいのは、影の色と、Sphereへの太陽の映り込みの2点です。

上の画像と比べると、影の色が変わっているのが分かります。ひとつ目のライトで影が出来た部分、かつふたつ目のライトで影になっていない部分については、紫っぽくなっていますね。

また、Sphereの表面には太陽がふたつ映り込んでいます。マテリアルではSmoothness(滑らかさ)を1にしているため、ツルッツルの状態です。なのでシーンの外、どこか遠くにある太陽が映るようになっているんですね。

「じゃあ、『Directional Light』を増やせば10個ぐらい太陽が映り込んでいる表現もできるのでは?」

と思われるかもしれませんが、実はピクセル単位で影響を及ぼせるライトの数は決まっているんです。Projects SettingsのQuality画面で設定できるPixel Light Countによって制限されているため、これを超えるライトが配置された場合、ピクセル単位での計算ではなく、近似値での計算になります。今回のケースだと、太陽として描画されなくなるんです。

 

……マニアックな話になってきましたが、マニアックついでにSkyboxとの連動についても。

『Directional Light』は太陽光の効果を発揮するライトだと述べましたが、これはSkyboxと相乗効果を発揮します。

LightingウィンドウではSunという設定項目があり、ここではシーン内で太陽として扱われる『Directional Light』オブジェクトを設定することができます。デフォルトだとシーン作成時に存在してる『Directional Light』がセットされています。

太陽として扱われる『Directional Light』はTransformのRotationを使って角度を変更することで、Skyboxに描画されていることを確認できます。(この確認については、カメラを回してもよかです)

複数の『Directional Light』が存在する場合、物体の表面には映り込みますが、Skyboxに描画されるのはSunとして指定した『Directional Light』だけです。

Skyboxに映る太陽
Skyboxに映る太陽

 

そのまま角度を変えると、地平線より低くなったあたりから夕暮れのような表現になります。Sunとして設定した『Directional Light』はSkyboxの色合いまで変えてしまうんです。

夕闇
夕闇

 

こんな感じで『Directional Light』はシーン全体に影響を与えるライトです。特に理由がなければ、最初から存在している『Directional Light』の色を変えたり、角度を変えたりするぐらいで事足りると思います。というのも、増やしすぎると影響がでかいんですよねぇ。

Point Light

Point Lightのオブジェクトを作成します。電球マークを見ると嬉しくなりますね(ロマサガ脳)

Point Light
Point Light

 

『Point Light』は直訳すると点光源で、全方位に光を放射します。設定項目のRangeの範囲内で光が与えられ、中心から遠ざかるほど光の強さが弱くなります。現実の電球に近いイメージ。

『Directional Light』の影響をダイレクトに受ける屋外だとちょっと分かりにくいので、室内で使うと分かりやすくていい感じです。電球マークの色はライトの色に合わせて変化します。

豆電球でぼんやりと
豆電球でぼんやりと

 

光の強さや間接光の強さも設定できます。間接光の強さを1以上にすると、跳ね返った後の光がちょっと明るくなるため、画面全体が明るい雰囲気になります。

結構強めの光源
結構強めの光源

 

パフォーマンスが許すのであれば、影の描画を行うとそれっぽく見えます。光の表現では影が無いと平面的になってしまうため、なるべく影を描画したいところ。モバイル向けゲームだといつも悩みます。

また、Sceneウィンドウでは豆電球マークが表示されていますが、ゲーム画面では何も無いところから光が発生しています。照明器具などから光が放射されている様子を作成したい場合は、そのオブジェクトと重ね合わせるようにするとGood。

Spotlight

Spotlightのオブジェクトを作成します。

Spotlight
Spotlight

 

『Spotlight』は照射範囲と照射の向きを持ったライトです。こちらも現実のスポットライトをイメージするといいかも。

スポットライトを当てる
スポットライトを当てる

 

直接光の強度マシ間接光の強度マシマシ
直接光の強度マシ間接光の強度マシマシ

 

スクリプトを使えば動く物体をスポットライトが追いかける様子も表現できます。

ボールを追いかけるライト
ボールを追いかけるライト

 

スポットライトにアタッチするスクリプトは上記のようになっています。targetにSphereオブジェクトをセットし、Update()の中でスポットライトの向きを指定しています。LookAt()メソッドは引数に渡した位置を向くようにtransform.rotationをセットしてくれる便利メソッドです。

 

スポットライトはプレイヤーとなるオブジェクトから照射するといいかもしれません。レース系のゲームだったら車のフロントライトになりますし、ホラーゲームだったら主人公が持っている懐中電灯としても使えます。

Area Light

Area Lightのオブジェクトを作成します。

Area Light
Area Light

 

Area Lightは長方形または円形の光源から放射される光です。ライトの向いている方向に一様に光が放出されます。

長方形や円形の大きさはInspectorウィンドウから設定可能で、シーンの大きさに合わせて自由に変更できます。

光の広がり方や混ざり方がゆるふわ感のある柔らかな表現になるので、繊細なライティングが可能です。反面、計算量が多くなるため、事前にライトを焼き込んでおくベイクでのみ使えるようになっています。

柔らかい光
柔らかい光

ライティング環境の作成

こちらはライトそのものではなく、ライトの環境に関するオブジェクトを作成します。

Reflection Probe

Reflection Probeのオブジェクトを作成します。

Reflection Probe
Reflection Probe

 

『Reflection Probe』は配置した位置から見て、周辺の様子はどのように見えているのかの情報を保持するオブジェクトです。

物体に何かが映り込む時って、その周りのものが映っていますよね。その情報を保持しておくことで、この『Reflection Probe』オブジェクトの近くを通る物体が参照できるようになっているんです。

「このオブジェクトから見て周りはどのように見えるのか?」というのを毎フレーム計算していたら、地獄めいた計算量になってしまい、ゲームの動作に支障をきたします。なので、事前に参考情報を置いておき、少ない計算量で物体への映り込みを表現するんですね。

試しに、上で紹介したSpotlightの配置を使って、『Reflection Probe』を作ってみます。

スポットライトを例に
スポットライトを例に

 

メニューから作成すると、以下のように『Reflection Probe』には周辺の情報が映り込んで表示されています。

この位置から見た周りの情報
この位置から見た周りの情報

 

これで画面全体を見ると……。

映り込んでる! ……けど違和感が
映り込んでる! ……けど違和感が

 

なんか違和感があるなーと思ったら、右の球に自分自身が映り込んでいますね。君には映らないはずです。

なので、画面内の各オブジェクトには映らないようにしましょうか。Inspectorウィンドウから、SphereオブジェクトのMesh RendererでReflection Probeをオフにします。

Reflection Probeの影響を受けるかどうかの設定
Reflection Probeの影響を受けるかどうかの設定

 

ひとつだけ映り込みをさせたい球体オブジェクトを用意し、そこにReflection Probeの内容を表示するようにしました。これなら上の画像に比べて自然ですね。『Reflection Probe』オブジェクトの位置は緑の球と同じ位置にしています。

映り込ませるオブジェクトを用意
映り込ませるオブジェクトを用意

 

ゲーム実行中にリアルタイムにReflection Probeの情報を生成することも可能です。が、実はこれ、6つのカメラでそれぞれの方向を映して画像を取得しているようなものなので結構重いんです。毎フレーム更新とかにすると激重さんなので使いすぎには注意。

リアル感とパフォーマンスはいつもトレードオフなんですよねぇ……。

Light Probe Group

Light Probe Groupのオブジェクトを作成します。ひとつのグループで1オブジェクトです。画像ではちょっと分かりにくいですが、デフォルトでは立方体の頂点に黄色い球が配置されています。

Light Probe Group
Light Probe Group

 

『Light Probe Group』はオブジェクトの表面ではなく、何も無い空間を通るライトの情報を保持します。

通常、Staticではないオブジェクトの場合、間接光の影響を受けずに直接光の影響だけを受けます。壁に反射した光などが影響しないため、ちょっとチープな映像になっちゃったりします。

しかし『Light Probe Group』を使ってその空間を通過している光の情報を格納しておくことで、オブジェクトがその空間を通った時に光の影響を与えることができます。うまく調整すれば全体が調和した雰囲気になるため、画面の表現力が増します。

『Light Probe Group』では黄色い球で囲まれた空間(4面体)ごとに光の情報を格納します。なので、ポイントが多ければ多いほど細かく光の情報を保持できますが、もちろんその分パフォーマンスに影響が……。下の画像ほどまで増やすと大変なので、Unityのチュートリアルを参考にしつつポイントの数を調整してくださいな。

Light Probeのポイントを配置する
Light Probeのポイントを配置する

 

試しに『Light Probe Group』が無い場合とある場合で動くオブジェクトの見え方がどう異なるか見てみましょ。

Light Probe Groupなし
Light Probe Groupなし

 

Light Probe Groupあり
Light Probe Groupあり

 

なしの方は地面からの照り返しが球体オブジェクトに描き込まれず、スポットライトに照らされた部分だけ明るくなっています。

一方ありの方は、地面からの照り返しの影響が球体オブジェクトにも描き込まれています。間接光の強さを結構強めにしているので、結構明るいですね。壁にもスポットライトの色が描き込まれるくらいの強さなので、ボールの明るさはこれくらいが妥当かもしれません。

 

この『Light Probe Group』は、動いている物体が発光しているマテリアルの光を受け取るためにも使われます。マテリアルには『Emission』の設定項目があり、ここで指定した色と強度の光が放出されます。この光はStaticのオブジェクトか『Light Probe Group』がある場合にしか受け取れないので、動いている物体にマテリアルの光を届けたい場合に必要になります。

例えば、以下のように部屋の四隅に赤、黄色、緑、青の発光するオブジェクトを配置します。この部屋にライトはなく、部屋の壁、床、発光オブジェクトはStaticにしてあります。中央にいる球体オブジェクトはStaticではありません。

四隅に発光マテリアルを配置
四隅に発光マテリアルを配置

 

この状態で、『Light Probe Group』の有無で球体がどのように見えるか確認してみましょ。

Light Probe Groupなし
Light Probe Groupなし

 

Light Probe Groupあり
Light Probe Groupあり

 

この部屋にはRealtimeのライトが無いため、動いている球体オブジェクトは真っ暗になっているんです。『Light Probe Group』が無い状態だと光を発しているライトが無いのと同じ扱いなのです。マテリアルの光も映っていませんし、光っているオブジェクトとの不整合が気になります。

『Light Probe Group』があれば、その空間での色がすでに記録(ベイク)されているため、動いている物体がその空間を通った時に、発光しているマテリアルの光の情報を受け取ることができます。上のGIFだと発光体に近づいた時に対応する色が映っています。

 

動いている物体にも間接光の影響を与えたいなら『Light Probe Group』を使う! とだけ覚えておけばOKです。

まとめ

このページではメニューバーの『GameObject』から作れる『Light』の項目について解説を行いました。

ライティングは3Dゲームでは非常に重要なので、是非ともこれをきっかけに知識、理解を深めて、あなたのゲームで最高の表現を行なってください。

ライティングネタは書いていて楽しいからついつい長くなってしまいますね。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?