見出し画像

VRChatのワールドにおける昼夜(もしくは明るいところ・暗いところ)の切り替え方について

(06/17 表現含め色々加筆/修正、大まかな内容は一緒です)

はじめに


ワールド制作初心者から『スカイボックスを暗くしたのに部屋の中が明るいのをどうしたらいいですか?』とか『昼と夜切り替えたいんですがどうしたらいいですか?』という質問が度々なされます。

Unityにおける昼夜の切り替えは地味に設定すべきことが多く、本当に始めたばかりの初心者には難しいポイントだと思っています。ですが、やってみたい人も結構多いのではないでしょうか?

そこで今回のワールド製作者向けの記事では、切り替えの注意点や設定項目について解説していこうと思います。

何故難しいのかについて


Unityを使ってワールドを作る時というのは、基本的にHierarchyとScene画面とInspectorを行き来するだけで完結しているのですが、光源においてはそうではないのが難しいポイントかなと思っています。

一般的にこの画面上で解決するものが、光源ではそうではない

Unityには光源としてLightコンポーネントというのがあります。このLightコンポーネントのついたゲームオブジェクトを置くことで、光源を配置していくことが出来ます。

これはLightのDirectional
Lightコンポーネント

ところが、これとは別に全体的な環境光・反射光というものがあり、これはHierarchy上でいじることが出来ません。

どこで設定するのかというと、上のメニューのWindows→Rendering→Lightingと押していくと出てくる、LightingウィンドウのEnvironmentタブで行います。ややこしいですね。

ここを押して
出てきたウィンドウのこのタブで調整

このように設定箇所が大まかに2か所に分かれているので、あまり直感的ではないというのが初心者を困惑させる要因の一つかなと考えています。

またVRChat内でEnviromentタブの項目を直接切り替えるためには、Udonを使ったギミックが必要になります。これについても教えてもらわなければ分からないポイントだと思うので、躓きポイントの一つかなと思います。

それにライトベイクも行っているとすれば、ライトベイクのデータも場合によっては切り替える必要があります。

そのように、実は昼夜の切り替えについては、気を配るべきところや設定することが多く、意外と大変だったりします。……が、まぁそこら辺の手間を知らないと、挑戦して挫折してしまうのが初心者によくあるあるなのではないかなと思います。

具体的な説明に入る前に

この記事ではこの後の大部分で昼夜の切り替え方法について説明していくつもりですが、もし昼と夜で別ワールドにしてもいいとあなたが思うのであれば、そちらをお勧めします。

理由としてはそちらのほうが圧倒的に楽ですし、ワールド容量的にも多少優しいかなと思います。といっても、本当にやりたいと思っている人は納得できないと思うので、ひとまず読み進めていってください。

ワールドの分け方をご存じなければ、以下の記事を見てみてください。2000字程度なので、あっさり読めると思います。

また、単に視界を明るく、または暗くしたい場合はもうちょっと簡単にできます。PostProcess(ポストプロセス)かシェーダーでやる方法が一般的な気がしますが、シェーダーのほうが比較的簡単です。

寝る用のシェーダーを適応した箱型のオブジェクトを、プレイヤーの頭に被せるだけです。以下のBoothのサムネイルを見るとイメージが付きやすいかもです。

これを、スイッチを組み合わせればパッと暗転したりというのが可能です。それにプラスしてShaderのパラメータの操作をAnimationによって行えば、徐々に暗転したり、明るくなったりもできます。

ただし半透明のShaderなので、オブジェクトの描画順によっては貫通されることもあります(上記シェーダーはかなり極端な設定にしてあるので、まず貫通されることはないと思いますが)

一方でPostProcessは最後にかけられるエフェクトなので、基本的に貫通されることはありません。そしてかなり色々なエフェクトを掛けることが出来て、リッチです。

ですがQuestでは使えないという弱点があります。また、セットアップの仕方が若干複雑で覚えるまでに少し時間がかかるかもしれません。

加えて、エフェクトをパッとオンオフする分には問題ないのですが、徐々に値を切り替えたい場合は各エフェクトの効果量を調整するのではなく、エフェクト全体としての効果量(Weight)を調整したり、優先度(Priority)をつけるあたりが、あまり直感的ではないかもしれません。

