配置・調整手順
水たまり
- 地面にColliderを設定し、水たまり対象だけをLayerで分離します。
- Puddle Stamp Toolの
Physics Layer Maskへ対象Layer mask値を設定します。 - 平坦面では
Radial Ringsを2から4、起伏面では4から8にします。 - 地面を貫通する場合は
Surface Offsetを増やします。 - 頂点が地形を追えない場合は
Projection Distanceを増やします。
水たまりの外形はMesh自体でも不規則になります。MaterialのUV Edge Fadeは透明度をさらに落とすため、
不透明な外周が必要な場合は0へ戻します。
新規生成MeshはUV2に外周からの距離を保存し、UV Edge Fadeと浅瀬色を実際の輪郭に沿って計算します。
既存のstamp MeshはこのUV2を持たないため、輪郭に沿うフェードを適用するには再配置してください。
風景を映す場合は水たまりを覆うReflection Probeを置き、Box Projectionを有効にします。静的WorldではBaked、
動く空や時間帯が必要な場合はRealtime + On Awakeを基準にします。GalleryはLite=64、Standard=128です。
Every Frame更新は6面renderが継続するため、必要な小範囲に限定してください。Reflection Distortionは水面と雨波紋、Ripple Reflection Blurは雨天時の反射の霞を調整します。
水面Foam
procedural foamは既定Profileでは無効です。使用する場合はFoam Strengthを少量ずつ上げ、次の順で調整します。
| Parameter | 用途 |
|---|---|
Foam Color | 泡の色。既定値は各水面のShallow Colorに近い色です。白泡が必要な場合だけ白へ寄せます |
Crest Foam Threshold | 波高のうち泡を生成し始める位置 |
Crest Foam Width | 波頭に沿う泡の幅 |
Residual Foam | 砕波後に残る泡の量 |
Foam Breakup | 泡を連続帯から分断する強さ |
Foam Pattern Scale | 分断模様の空間スケール |
Foam Pattern Speed | 分断模様が流れる速度。0で停止 |
Foam Pattern Warp | 模様の規則性を崩すdomain warp量 |
Shader内のfoamは広域水面全体で同じ計算を行います。落差上端、着水点、岸の一部など局所的な白水は、Foam Strengthを水面全体へ上げず、Splash Particle Systemを必要な位置だけへ配置してください。
河川
- Riverを生成します。
- control pointを水路の中心へ置きます。
Widthを設定します。- 曲率が大きい区間だけ
Subdivisionsを増やします。 UV Meters Per Tileでflow patternの長さを調整します。
波・潮位による頂点移動を含む描画boundsはRebuild Meshで更新されます。既存のRiverも一度Rebuildしてください。
幅が急変する河川は現時点の一定幅pathでは表現しません。区間ごとに複数pathへ分けるか、生成Meshを通常の
modeling toolで編集します。岸への自動intersectionやterrain carvingは行いません。
control pointのYを変えると斜面と落差を持つstripを生成できます。滝の前後は制御点間隔を短くし、落差上端と
着水点へSplash Particle Systemを置きます。既定GalleryはRender Mode=Stretch、Start Size=0.002–0.012 m、Length Scale=1.2を基準にした点に近い飛沫です。連続した補助stripは白帯に見えやすいため使用しません。
雨
雨rigの初期値は22 m四方、最大6000 particleです。次の順で削減します。
- Collisionの
Collides Withを地面と水面Layerに限定 - emission範囲をcamera周辺に限定
Rate over Timeを削減- Collision qualityを必要な範囲で下げる
- 遠距離雨をcollisionなしの別systemへ分離
波紋を不要とする場所ではCollision Rippleobjectを無効化するか、親のSub Emittersから当該entryを外します。
霧・雲
Particle fogはcameraとの交差でsoft particle depthを使います。camera depthが利用できない描画経路では
soft intersectionが無効になるため、particle sizeとalphaを下げて境界を目立たなくします。
Fog Volume Highは小さなvolumeに限定します。World全体を覆う霧はUnity RenderSettingsのFogまたは
距離別の遠景materialと組み合わせます。
局所光はFog MaterialのLocal Light項目へVolume object spaceで設定します。静的なPoint Light表現向けで、
Light componentからruntime同期はしません。
水中
Underwater rigのroot位置が水面高です。Underwater Volume childの上面を水面へ合わせたまま、深さと水平範囲を
調整します。底面のCaustics Receiver Overlayは実際の地形形状へ自動追従しないため、平坦でない水底では複製して
小区画へ分けるか、対象Meshを水底に沿う形へ置換します。
水中から水上を見せる場合はUnderwater Surface Viewを水面直下へ置きます。Liteは背景取得なし、Standardは
通常CameraとMirror Cameraを分離する専用GrabPassで水上景色を取得します。
境界方向はMaterialの3 vectorで選択します。Boundary Up / Down=(上, 下, 0, 0)、Boundary N / E / S / W=(+Z, +X, -Z, -X)、Boundary NE / SE / SW / NW=(NE, SE, SW, NW)です。
単純なプールは上だけ、海底ガラストンネルは必要な側面だけを1にします。境界Meshの法線が方向判定に使われます。
UV seam付近の過大な屈折はDistortion Edge Fadeを上げて抑えます。
水中空間全体の揺らぎはvolume MaterialのVolume Distortion、水面・空気境界は裏面MaterialのBoundary Refraction Distortionで別々に調整します。通常はvolume側を0–0.002程度に抑えます。
濡れた表面
通常は不透明なSabaProps/Water/Wet Surfaceを使用します。ガラス、薄布、透明overlay等で元の景色を残す場合だけSabaProps/Water/Wet Surface Transparentを選び、Opacityを調整します。半透明版はrender sortingとoverdrawの
影響を受けるため、重なる面や広い画面占有率では不透明版を優先してください。
水滴headはUVの-Y方向を重力方向として、下側が膨らみ、上側がtrailへ細く接続する形状です。MeshのUVが実際の
重力方向と一致しない場合は、UVを修正するか、重力方向ごとにMaterialを分けます。trailの開始位置は常にhead上端より
上へ固定されます。Trail Persistenceは長い濡れ筋の残量、Trail Slideは古いtrailを短縮する量です。
Droplet Head NormalとDroplet Trail Normalは個別に調整できます。まず両方を0にし、headを0.2–0.4、trailを
0.05–0.2程度まで上げると、過度な凹凸を避けて調整できます。水滴ごとの擬似質量により重い滴から先に移動します。
World object用のShaderであり、他者アバターのMaterialをWorld側から変更する機能ではありません。
アバター改変不要のDroplet Projector
GameObject > SabaProps > Water > Droplet Projectorで生成します。ローカル+Z方向へ投影し、ローカル-Y方向に滴が流れます。身体の側面に当てる場合は水平に向け、ローカル+Yを上に保ちます。
- Projectorの
Orthographic Sizeは範囲の高さの半分、Aspect Ratioは幅と高さの比です。Near / Far Clip Planeで奥行きを制限します。 - Materialの
Opacityで強さ、Droplet Densityで密度と大きさ、Fall Speedで速度、Highlight Reliefで明暗の強さを調整します。Projection Edge Fadeは範囲境界のフェードです。 Ambient Lighting Responseの既定値は1です。環境光・SHに応じて暗くします。専用のPoint/Spot Light追加パスや影には対応しません。Ignore Layersで投影しないLayerを指定します。既定ではLayerによる除外はありません。
受け側Materialの交換やアバターへのコンポーネント追加は不要です。IgnoreProjector=Trueなど投影を受けないShaderは対象外です。水滴の明暗を追加する近似で、受け側のNormal・Smoothnessは変更しません。模様は投影空間に固定され、身体が動くと表面を滑ります。範囲から出た後の濡れ状態は保持しません。
範囲内の複数面に投影されるため、壁越しの投影や多重描画が起こり得ます。範囲を狭くし、Projectorの多重配置を避けてください。SkinnedMeshの多いアバターでは再描画負荷にも注意してください。
Tools > SabaProps > Water > Create Droplet Projector Galleryで比較Sceneを生成できます。左側2体は範囲内、右側1体は範囲外です。すべて通常のStandard Materialを共有し、ProjectorのEnabledを切り替えて比較します。PCのBuilt-in Render Pipeline向けです。VRChat実機の両眼・鏡・アバターShaderとの互換性は別途確認が必要です。
照明確認
WaterLightingGallery.unityはDirectional Lightを持たず、暗い環境光のみ、Point Light、Spot Lightの3区画で
Standard水面、雨、衝突飛沫、Wet Surfaceを比較します。暗所区画で必要以上に発光していないことを確認した後、
Point/Spot区画で光源色、距離減衰、照射範囲への追従を確認してください。
水面、雨、飛沫、波紋はUnity Light Probe SHとForward Base/Forward Add lightへ反応します。VRCLightVolumesを
直接sampleする場合は、同packageのLightVolumes.cgincを参照するproject側adapterが別途必要です。