VRChat のワールドを作るときに知りたかったこと
この記事は私が初めてワールドを作ったときに知りたかったことをまとめたものです。基本的 CG の知識やワールドの設定、インターフェースのデザイン、導入すべきものなどをまとめました。詳しい説明というよりはその概念の導入を行い、調べる助けとなるためのものです。気になる部分だけかいつまんで読んでください。私の備忘録も兼ねています。
最初に作成したワールドです。モデルはほぼフルスクラッチで作っています。よかったら見てみてください。
https://vrchat.com/home/world/wrld_7d9f7e18-9eb3-4930-a644-c02c8845966e
ライティング
ライティングの重要性
ワールドを作るうえで適切にライティングの設定を行うことはとても大切です。人間は目に入ってきた光を網膜で捉えることでしかものを見ることができないため、ライティングはワールドの見た目そのものです。極論質が良くないモデルでもライティングが良ければある程度よく見えるので、労力を割くメリットは相対的に大きいでしょう。
ライトベイクとは?
Unity を始めとした 3D ゲームエンジンには、ポリゴンの明るさやポリゴンによって光が遮られてできる影を他のポリゴンに描画する機能が組み込まれています。この計算はリアルタイムにも行うことができますが、非常に高負荷な計算です。そのため影などの品質が制限されていたり、パフォーマンスに影響を与えることがあります。一般には GPU パワーを最大限活かしてリアルタイムかつ高品質な光源計算を行うこともできますが、VRChat のワールドでは使えません。
そのため多くの場合あらかじめ光源計算を行います。この作業はライトベイクと呼ばれます。ライトベイクでは主に light maps, light probes, reflection probes の作成を行います。light maps はポリゴンの各面ごとに明るさや影を計算したテクスチャ (color maps) のようなものです。動かないオブジェクトに対して作成します。light probes は空間のある座標にあるものがどれぐらいの明るさになるかを計算したものです。reflection probes は空間のある場所にある物体の表面に反射する風景を計算したものです。詳し異説明は他の記事に譲ります。
Bakery を買え
Bakery はライトベイクをするためのツールです。ワールド作成では光源の位置や強さを調整して画作りをしていくため、高速にライトベイクをして確認を行える環境が必須です。 Unity 標準の light mapper や Blender のベイク機能などもありますが、速度と品質の面で Unity におけるシーン作成でのデファクトスタンダードの地位は揺らがないでしょう。たまにセールをしているので待つのも良いでしょう。
Magic Light Probes (MLP) を買え
light probes は複数のサンプル点での明るさを計算し、その値を線形補間することで空間内での明るさを計算します。MLP を使わない場合、このサンプル点を手動で配置することになります (自作のワンルームワールドでは 200 個程度) 。要するに置く場所を考え、微調整しながら設定する作業を数百個行わなければいけません。MLP は自動でやってくれます。
ワールドの明るさ
主に暗いワールドを作る際の注意点ですが、デバイスによって見える明るさが異なります。例えば液晶ディスプレイよりも OLED ディスプレイのほうが黒が深く見えたり、HMD によって見える明るさが異なります。もちろん個人差もあるため完璧な調整はできませんが、post processing などである程度明るさの調整ができるとよいでしょう。
Realtime Light について
ライトベイクを行う場合、realtime light (Baked ではない光源) の使用には注意が必要です。鏡 (VRC Mirror) に映る景色は realtime light の影響を受けません (受ける設定があったら教えて下さい……)。そのため部屋の電気や昼夜の切り替えなどを realtime light で行うとミラーの中だけ異なる見え方になります。post processing を使用するか light maps の切り替えを用いることを検討するとよいです。
LTCGI は必要?
LTCGI はオブジェクトの発する光をリアルタイムに他のオブジェクトに映すライブラリです。LTCGI を使用するには Filamented などの Standard 以外のシェーダーを使う必要があったりなど導入にいくらかの障壁があります。realtime light で十分な場合もあるため他の方法を検討する余地があります。
ポストプロセッシングしない方がよいもの
Ambient Occlusion (AO)
建造物の角などの狭い場所を暗くするもので拡散反射の経験的な近似です。あらかじめライトベイクしておくべきでしょう。Grain
画面にノイズを乗せる効果です。イラストなどでも盛んに使われますが、ワールドで取った写真の加工時 (主に明るさの調整時) にノイズが増幅されるため好ましくないでしょう。
個人的に Depth of Field も VR には必要ない (人間の目の焦点距離の調整機能と相性が悪そう) と思っていますがどうなんでしょう…?写真ではよく使います。
アセット
購入 vs 作成
アセットを購入するか作成するか選択の余地があると思います。基本的には独自性と労力・時間のトレードオフになります。特に既存の部屋のアセットの場合他のワールドとの差別化が困難になるため、ワールドの用途に合わせて選択するとよいでしょう。
動画プレイヤー
代表的なものに iwaSync がありますが、現在では Yama Player や VidVid など他の動画プレイヤーも多く作成されています。比較したうえでどれを使用するか検討する余地があります。
UI デザイン
一言で表すと、当たり前ですが、VR における UI デザインは現実と全く同じ方法が通じるわけではないです。
スイッチの例
私たちは現実世界で部屋の扉のそばに電気のスイッチがあった場合、部屋の電灯の ON/OFF の切り替えができることを期待します。同様に VRChat プレイヤーの多くはアイコンの付いているボタンに interact することで各種機能が切り替えられることを期待します。経験上このメンタルモデルは現実世界と VRChat の中で一致しないようで、現実世界のようなスイッチが VRChat のワールドにあったとしても UI として認識されないことが多く感じられます。デザイン的に優れているとは思いませんが、アイコンの付いたインターフェースを用意する必要があるでしょう。
また、スイッチは最も近くにあるオブジェクトに対する操作を提供することが期待されるとともに、オブジェクトに対する操作を提供するスイッチは近くにあることが期待される点も留意すべきです。
Udon/U#
Assembly Definition
Udon を使用する場合は (udon) assembly definition を使用してアセンブリ単位を分離することを推奨します。これを用いることで同一アセンブリにコンパイルされるコードの規模が小さくなり、再ビルド時間の短縮などのメリットがあります。また依存関係を明示的に指定する必要があるなどモジュール性が高まるため、他のワールドなどでも再利用しやすくなります。
その他
ワールドカメラ
near clip の値を小さくするとより近くにあるメッシュが描画されるようになります。標準のままだと撫でられないと怒られます。
Audio Link
アバターに Audio Link を利用したシェーダーを使っている場合があります。とりあえず Audio Link の prefab を置いとくとよいです。ワールドで使用する場合にはシェーダーから使用する方法とスクリプトで使用する方法があります。
Backup Your Projects!🌠
いくらとってもいいですからね