以下の記事は結構古いですが、VRCTrigger(昔VRChatで使われていたギミック関連コンポーネント。今は廃止済み)のくだりの手前までは今でも全く変わらないので、参考になる部分があると思います。今はVRCTriggerの代わりにUdonが使われています。

昼夜の切り替えるときに注意すべき項目について

昼夜の切り替え方と言っても、現実みたいに滑らか~に切り替わっていくやつは中々贅沢で手間がかかります。ということで『スイッチをポチっと押すと夜(または昼)になる』というのを想定したいと思います。

まず具体的に気にすべきものを列挙すると、以下の通りです。
①     Environment Lighting
②     Environment Reflection
③     Reflection Probeコンポーネント
④     Lightコンポーネント
⑤     マテリアル(シェーダー)
⑥     ライトベイク

それぞれ、何ぞや?っていうのと、気にしなきゃいけない理由をまず解説していきたいと思います。

Environment Lightingについて


日本語にして”環境光”……なのですが、あまりピンときませんよね?

私は独学で学んできたので確信を持っては言えませんが、これは多分CG(Computer Graphics)特有の言葉なので、VRChatでUnityを始めた初心者が知らないのは当然だと思います。

現実では光の反射などによって直接光が当たっていない場所も明るいことがあると思います。机やソファーの下なども真っ暗ではなく、微妙に明るさがありますよね?

光には回折したり、物に当たって反射する性質があるので、光が直接当たっていないところにも回折・反射した光が届きます。

Unityでも同じであってほしいところですが、全ての光を正確に計算するのは個人が持つパソコンには難しいものがあります。

そこで疑似的な明るさとして、影に明るさ(色)を付けてしまおうというのが環境光です。

光源は1つだけですが、影になってる部分も真っ黒ではありません

ところがこの環境光は物体の遮蔽を考慮しないので、屋外だろうが室内だろうがお構いなしで影響してきます。結果として、光源がない室内が明るいということも設定次第で起こりうるので、正しい設定を心掛ける必要があります。

真っ暗な室内であったとしても環境光の明るさは一定

UnityのEnvironment LightingはLightingウィンドウのEnviromentタブにあります。

いくつかのモードがありますが、デフォルトはSkyboxになっています。そのため明るいスカイボックスを設定したワールドに、暗い部屋を置こうとすると、部屋の中(の影の色)が明るくなってしまいます。

箱の影になる部分が不自然な青みがかった明るさになっているのが
分かると思います。

個人的なオススメはGradientです。空、地平線、地面……つまり上・横・下からの明るさとして、3方向の色を指定することが出来ます。指定した色はUnityが勝手にブレンドしてくれます。

残りの一つはColorで、これは単色で指定するモードです。シンプルなモードですね。

環境光をGradientにして一安心……と思うかもしれませんが、いくつか注意点があります。

Unity標準のライトベイクシステムでは、このEnvironment Lightingの色や明るさを加味した状態でベイクして、ベイクされている間はEnvironment Lightingを無効化してしまいます。
つまり一度ベイクしたあとにEnvironment Lightingの色や明るさを変更すると、ベイクしているオブジェクトとしていないオブジェクトで差が出てしまいます。

有料のライトベイクシステムであるBakeryは、このEnvironment Lightingを加算せず無視した上で無効化します。このEnvironment Lightingの代わりとしてBakery Skylightコンポーネントというのがあるので、しっかり配置してベイクしましょう。
(詳しくは下の記事に書いています)


Environment ReflectionとReflection Probeコンポーネントについて


この二つは密接に関係しているので、まとめて説明しようと思います。

現実では鏡面や金属の表面には反射した景色が映っていますよね?また、ざらざらした物体であっても、近くにあるものの色を反射していることっていうのはよくありますよね?

筆者の真空断熱タンブラーの表面。
右側に周りの物体の色がついています

基本的には多かれ少なかれ、物体は光を反射しているわけです。

これも先ほどの環境光の話と同じで、この反射する景色をいちいち計算していたらキリがないです。ですので、Environment Reflectionも疑似的に反射する景色を特定の景色にしてしまおうという機能になります。

Environment Reflectionは先ほど説明したEnvironment Lightingのすぐ下にあります。

デフォルトがSkyboxになっているので、明るいSkyboxのワールドでテカテカしたマテリアルが室内にあると、明るいSkyboxが反射する景色になっていて不自然になってしまいます。

