【Unity】Sceneが真っ暗にならないのは環境光が原因

Unityを使っていると、シーンを真っ暗にしたいことがあります。
例えば光の入らない室内で、部屋の明かりだけを表現したり。
でもシーンを作った時にデフォルトで存在する『Directional Light』オブジェクトを非アクティブにしたり、上を向けたりしても簡単には真っ暗にならないんですよね。
なので暗くする方法をいくつか試してみましょ。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
20XX年、世界は闇の炎に包まれた——
実は、シーンを暗くする方法自体はテラシュールブログさんに載っています。
このページでは、上記の記事を参考にさせてもらいつつ、Unity2018を使っていろんなパターンを試してみたいと思います。
今回闇に飲まれるシーンはこちら。

Sphere、Cube、CylinderがPlaneの上に置かれているだけのシンプルなシーンです。今はまだ明るいので分りにくいですが、実は真ん中のCubeだけスポットライトに照らされています。
マテリアルのEmissionは無しにしてあるので、外部の光源から照らされないと見えません。
このシーンに様々な方法で闇をもたらします。方法によっては光の勢力が勝ってしまうこともあるので注意。
ライトを消す
一番真っ先に思い付くのがライトを消す方法。
シーンを作成した時には、デフォルトで『Directional Light』オブジェクトが作成されるため、これを非アクティブにします。

ライトを消せば真っ暗になりそうなものですが、残念ながらそうはならないんですよねぇ。

ライトの向きを変える
『Directional Light』オブジェクトをアクティブに戻して、今度は向きを変えてみます。真下から照らすように、RotationのXを[-90]に変更。

背景は見えなくなりました。が、画面左のSphereを見ると、下面に太陽らしきものが映っちゃってます。

スポットライトの照り返しであることに期待を込めつつ、そのスポットライトを消してみましたが、やっぱり太陽光を受け取ってました。地面を貫通しちゃうんですね。光の勢力、恐るべし。

壁で覆う
光が入らないように壁で覆ってみるのはどうでしょうか。
『Directional Light』オブジェクトのRotationのXをデフォルトの[50]に戻してから、壁を用意してみます。
前後左右、それに上下を覆ってみましたが、綺麗に光を透過していますね。

壁で覆ってライトを消したらいけるかな……?
うん、無理だよね。

壁で覆って、さらにライトを上向きにすると……こちらもダメでした。やっぱり床を貫通して天井に光が当たってしまいますね。

Lightingの設定を変更する
このまま壁は残しつつ、『Directional Light』オブジェクトの設定をデフォルトに戻します。
ここでついに『Lighting』ウィンドウを使って、環境光をいじります。メニューバーの[Window]から[Lighting] -> [Settings]を開きます。

『Lighting』ウィンドウには設定項目がいっぱいあってビビりますね。今回使うのは、『Scene』タブのEnvironment(環境)のエリア。Environment Lightingの下にあるIntensity Multiplierと、Environment Reflectionsの下にあるIntensity Multiplierの両方を[0]にします。何回Environment言うんですか。

この状態で画面を見るとこうなります。あと一歩まで近付いた感じ。

あとは……また『Directional Light』オブジェクトを非アクティブにしましょうか。光源はスポットライトだけ。これで闇に飲まれました。

でも壁を外すと……
壁オブジェクトを非表示にすると、背景が見えてしまいました。

こうなったら、あとはカメラもいじっちゃいます。『Main Camera』コンポーネントを選択し、Clear Flagsから[Don’t Clear]を選択します。

Clear Flagsは、ざっくり言うと背景の描画をどうするかの設定です。カメラに映っているオブジェクトはそのまま表示されますが、それ以外の部分はカメラの描画対象ではありません。
オブジェクト以外の部分をクリアする(=透明にする)ことで、背景にあるSkyboxだったり、単一色が表示されるんです。
さて、ここで選択した『Don’t Clear』は、オブジェクト以外の部分を透明にしないという意味。ってことは、光の当たっていない部分は真っ黒になるんです。カメラにはそう見えているので。
この状態で画面を見るとこうなります。背景が見事に映らなくなりました。

あとはスポットライトも消しておきます。
こうして光の勢力を討ち果たし、闇が溢れる静寂のUnity世界が守られました。

なお、ゲーム画面では真っ暗になっていますが、『Scene』ウィンドウでは背景が描画されているのでご注意を。カメラのクリアフラグは、『Game』ウィンドウに表示される時に使われます。

世界に闇をもたらすのに必要なイベント
上記の実験結果をまとめてみましょ。
やること | 屋内 | 屋外 |
ライトを非表示 | 必要 | 必要 |
Lighting設定を変更 | 必要 | 必要 |
カメラのクリアフラグを変更 | 不要 | 必要 |
ライティング関係はいじるところが多くて若干混乱しますが、ポイントさえ押さえれば、実は3ステップで闇をもたらすことができるんです。
ここに自分で設定した光源を配置すれば、狙った演出がやりやすくなります。
まとめ
Unity世界に闇をもたらす方法を色々と実験してみました。
ポイントはLighting設定の変更と、カメラのクリアフラグの変更あたり。
特に室内の光源だけで画面を演出したい時には、闇の設定は大事です。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】せっかくチュートリアルがあるのでWheel Colliderで遊んでみる 2018.05.21
-
次の記事
【Unity】動かないオブジェクトはStaticにして光をBakeさせる 2018.05.22
[…] 【Unity】Sceneが真っ暗にならないのは環境光が原因 […]