【VRC】ワールド作成メモ

VRC用のワールドを作ってて気づいた個人的なメモなど。

【BGMについて】
どこにいても同じ音量で聞こえる(=ヘッドホン):2D
場所によって音量が変わる(=スピーカー):3D(立体音響)
VRCの場合は「VRC Spetial Audio Source」コンポーネントも追加する
【立体音響の設定について】
- Spetializeをオン、Spatial Blendを1
- Doppler Levelはドップラー効果なので意図がなければ0で
- 音量のグラフについて赤のVolumeのグラフで、BGMのオブジェクト設定位置からどの距離までどのくらいの音量で聞こえるかを調整する。MaxDistanceが聞こえる最大の距離で、グラフの終点を音量0にしないと音は完全に消えないので注意
- VRC Spetial Audio SourceコンポーネントのEnable Spatiallzationとその下のUse Audio~もチェック入れないと立体音響にならない

【Blender】
別のオブジェクト同士をくっつける方法(例:壁と床)
- 編集モードにして、くっつける基準となる頂点を選択
- Shift+Sで「カーソルを選択物に移動」
- 右クリックで「原点を3Dカーソルに移動」
- オブジェクトモードに戻る
- 画面真ん中上の方にある磁石のマークをアクティブに。右隣の設定からスナップ対象を「頂点」にする
- 動かしたいオブジェクトを選択して、オブジェクト>スナップ>「選択物→カーソル」
カーソルの存在がよくわからないが、移動の時の基準とかになるっぽい?
補足:
オブジェクトごとに原点を持っている。スナップするときは、カーソルの位置に原点が来るので、移動するオブジェクトの原点もそろえておかないといけない

【Blender】
窓の作り方
- 窓のサイズの立方体を作ってブーリアンで壁に穴をあける。あらかじめ穴をあける壁は独立オブジェクトにしておく(ほかの壁とつながってると全部消えちゃう)
- 穴を開けた立方体を再利用して窓枠・窓ガラスを作る。複数枚の窓を作る場合はループカットで分割する
- 外側の面を押し出して枠を作る。
- 内側の面は分離する。
壁の厚さが0.3なら窓枠は0.1、ガラスが0.05
窓枠の幅はフチが0.2、内側は0.1

【Blender】
UV展開のやり方
Blender4では展開の種類が増えてる。以下のように使い分けるらしい
- アングルベース(Angle Based)
モデルの形状を維持しつつ、できるだけ歪みを抑える方法です。
有機的な形状(キャラクターや柔らかいオブジェクト)に適しています。- 等角(Conformal)
面の角度を正確に展開し、直線的で硬い形状を正確に表現します。
建物や機械のような直線的なオブジェクトに適しています。- 最小ストレッチ(Minimize Stretch)
UV展開後のテクスチャの歪みを最小限に抑える方法です。
特殊な場合や、できるだけ歪みを避けたいときに使用します。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13310047363
でも四角形とかシンプルなメッシュ使ってる分には、スマートUV展開だけでなんとかなりそう?
むしろ自分でやろうとするとうまくいかない

【Blender】
Blender書き出し時のチェックリスト
- 裏返ってる面がないか
- ブーリアンでくり抜いたところはきちんと面で埋まってるか(窓のフチとか要注意)
- オブジェクトとオブジェクトの隙間ないか
- テクスチャ変になってるところないか(UV展開)

【Unity】
コライダー(当たり判定)について
立方体・直方体のオブジェクトはBoxColiderを設定、そうでない場合はMeshColiderを設定する。
前者は立方体・直方体型にコライダーが生成されて、後者はメッシュに沿ってコライダーが生成される。ただし形によっては重くなるらしい。

【Unity】アバター動作確認用の簡単なダンスギミックの作り方
このギミックを使う
ポールのオブジェクトを非表示&アニメーションの差し替えで好きなダンスを躍らせられる。

VRC SDKのビルドの種類について

UdonSharpのメモ
Interact()
ワールドギミックでカーソル合わせると「Use」とか出て、クリックすると使えたりするのを設定するやつ。Interact(=左クリック)したときにどうするかという処理を書く
public override void Interact()
{
//プレイヤーに対してUseAttachedStationさせる
Networking.LocalPlayer.UseAttachedStation();
}
Networking.LocalPlayer.UseAttachedStation();
プレイヤーを座らせるVRC Stationを起動する
Update()
リアルタイムで実行し続ける処理
private void Update()
{
//処理
}
OnStationEntered()
VRC Stationが発火したら起動
public override void OnStationEntered(VRCPlayerApi player)
{
//処理
}