このように天井に遮られていても、下の金属物質には
明るいスカイボックスが映ってしまいます。

ところが、Environment Reflectionのもう一つにCustomモードがありますが、こちらも全体的な反射する景色をテクスチャで設定できるだけで、特定のエリアで特定の景色を反射させるということが出来ません。

では、どのようにして変えるかと言いますと、Reflection Probeを配置します。Reflection Probeにはその影響範囲内にあるオブジェクトの反射する景色を上書きする機能があります。

したがってオブジェクトが反射する景色は、Reflection Probeを置いている場所はそのReflection Probeの景色が使われて、置いていない場所はEnvironment Reflectionに設定した景色が使われるようになっています。

ですので、暗いエリアの場合はキチンと暗いReflection Probeを、明るいエリアの場合は明るいReflection Probeが必要になってくるわけです。

オススメの設定方法などは以下の記事で紹介しているので、読んでみてください。ここでは割愛します。

Lightコンポーネントについて

これについてはあまり気にするべきことはない……と書こうと思ったんですが、”超”が付きそうな初心者も居るかもしれないので、少しだけ丁寧に書きます。

Unityの光源には4つのモード(Directional、Spot、Point、Area)と、RealtimeとBakeとMixed、影なし(No Shadow)と影あり(Soft Shadow、Hard Shadow)があります。ざっくりと説明していきましょう。

まず、4つのモードについてですが、これは光の出方を表しています。Directionalは太陽光のイメージで一様に特定の方向から降り注ぐ光です。Spotはスポットライト状の光で0~180までの角度を決めることが出来ます。Pointはある点から全方向に放射状に出ている光になります。最後にエリアライトは面光源で、ある平面に沢山のスポットライトが並んでいるようなイメージです。エリアライトは重たいので後述するベイクでしか扱うことが出来ないという特性を持っています。

Area以外はアイコンで何となく伝わると思います

次に、RealtimeとBake(ライトベイク)についてですが、前者は光の変化を常に計算する負荷が重い方法で、後者は事前計算で光と影を焼き付けておく負荷が軽い方法です。ただし、前者は簡単にオンオフしたり光源の位置を動かしたりできますが、後者は焼き付けて固定しまうのでそこら辺の融通は利かないです。
Mixedは近いところがRealtimeで、遠いところはBakeに切り替える機能です。

最後に、影なしと影ありについてです。Unityは光源ごとに影の計算を行うかどうかを決めることが出来ます。当然影があるほうが重たく、影が無いほうが軽いです。
ここで注意してほしいのは、”影が無い”というのは光を貫通するということです。つまり、壁とかがあっても全く遮蔽されずに光が通り抜けていきます。結果として、壁や屋根があっても室内が明るくなってしまうという現象は、影のないライトでは起こってしまいます。

さて、Lightコンポーネントの特性については以上ですが、このLightコンポーネントの結果は幾つかの設定に影響を受けます。

まずオブジェクトのMesh RendererにはCast Shadow(影を落とすかどうか)、Receive Shadow(影を受けるかどうか)の設定があり、これによって影の結果が変わります。ようはオブジェクトごとに影について決める項目があるわけです。

また、レイヤーと呼ばれる機能があり、このレイヤーの設定によっては光の当たる・当たらないが決まります。これはLightコンポーネントにも、各オブジェクトにも設定する項目があります。詳しくはレイヤーの記事に書いています。

マテリアル(シェーダー)について

先ほどまで光源や反射といった、光にまつわる話をしましたが、マテリアルについても気にする必要があります。何故ならそういった光の計算を一切しない……つまり光の影響を受けないシェーダーが使われている場合があるからです。

そのような光の影響を受けないシェーダーは一般的にUnlitシェーダーと呼ばれています。

Unityのシェーダーを選ぶところにも
Unlit系のシェーダーが最初から用意されています。
陰の中でも真っ白なのは、
光源の計算をしないので、影の計算もしないからです。

一方で現実世界の法則をベースにして光の影響を出来るだけ模倣するようにシェーダーはPBR (Physical Based Rendering、日本語では物理ベースレンダリング)シェーダーと呼ばれます。

UnityのStandard ShaderはPBRの考え方に基づいているので、ここまで説明したような光の影響を受けます。ですので、一般的にStandard Shaderを使っていれば、ここまで説明した内容をきちんと設定するだけで、そのシチュエーションにマッチした見た目になります。

