いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Unityで環境光の強弱をコントロールする、今と昔のゲームプログラミング

 Unityでゲーム作成中!……なんですが、細かなところであちこちつまずきます。

 「環境光」というのがあります。ゲームの世界を照らす灯りが必要ですが、直接光、環境光と2種類あります。直接光は光源から直に当たる光です。環境光は、光源からの光が直に当たらなくても、あちこちに反射した光のおかげで物体が何となく明るくなる効果を出します。本当にあちこちで反射する光の進路などを計算していたら大変なことになりますから(物体の表面の形状、複数回反射する光も考えなければならない等)、全体を一律、いくらか明るくすることでよしとしてしまう考え方です。Unityではこの環境光の明るさを指定できます(もちろん直接光も)。

 メニューで、Window → Rendering → lighting と進むと設定画面が出ます。その中の、次の部分を見てください。

f:id:Inuosann:20210216211437p:plain

赤で囲ったところを調整して、環境光の強さを指定できるのです。

 ところが、なぜか場合によってこの操作の効き目がまったくないことがあります。つまみを動かしても明るさが変化しないのです。ネットで探しても見当たらないし、みんな困っていないのかな……と、いろいろ試していたら……

f:id:Inuosann:20210216211506p:plain

同じパネルの、赤で囲った部分(↑写真を見てください)をクリックすると、Unityは「おっ、ヤバイ!」という感じに何か内部で作業をして、何秒かでパッと明るくなりました。それならそうとどこかに書いておいてくれればいいのに(書いてあるのかも知れないけれど)、相当悩みました。ひょっとして勘違いかも知れませんが、環境光の調整ができないプロジェクト2つで確認できたので多分大丈夫でしょう。これで同じ悩みを抱えた皆さんは助かるはずです!!

 Environment Lighting、Intensity Multiprierの用語でも検索できるよう、←ここに書いておきます……。

 

 1日ごとに知識が確実に増えて、できることの幅が広がります。充実感が違います。シューティングなので、照準の操作、自分が弾を発射、あたりから始めています。前には自分で細かなところまで作らなければならなかった部分を、Unityがあれこれやってくれています。シューティングゲームなどでは、オセロとは違って1秒間に何十回も画面を更新しなければなりません。そのため、プログラマはゲームループというのを作ります。実際にwhile文(プログラミング言語で、ループすることを指定する命令。これはC言語などの命令です)などでループにするのです。1秒間に何十回もこのループを回り、ループするごとに時間がどれくらい経ったか調べてキャラクタを動かす距離を計算します。しかし、Unityではゲームループを書く必要がありません。何もしなくても1秒間に何十回もコールされる関数(Update()関数)があり、キャラクタの移動などの処理はそこに書けばよいことになっています。もっと簡単なところでは、さっき画面を更新してからどれだけ時間が経ったか、プログラマは Time.deltaTime という変数を調べるだけで分かります。昔は全部自分でやっていました。

 これでいいのか。いや、楽になったのだからいいことだと思うんですが……。確かにゲームプログラミングのハードルは下がっています。ただ、弾の連射はキーを押しっぱなしにしても0.5秒に1発までとか、時々編隊を出すとか、結局自分で管理しなければならないことが山ほどあります。その辺は昔と変わりません。今、ゲームを書ける人は昔でも書けたのだろう思います。