UdonSharpのメモ
デバッグ方法
Debug.Log('Hello world');

【Unity】
MaterialのEmissionとは:
マテリアルに Emission (エミッション、発光) を追加すると、マテリアルがシーン内の目に見える光源のように見えます。
https://docs.unity3d.com/ja/2020.3/Manual/StandardShaderMaterialParameterEmission.html
ベースカラーに白、Emissionに白を設定すれば、影のない真っ白なオブジェクトになる
光源オブジェクトで使える。
Emissionに黄色を入れると温かみのあるライトになるが、そのままだと黄色がきついので、ベースカラーにグレーを入れるといい感じになった

【Unity】
Terrainでの地形生成のやり方
一部分を平らな高台にしたかったので、今回はSetHeightで高台の高さを決めてから高台にする部分だけ塗っていくのがやりやすかった

【Unity】
Terrainでいい感じの坂を作る方法メモ
- Set heightツールで0.3~0.5ずつくらいで階段を作る(個々の数値はどのくらいなだらかにするか次第)
- Smooth HeightツールのOpacityを限界までに右にして、階段をなだらかにする

ライティング基礎

BGMの立体音響の設定について上で書いたけど、もう少し追記
▼VRC Spatial Audio Sourceについて
- Enable Spatializationにチェックを入れておけば、Audio Source側のSpetializeはオフでも立体音響になる
- より正確に言うと、Enable Spatializationにチェックを入れることで立体音響がオン+Audio Source側のSpatializationではなくVRC Spatial Audio Source側のSpatialization設定を参照するようになる(=FarとNeerの値)
- ただし、「Use AudioSource Volume Curve」にチェックを入れれば、Audio Source側の3D Sound Settingの音量カーブを参照するようになる
- FarとNeerだけだと細かい調整ができないしわかりにくいので、「Use AudioSource Volume Curve」にチェックを入れておいた方がよさそう
- ちなみにGainは立体音響で調整した音量に数値分の音量をプラスする。0でOK
▼結論
- Audio Source側のSpetializeはオフ
- Audio Sourceの3DSoundSettingの音量カーブで調整する
- VRC Spatial Audio SourceのGainは0、Enable SpatializationとUse AudioSource Volume Curveにチェックを入れる、それ以外は初期値でOK

Bakeライティングメモ
- Bakeするときは、光が当たる静的なオブジェクトにStatic>Contribute GIにチェックを入れる。 Static全部にチェックを入れるのはあかんらしい。
- Contribute GIにチェックがないと、Bakeされたライトの影響を受けなくなってしまう。家具だけじゃなくて建物にも入れなきゃダメだぞ(一敗)
- 逆にBakeするライトが当たらないオブジェクトにはContribute GIは入れない方がいい。Bakeに時間がかかるため(一敗)
- Bakeするとライトマップというものができあがる=どこに光が当たっているかのテクスチャが貼られる感じ
- なのでBakeした後に周りのオブジェクトを残っても、光と影の位置は変わらない
- ライトマップは各オブジェクトのUV2を集めてきて一枚に画像化したもの。UVマップとUV2は違うものなので、UV展開とは別にUV2が各オブジェクトに必要。
- アセットでもUV2がなければ用意しなきゃいけない
▼簡単なUV2の作成方法
Blenderで作ることもできる(こだわるならBlenderでやったほうがいい)が、UnityがUVマップを元にUV2を作ってくれる。
- UV2があるか確認する。各オブジェクトのメッシュを開き、プレビューにUV2があれば対応済み、なければ未対応
- UV2がなければFBXファイルを開いて、Modelの「Generate Lightmap UVs」にチェックを入れてApply
- もう一度メッシュを確認すると、UV2ができてる
LightmappingSettings
- Lightmapper:ライトマップ生成時にCPUを使うかGPUを使うか。GPUの方がいい
- Lightmap Resolution:ライトマップの解像度。大きい方がいいが、デカすぎるとGPUだけでは生成できず、LightmapperがCPUになってしまう。そうすると生成に時間がかかるので、PCの性能と相談しつつ調整
- Max Lightmap size:ライトマップの画像サイズ。大きいほどくっきりきれいにライティングできる。4096pxがよさそう?
ライティングについてとてもわかりやすい記事
難しいけどUV2の理屈とか参考になった
- lilltoonを使っているアセットでほかのオブジェクトの影が落ちない場合は、影設定>「影を受け取る」のパラメーターを上げる
- StandardシェーダーよりFilamentedシェーダー使った方がちょっとだけいい感じになる
- インストールするときはGitLabからの方がいい?
https://gitlab.com/s-ilent/filamented
- インストールするときはGitLabからの方がいい?
- 食べ物系はliltoonに変えるとおいしそうになる