ですが、Unlitなシェーダーを使っていた場合、ここまで説明した光の影響を受けませんので、朝になろうが夜になろうが同じ色合いになってしまい、馴染まないことがあります。

ですので、そのようなシェーダーについてはシチュエーションごとに、マテリアルの色を変えてあげる必要があるかもしれません。

ライトベイクについて

ライトベイクって何?って方はちょっと長めですが以下の記事を読むとスッキリすると思います。『ライトベイクの良いところ』って項目までで大丈夫です(約3000字程度)

で、ライトベイクが何か分かった人は光と影をテクスチャとして焼き付けちゃうので、固定の明るさになってしまうんだなーっていうのが分かると思います。

で、メンドクサイことにUnityに標準でついているライトベイクシステムでは、ベイクしたテクスチャを切り替える機能などはありません。この切り替えにはShaderまたはUdonの力を借りる必要があります。
(正確には普通のゲームならただSceneを切り替えればいいのですが、VRChatは1つのSceneしか使えないので、特有の難しさが存在しているのかな~と思っています)

一応有料アセットであるBakeryを使用すれば、ライトベイクを分けることが可能になりますが、今(2024年)は円安の影響で辛いものがあります。セールを待って半額になっても懐になかなか痛いです。

とはいえ、ライトベイクを使わずに全ての光源をリアルタイムでやるのは、光源やオブジェクトの数にもよりますが負荷的にも無理がありますし、出来れば使いたい機能ではあります。

あと昼間のアセットで、ライトプローブ(LightProbe)というものが配置されていると、夜にしてもアバターだけが明るいケースが出てきます。こちらはライトベイクの明るさを参照して、ライトベイクしていないオブジェクトに明るさを反映するものです。

ただし、ライトプローブデータはBakeryでは別々に焼くことはできません(そもそもライトプローブに関してはUnityのシステムを使ってるだけで、Bakery側で独自のシステムは用意されていません)

スクリプトによってデータを出力することが出来るようなので、Udonで編集可能な範囲であれば差し替えられるかもしれませんが、消してリアルタイムライトでアバターの明るさを調整する形が一番素直で楽だと思います。

初心者にも(ぎりぎり)出来そうな切り替え方法について

さて、ここまで随分文章を割いて説明してきましたが、きちんとやろうとするとこれだけ気を付けるところがあり、物によっては切り替えるのにShaderやUdonの力が必要になりますので、あまり初心者向きではなさそうだなという雰囲気を感じたかもしれません。

ですが、折角ここまで読んでいただいたので、諦めろとは言いません。
初心者の技量で出来そうな範囲で、やり方を考えていきたいと思います。

とはいえ空想上でこうすれば、ああすればなどと偉そうに言っていると、実際できなかった時に申し訳ないので、実際にやってみることにしました。

使用したワールドアセットは"Room_HiddenApartment"をお借りしています。

ShaderとUdonとAnimatorは自作しないこと、という縛りのもと早速やっていきましょう。

まずは実際に出来るということを示すために、動画を録画しました。最初声有りでやったのですが、40分掛かってしまったので解説無しで淡々とやっています。約12分ほどになります。

以降は動画からの切り抜きに解説を付ける形で進めたいと思います。

先に結果をお見せしましょう。

昼間

これをスイッチで切り替えるようにするのが最終目的です。
では早速進めていきます。

まず各所でついているライトは、昼間も付けておく設定にしましょう。
こうすることで、各所でついているライトはライトベイクすることが出来るので負荷が軽くなります。

今回使ったアセットは夜を想定して作成されているので、既にあるベイクデータをそのまま使えます。昼間のアセットの場合は……自分でベイクしなおす必要があるかもしれません。

家の中のランプ等がベイクされてるとやりやすい

太陽光はRealtimeの影付きDirectionalライトで表現して、必要に応じてオン・オフしたり、傾けたりすることで時間帯を表現します。

弱点としては影付きのリアルタイムライトを使用するので、オブジェクトが極端に多いワールドだと負荷が重くなってしまう可能性があります。ですが、今回のお家アセット程度であればギリギリ問題なさそうな気配です。

右斜め上から左下に太陽光が降り注いでいます。

