見出し画像

VRChat 時間とともに動く太陽の作り方と負荷軽減

*********************************************************************************
* 注意 *
この記事で記述している内容は古く、2023年以降では非推奨な方法が書かれています。参考として記事は残してありますが新しくワールド作成する場合には他の記事を参考にしたほうがよいです。
*********************************************************************************

こんにちは!Klueleです。
4月からのワールド「water pool park」作成も落ち着いてきたので、作成する中で悩んだことなどを記録していきたいと思います。
water pool parkでは、時間とともに太陽が動き、昼や日没や夜といった時間の移り変わりが見えるようになっています。これは主に「AIO Dynamic Sky」というUnityアセットの機能により実現しています。

以下の順番で作っていきます。

1.AIO Dynamic Skyをプロジェクトにimportする
2.ScenesのHierarchyにDirectionalLightを追加する
3.Lighting>Setting>Sceneタブ>Environment>Sun Sourceに上記2で追加したDirectionalLightを指定する
4.上記2で追加したDirectionalLightを①Animation または②物理演算 などの方法でRotation Xの数値を変化させる

AIO Dynamic SkyをUnity Asset Storeで購入する箇所と手順1のところは省略します。
手順2で追加するDirectionalLightは全体の影に影響するため、RealtimeモードのLightを指定するのが良さそうです。

手順3は、画像のようにSun Sourceを指定します。

手順4は、water pool parkの場合は①Animation により実装しています。常時Animationが動作していて、Directional LightのRotation Xの値が変化していきます。

なお、画像の中では540秒のAnimationを3倍速で動作させ、180秒(3分)で太陽が1周するように見えますが、実際にはこの後説明する方法により10倍の30分で1周する動作にしています。

太陽が動く演出は特徴的で、影が動いたり周期的に昼夜が訪れるため効果は高いのですが、デメリットもあります。デメリットと比較して太陽を動かすか考えておいたほうがよいと思います。主にライティングでデメリットが多く、かなりの妥協を強いられます。

1.Realtime LightをAnimationで動かすため負荷が高い
2.影が常に動くためライトベイクにより影を固定する照明があると不自然になる
3.ライトベイクを昼夜で切り替える演出が欲しくなる場面が増え、昼/夜用のオブジェクトを切り替えるなどデータ容量は増えやすい
4.Reflection Probeを使う場合、周囲の色が移り変わるためRealtimeモードにしないと不自然になる場合がある。Realtimeモードは負荷が高いため大量に使用できない
5.LightProbeも昼/夜用で切り替えたくなる場面が増え、ライトベイクが煩雑になる

また、Realtime Lightを常時動かす負荷への対処が必要になるため、ここから説明する方法により間欠的にAnimationを停止させて、大半の時間で負荷を下げるようにしています。(本当は別のAnimationでDirectionalLightを動かすAnimationを止めたほうがよいかもしれません)
(2019/7/31追記:以下の図ではトリガーがAlwaysになっていますが、Masterにするのが正しいです。)

Scene上に3種類のトリガー用オブジェクトを配置します。
1.off時間を待機するオブジェクト(図の中ではCube-off-to-on)
2.on時間を待機するオブジェクト(図の中ではCube-on-to-off)
3.DirectionalLightを動かすAnimationをonにするオブジェクト

Cube-off-to-onはEnableになってから4.5秒後にAnimationEnablerとCube-on-to-offをEnableにします。(直後にCube-off-to-onは自分自身をDisableにします)
EnableにされたAnimationEnablerは直後にDirectionalLightを制御するAnimationをEnableにします。(直後にAnimationEnablerは自分自身をDisableにします)
また、Cube-on-to-offは0.5秒遅れてDirectionalLightを制御するAnimationをDisableにします。(直後にCube-on-to-offは自分自身をDisableにするとともに、Cube-off-to-onをEnableにします。)

ここまでの動作を繰り返すことによりDirectionalLightを制御するAnimationは4.5秒停止→0.5秒動作の周期をもった動作を行っています。

Animationが止まっている間はCPU負荷がかなり下がるので、常時動いているよりも全体として軽い負荷の時間が多くなることになります。(そこまで時間にシビアではない)Animationを間欠的に動かして負荷を下げる方法は、他の演出にも利用できるので、Animationの負荷で悩んでいるときにはこのギミックで対処できるか試してみてください。

ここまでで、時間とともに動く太陽の作り方と負荷軽減方法について説明しました。それでは、楽しいVRChatライフを!

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