UV2について、曲線が多いモデルはUnityの自動展開だとうまくいかないことが多い(ぬいぐるみやクッション系はうまくいかないことが多い印象)
対策方法としては、
①PrefabのLightmapping>Scale In Lightmapの数値を大きくする
②シェーダーをliltoonにする ←簡単かつ確実
①も数値を大きくしまくればいけそうだが、その分容量も大きくなってしまうらしいので、限度がある。
②が一番簡単かつ確実だった。何かデメリットがあるかはわからないが、今のところは大丈夫そう。
ぬぐるみ系のアセットが軒並みliltoon使ってるのはそういうことか~と納得した。
▼試したけどあまりうまくいかなかった方法
- Lightmap UVs Settiongsの「Hard Angle」をいじる
→デフォルト数値の88を100くらいにしたら多少マシにはなったが、それでも不十分
参考:
「Hard Angle」は1か2でいいって書いてあるけど、、、むしろ悪化したけど、、、

特定のコンポーネントがついたオブジェクトのみ検索する方法
TextMesh Proを検索する方法
フォント容量の抑え方

写真にフィルタをつけるみたいに画面をぼかしてエモくるにはPostProssingを使う
コライダーをつければ、その範囲だけかけることもできる。
逆にかけたくない範囲にはコライダーを設定して、オフのポスプロ設定をすればいい

Light Resolusiion=ライトマップの解像度 なので、この値が高いほど影はくっきり出力されるけど、あえて低い値にしておくことでベイクがうまくいったりもする(高いと影になるところが黒くなりすぎて汚く見える)

ReflectonProbe:設置した範囲の金属やガラスのマテリアルなどの反射について、どの部分を反射するか設定するもの。
そもそもReflectonProbeなしの場合はSkyboxが反射される。
(ただしEnviroment設定のEnvironment Reflections>SourceがCustomでCubemap未設定ならどこも反射しない?)
なのでReflectonProbeを置かないと屋内なのに青空に色を反射してしまう。
その場合は屋内にReflectonProbeを設置し、屋内の景色を反射させるようにする。
何を反射するかは、ReflectonProbeに球が浮かんでおり、その景色が反射する。Inspectorの移動マークからその球を移動させられるので、反射したい形式はそれを移動して変える
また反射される対象は、StaticのReflection Probe Staticにチェックを入れる必要がある。
【まとめ】
- ReflectonProbeはどこに何を反射するかをコントロールする。デフォルト設定ではSkyboxが反射される。
- 「どこに」はReflection Probesのボックスで範囲を決める
- 「何を」は反射したい対象のオブジェクトのStaticのReflection Probe Staticにチェックを入れる

PC負荷(描画負荷)の軽量化について
動的に動かないオブジェクトはStaticにチェックを入れるといいと書いてある記事があるが、厳密には下記にチェックを入れる
- Batching Static
- Occluder Static
- Occludee Static
- Contribute GI ←ライトベイクの対象にしたいオブジェクトのみ
動的に動かないオブジェクトの定義は、「Transformの値が変わらない」ことらしい(By ChatGPT)
なので、
- アニメーションするオブジェクトはNG
- Udonでアクティブ・ノンアクティブが変化するオブジェクトはOK(スイッチ系など)
- シェーダーで動いているように見えるオブジェクトはOK(水面など)

AssetsCompressorを使った容量削減
公式マニュアル:
わかりやすい説明

VRC_PickUpを付けたときは、RigidBodyのisKinematicはオンにした方がいい
効果:
- 物理演算がなくなるので、コライダーがisTriggerになっていても地面突き抜けて消えたりしない
- オブジェクトから手を離すと、UseGravityをつけていても空中に静止したまま残る(つまりUseGravityいらない?)
- UseGravityの効果がなくなるので、離したら地面に落ちるということはなくなる