Directionalライトは角度で決まります。アイコンが光注ぐ感じのデザインになっていて、向きは何となくわかると思います。アイコンを見つつ角度を調整します。これでLightは終わりです。

最終的に切り替えることを考えて昼用と夜用のゲームオブジェクトを作ります。Directinalライトは昼間だけ使うので、昼用のゲームオブジェクトの下に入れました。

外にある他の建物の外壁を消すと、灰色の空があります。一般的なBoothに販売されているお家アセットに珍しいですが、このアセットにはSkyboxがありません。

一般的には空を設定するためには、Environmentタブの一番上にある項目SkyboxにSkybox用のマテリアルを割り当てる形になりますが、今回はこのままで大丈夫です。

ネットでTowelCloudと検索すると、VRChat上でいい感じに使える動く雲と空が無料で手に入ります。お得情報ですね。今回はこれを使っていきます。

TowelCloudフォルダの中によく見るとModelという名前のフォルダがあります。中を見るとVRChatterが嫌がるピンク色に染まったモデルが一つ入っています。これが必要なのでScene上にポンとドラック&ドロップしましょう。

さて、これがお空の代わりになるのですが小さすぎますね、スケールを100~1000倍して大きくしましょう。

そしてピンク色のままでは目が痛いので、先ほどインポートしたTowelcloudには様々な空のプリセットマテリアルが用意してあるので、好きなものを割り当ててみましょう。

今回は昼間の曇り空を選択しました。

イイ感じの空が手に入りましたね。ところで切り替える用の暗い空が必要ですよね?なので、今用意したゲームオブジェクトを複製し、スケールをちょっとだけ大きくしたものに夜空のマテリアルを割り当てておきます。必要に応じてこれらのマテリアルは調整してください。

これで、昼間の空を消すと、夜の空が見える状態になりました。

曇りの昼空の外側に、夜空がある状態です

さて、これで昼と夜の風景が用意できたわけですが、部屋の中の明るさが変わっていないので雰囲気が出ていません。

今回のアセットにはPostProcessが設定してあるので、PostProcessによって明るさの違いを設定していきましょう。Postprocessは画面全体に掛けるエフェクトのようなものです。
(PostProcessはPC版限定なので、Quest版はナイトモードシェーダーのようなシェーダーをオンオフして明るさを切り替えると良いでしょう)

PostProcessingという名前のゲームオブジェクトを複製します。その際にProfileというのも複製して別々にします。これで昼用と夜用二つのPostProcess設定ができました。

昼間は明るいので、コントラスト(明暗)を薄く、彩度(色の濃さ)も薄く、全体的に白いフィルタをかけてみました。

夜は暗いので、コントラストは濃く、彩度も濃く、全体的に黒いフィルタをかけています。

この時点でほぼほぼ、最初にお見せした結果のような絵が得られています。


その後シーン上にあるReflectionProbeを焼きなおしています。

正直今回は部屋の開口部が小さいのと、反射するオブジェクトが少ないので、Reflection Probeによる違和感はほぼないのですが、上の条件と真逆の場合かなり目立つので、きちんと昼用と夜用を用意しておくのが大事です。

モードをCustomに切り替えて、Dynamic Objectにチェックを入れることで全ての周りにあるオブジェクトを反射する景色として焼きこむことができます。

昼用を複製して夜用を作って、それぞれのシチュエーションでベイクしていきます。

これで一通り揃ったので、昼用オブジェクトと夜用オブジェクトをスイッチで切り替える仕組みを作ります。

一般的にLura Switchというスイッチアセットが良く使われているので、今回もそれを使いました。

Prefabフォルダの中に色々なスイッチのPrefabがありますが、今回はオブジェクト用のスイッチを選んでドラッグアンドドロップしました。

中身を見ると複雑そうに見えますが、デフォルトは下の赤線で囲った部分のオンオフがトグルで切り替わるようになっているだけです。
ですので、今オフになっている部分とオンになっている部分それぞれに、昼用オブジェクトと夜用オブジェクトを入れ込めばOKです。

SampleObjectは不要なので消したほうが良いかもしれません

また今回はそのままですが、機能の切り替えやグローバル設定の切り替えをSwitch_Objectについているコンポーネントの部分で設定することができます。

これで実際に再生ボタンを押してデバッグをした結果、問題なさそうなことが確認できています。

その後も動画は少し続いていますが、ここからは気を付けるべきことについて説明しています。

まずEnvironment Lightingですが、今回は既にライトベイク済みのアセットなので、それらに対してはこの設定が無効化されていますので、追加で置くベイクしていないオブジェクトにのみ影響を及ぼします。

追加で色々オブジェクトを置きたいと思うのが普通だと思うので、以下のように明るすぎない無難な影色にしておくと良いです。暗い分には光を当てて明るくすればいいですが、暗いはずのものが明るいと目立ちますので。

動画の最後で思い出して、出したベイクしていないキューブに対して、どうなるかを実演しています。

お次はEnvironment Reflectionですが、SkyboxからCustomに変更します。そして出てきた欄に、何も設定しません。そうするとどうなるかというと、Reflection Probeが無いところは真っ暗になります。

『え!?ダメじゃん!』って思うかもしれませんが、意外と黒色って違和感として目立たないんですよね。つまりReflection Probeで上書きできてない部分があっても誤魔化すことが出来ます。一応このようにしておくと良いでしょう。

次にソファーの黒い沁みについて着目しています。

これはベイクミスなどではなく、このアセットがUnity2019で作られたモノであることに起因しています。

Unity2019とUnity2022ではライトベイクデータの持ち方が変わったのか、2019で作られたアセットを2022で開くとライトベイク結果がズレる現象が発生します。

一般的な解決方法を調べた感じでは、ベイクしなおすのがUnity公式の推奨みたいです。

『え?でもライトベイクなんてやったことないよ!』
って人もいるかもしれませんが、安心してください。

標準のライトベイクシステムを使っている場合、そのライトベイクの設定はシーンに対して紐づけられています。そのためアセットを作った人の設定そのままで焼きなおすことが可能です。

Bakeryという一般的でないものもありますが、Bakery製のライトマップを使用するためにはBakeryを持っていないといけないため、基本的にBoothであるアセットはほぼ例外なく標準ライトベイクシステムでライトベイクされています。

そのため、みなさんはライティングウィンドウの右下のGenerate Lightingをポチっと押して、のんびり待っているだけです。

終わるとこの通り正常なソファーが現れます。基本的にアセットのまま焼きなおす場合はライトベイクを恐れる必要はそれほどありません。

あとはLight Explorerについてです。

新しく開いたプロジェクトだと何処にLightやReflection Probeがあるか分からない、ということはあると思います。
それを探し出してくれるのがLight Explorerウィンドウです。[Window]→[Rendering]→[Lighting Explorer]で開くことができます。

右上のタブを切り替えることでReflection Probeなども確認可能

今回は事前にないことを確認できていたので、影付きのリアルタイムディレクショナルライトを追加しましたが、もともとのアセットに既に同じ設定のライトがあるかもしれません。

実際、影付きではありませんが今回のアセットにもMixedのディレクショナルライトがありました。Intensityが0.01ですので、アバターの明るさを保証するためのものだと思われるのですが、Lightコンポーネントの一番下にあるCulling maskがEverythingになっていました。

このCulling maskという項目はオブジェクトに設定されているレイヤー(グループ分けのようなもの)を利用して、そのライトを当てる当てないを設定することが出来ます。詳しく知りたい場合は以下の記事を参照してください。

余計なものに光が当たっていると、その処理の分重くなってしまうので、リアルタイムライトを使う場合にはレイヤーを駆使して適切に負荷軽減を行う必要があります。

この場合ですと、プレイヤーにだけ光が当たってくれればいいので、一度Nothingを押して全てのチェックを外してから、Player、PlayerLocal、MirrorReflectionにチェックを入れればOKです。

最後に動画では載せ忘れてしまったのですが、カメラの設定について説明したいと思います。

Unityではプレイヤーの視点としてカメラが使われます。
VRChatでは悪用されないようにという目的だと思いますが、このプレイヤーの視点に直接アクセスする方法はありません。

ですが、キチンと設定を行えば、プレイヤーの視点となるカメラにいくつかのパラメータを反映することが出来ます。

そのパラメータのうちの一つとして、重要なものがClipping PlanesのNearとFarになります。

カメラを選択している時に、画面上に白い枠線の台形が表示されますが、これはカメラを視点としたときのプレイヤーの見える範囲を示しています。

この範囲外にあるオブジェクトについては描画が行われません。この台形の手前側までの距離がNearで、奥側までの距離がFarになります。

仮にFarが30とかになってしまうと、今回設定した空のオブジェクトが見えなくなってしまいます(補足:今回は直径1mの球を100倍したので中心からは50mの位置に存在しているので、30mでは描画されなくなってしまいます)

ですので、NearとFarを適切に設定したMain Cameraを用意して、VRCWorldのVRC Scene DescriptorコンポーネントのReference Cameraの欄にドラック&ドロップしてあげましょう。この手順を踏むとプレイヤーの視点に設定したNearとFarが適応されます。
(Reference CameraがNoneの場合はNearとFarはデフォルトの0.3と1000が適応されます。ちなみにPostprocessもカメラを使うのでNoneの時は適応されなくなります。注意してください)

今回紹介したやり方はほとんどのアセットで利用可能だと思います。ぜひ試してみてください。

(余談:かなりレアケースですが、アセットによってはShaderで特殊なことをしているケースもありますので、今回のように上手くいかないこともあります。その場合、シェーダーについての理解がどうしても必要になってしまうので、素直に諦めたほうがいいかもしれません)

『じゃあ滑らかに変える方法は?』

どれくらい丁寧にやるかによって難易度はかなり変わってきます。

かなり丁寧にやろうとすると、負荷周りを気にしつつやらなければいけないので、出来るならもはや初心者じゃないと思う程度には難しいかなと思います。

良く使われる方法としては、DirectionalのリアルタイムライトをAnimationで強度や色を変えつつぐるぐる回転させ、ライトの向きで空模様が変わるShader(AIO Skyなど)を使うor内側のSkyboxの透明度をAnimationで制御するという技を使います。

ここまでなら何とか出来ると思います。ただしReflection Probeやライトベイクの情報が固定されているorそもそもされていない状態だと思いますので、違和感はあると思います。さらに丁寧にやるなら次のようなことが必要になります。

・ライトベイクやReflectionProbeなどの静止している情報をShaderやUdonを駆使して、複数保持して綺麗に切り替える(参考になりそうなのはhttps://qiita.com/shivaduke28/items/ffc5795b93908f29b2d1とか)

・負荷をケアしつつ両方リアルタイムで焼く(Realtime GIやReflection ProbeのRealtimeモード)などをする

そこら辺を私なりに丁寧にやったのが、以下のワールドです。どの程度まで出来るのかを理解する一例になると思います。

私のこのワールドではPC版でRealtime GIとRealtimeモードのReflection Probeを採用していて、Quest版では朝・昼・夕方・夜の4つのライトマップとReflectionProbeをShader内で保持する独自Shaderを書いて何とかしています。

Skyboxは2重構造の球を使っていて、昼は内側にUnityアセットストアのAIO Skyを独自に改造したもの、夜は外側にAyanoさん謹製のAySkybox_StarrySkyを独自に改造したものを用意し、その隙間に3Dオブジェクトの月を置く形を取っています。

あとはRealtimeライトをAnimationで色と強度変えつつぐるぐる回しつつ、内側のAIO Skyを時間帯に応じて透明にしていったりしています。

まぁ上で説明したことを全てやっているだけですね。はい。

おわりに

随分と長く、ボリューミーな記事になってしまいました。

たまーにさらっと『どうやるの~?』って聞かれても、『あ~えっとね……うーん』ってなる気持ちを分かっていただけたらこの記事を書いた甲斐があるというものです。

ただ、そのような質問をしてくれた人に対して、『それは難しいから止めたほうがいいよ』とか『もうちょっとワールド制作に慣れてからのほうがいいよ』などの台詞を投げつけるのは、ちょっと勿体ないかなと思っています。

挑戦するのは自由だし、結果挫折したとしても経験として生きてくることもあります。

ですので、もしこの記事を道標として、素敵なワールドが出来上がることがあれば、私は間違いなく喜ぶでしょう。

先ほど説明したEnvironment LightingやEnvironment Reflectionもそうですが、パソコンの能力は有限なので、3DCGでは疑似的に同じように見えるような仕組みで絵を作っていることがあります。ですので、現実と同じようになってくれると思っていると、その違いに惑わさせられることでしょう。

キチンと仕組みを理解して、惑わされないようにしましょう。
以上で締めたいと思います。長文読了お疲れさまでした!


この記事が気に入ったらサポートをしてみませんか?