OmniWater - 触れて流れて浮かぶ水システム
- Digital2,000 JPY

















OmniWater は、VRChat の PC ワールドにプール・川・海を作るための水のアセットです。水面のシェーダーだけでなく、泳ぎ・浮力・しぶきと水音・海岸線までを、まとめて1つのパッケージにしています。
■ サンプルワールド
同梱のサンプルシーンを VRChat で公開しています。購入前に、実際に泳いだり物を浮かべたりして試せます。 https://vrchat.com/home/world/wrld_09436523-ad76-4520-a339-34bf43ea2d1b/info
■ 収録内容
ここでは、同梱しているスクリプト(UdonSharp)とシェーダーを1つずつ紹介します。ほとんどは導入ガイドのボタンで配置・接続されるので、自分でスクリプトを付けて回る必要はありません。Inspector とマテリアルの表示は、日本語と英語を切り替えられます。
■ スクリプト
◆ 水システム(OmniWater System) シーンに1つ置く本体です。水面・浮き物・泳ぎ・しぶきをまとめて動かします。 ・手・足・体や浮き物が水面に触れた所に波と泡を立て、波紋が広がって消えるまでを GPU で計算します。 ・自分のまわりは、12m四方を約2.3cm刻みで計算します。 ・ほかのプレイヤーや浮き物のまわりも最大12か所まで計算し、遠い相手ほど粗くして負荷を抑えます。 ・接触波の計算用テクスチャは、水面の数に関係なく一定(約32MB)です。 ・浮き物の浮力も、水面の高さ・傾き・流れを GPU から読み取って計算します。 主な設定:波の立ち方(強さ・高さ・広がる速さ・残りやすさ)、泡(量・消える速さ)、計算の範囲と頻度 ◆ 水面(OmniWater Surface) 水面1枚ごとのコンポーネントです。導入ガイドで、選んだメッシュから作ります(元のメッシュはそのまま残ります)。 ・「水面をベイク」で、水面の高さ・流れ・輪郭・水中の範囲のデータを作ります。 ・坂になったメッシュでは、高い所から低い所への流れが自動でつきます。40°より急な所からは滝になります。 ・平らな水面でも、Scene ビューでドラッグした向きに流れを描き足せます。 ・ベイクのときに、指定したレイヤーにある岩などのまわりで流れが回り込み、後ろに泡の帯が残ります(Collider 不要。動く物は対象外)。 ・雨の波紋を水面ごとに降らせられ、強さは Udon から実行中に変えられます。 主な設定:波の強さ、細かい波の量、波の速度倍率、雨の強さ、流速の倍率、障害物の泡、足が底に着いても流す、水中領域の深さ、水中の光の筋とコースティクス(水底の光の模様)の強さと距離 ◆ 海(OmniWater Ocean) 海岸付きの海です。地形を置いたレイヤーを指定して「海岸線をベイク」を押すと、メッシュや Terrain の形から海岸線を作ります(Collider 不要)。 ・波は浅瀬で遅くなって海岸線に沿って曲がり、浜に駆け上がって引いていきます。 ・沖のうねりを、向きとばらつきを付けて出せます。 ・波のタイミングは、ワールドにいる全員でそろいます。 ・砂浜用のシェーダー(下記の Beach Sand / Beach Terrain)を使った砂浜には、波が引いたあとの濡れ・波の跡・泡が付きます。 主な設定:波の高さ・周期・駆け上がる高さ、浅瀬での減速、沖の波の高さ・周期・向き・ばらつき、ベイクする範囲と解像度、砂浜が乾くまでの時間、海岸の泡が消えるまでの時間 ◆ 海岸の波音(Shore Audio) 海に付いている波音です。近くの海岸線の位置と長さから、音の向き・広がり・大きさを決めて鳴らします。長い砂浜では左右に広く、岬では周り全体から聞こえます。 主な設定:音量、音が小さくなり始める距離、聞こえる最大距離 ◆ 泳ぎ(Player Swim) 水システムに含まれる、ローカルプレイヤーの泳ぎです。 ・水中ではジャンプを押している間は浮き上がり、離すとゆっくり沈みます。水面近くでジャンプを押すと水から飛び出し、水底では普通に歩けます。 ・飛び込んだときは、勢いを残しながら沈む速さまで減速します。 ・流れのある水では、泳いでいるプレイヤーが流れに運ばれます。 ・ほかの移動ギミックと組み合わせるときは、Udon から泳ぎを一時停止・再開できます。泳ぎの状態が変わったときの通知も受け取れます。 主な設定:沈む速さ(0でその深さにとどまる)、浮き上がる速さ、入水時の減速、水平移動の追従、流れの影響 ◆ しぶきと水の音(Water Effects) 水システムに含まれる、見た目と音の効果です。 ・水に入る速さに応じて、しぶきの大きさと音(軽い・中くらい・重いの3段階)が変わります。 ・水面を動くと小さなしぶきと移動音が出て、水中を動くと気泡が出ます。 ・頭が水に入ると、水中の環境音とこもった響きに切り替わります。頭が水に出入りするときの音は本人にだけ聞こえます。ほかの人のしぶきも見え、音も聞こえます。 主な設定:入水・移動のしぶきの大きさ、各音の音量と音源、しぶきが出始める速さ、効果を処理する距離 ◆ 浮き物(Floating Pickup) 物体を選んで導入ガイドの「選択物体を浮き物にする」を押すと付きます。Rigidbody・Collider・Pickup・Object Sync も足りない物は追加されます。 ・浮力は1つの物体につき最大4か所の浮力点で計算するので、波に合わせて傾いたり揺れたりします。 ・手で持って投げ込めて、位置はほかのプレイヤーにも同期されます。 ・波に揺られて漂い、流れに運ばれ、坂の水では斜面を下ります。 ・浮き物は、下の「波だけ立てる部品」と合わせて1シーン128個までです。 主な設定:浮力点、喫水(止まっているときに沈む深さ)、浮力の強さ、上下の揺れの収まり方、漂う量、流れへの追従、水中の回転の止まりやすさ、姿勢補助(決めた向きに戻す・表裏どちらでも安定) ◆ 座席(Float Seat) 浮き物に付ける座席です。浮き輪やボートに Interact で座り、スティックでゆっくり前後に漕いだり、その場で向きを変えたりできます。ジャンプで降ります。腰の位置を合わせるので、どのアバターでも同じ高さに座ります。座っている間はほかの人が持てず、持たれている間は座れません。 主な設定:前進・後退の速さ、旋回の速さ、加速、スティックを離したときの減速、横滑りの抑え方、腰の位置 ◆ 波だけ立てる部品(Surface Contact) 浮かせずに、水面に波と航跡だけを立てる部品です。ほかのスクリプトで動かす乗り物や動く床などに付けます。Rigidbody などは不要です。 主な設定:接触の半径と高さ ◆ 容器の水(Vessel) バケツなどの容器を選んで GameObject > OmniWater > 容器に水をためる を押すと、容器の口に水の円盤が入ります。円盤を移動・拡大縮小して口に合わせれば、水を汲んだり、傾けてこぼしたりできます。 ・汲んだ水は、汲んだ水面の色になります。 ・傾けると、縁から出た水が1本の水流にまとまって落ち、落ちた所にしぶきが立ちます。 ・水の量はほかのプレイヤーにも同期されます。 ・浮き物の容器は、水が入るほど深く沈み、縁まで水に浸かると沈んでいきます。逆さにすると、中に残った空気で浮きます。 ・口は円形のみ対応です。 主な設定:深さ、最初の水量、縁を越える流量の倍率、色の濃さ、水面の揺れ方、水が入ったときの沈み方 ◆ 水の設定パネル(Settings Panel) プレイヤーがそれぞれ、画面反射・波の細かさ・触れたときの波・しぶき・水の音量・表示言語(日本語/English)を切り替えられるパネルです。設定はプレイヤーごとに保存され、次に来たときも残ります。画面反射は GPU の負荷が大きいので、重いと感じた人が自分で切れます。 主な設定:各項目の初期値(画面反射・高精細・接触波・水しぶき・音量)、表示開始距離・非表示開始距離 ◆ 診断タブレット(Debug Tablet) ワールドの中で持って Use を押すと、波の高さ・泡・触れた所・水の流れ・計算している範囲の表示が順に切り替わります。動きの確認や、うまく動かないときの切り分けに使います。
■ シェーダー
◆ Water(プール・川などの水面) 水面越しの屈折、深さに応じた色と光の吸収、画面反射(SSR)と反射プローブによる映り込み、泡、太陽のハイライトを描きます。近くの水面は細かく分割して、波の形を出します。 主な設定:水の色合い、光の吸収、屈折の強さ、泡の量・色・細かさ、SSR(画面反射)の強さと距離、水面の滑らかさ、近距離の分割数と距離、水中の明るさ、Light Volumes(VRC Light Volumes の光)の効き方 ◆ Ocean Water(海の水面) Water と同じ設定に加えて、海岸線のデータを使い、浜に寄せる波と砕ける泡を描きます。 ◆ Underwater View(水中の見え方) 潜ったときの見え方です。水の色とかすみ、水面から差し込む光の筋、水底のコースティクス、水中から見上げた水面を描きます。水面のベイクで自動で作られ、自分が入っている水だけで表示されます。 ◆ Waterfall(滝) 水面の急な所に自動で付く滝です。落ちるほど泡で白くなり、水の膜が筋に分かれていきます。水と泡の色は、ベイクのときに水面のマテリアルに合わせます。 主な設定:膜の厚さ、泡の量、真っ白になるまでの落差、筋への分かれ方と幅、落ち口の流速、滝として描き始める傾き ◆ Splash(しぶき・気泡) しぶき・水滴・水中の気泡のパーティクル用です。水の膜が裂けるようなしぶきと、動きに沿って伸びるリボン状の水を描き、水の色に合わせます。 ◆ Vessel Water / Vessel Pour(容器の水と、注ぐ水) 容器の水面と、傾けたときに注がれる水です。容器の水は、表面張力で壁際が少し持ち上がる様子と、その光る線を描きます。注ぐ水は、長く落ちると途切れて粒になります。 主な設定:汲む前の水の色、反射の強さ、壁際の持ち上がりの高さと幅、注ぐ水の濃さ・まとまるまでの時間・途切れ始める時間 ◆ Beach Sand / Beach Terrain(砂浜) 海の濡れ・波の跡・泡を受け取る砂浜用です。 ・メッシュには、同梱の Beach Sand のマテリアルを複製して使います。 ・Terrain は、海の Inspector の「Terrainに海岸の濡れを適用」で Beach Terrain のマテリアルに切り替えます。今の Terrain Layer の見た目はそのまま使われます。 ・Terrain で濡れが付くのは、Terrain Layer の4枚目までと、Base Map Distance より手前です。 主な設定:砂の色とノーマル、タイリングと繰り返しを目立たなくする設定、濡れた砂の色とつや このほか、接触波・浮力・流れの計算に使う内部用のシェーダーが入っています(マテリアルとして使うものではありません)。
■ 導入の流れ
unitypackage をインポートしたら、Tools > OmniWater > 導入ガイド を開き、次の順に進めます。 1. シーンを保存し、「水システムを配置」を押します。 2. 水にしたい形のメッシュを選び、「選択メッシュから水面を作成」を押します。 3. 水の色は水のマテリアルで、波の強さは水面の Inspector で調整します。 4. 海を作るときは「海を追加」を押し、地形のレイヤーを指定して「海岸線をベイク」を押します。 水面の形や流れの速さを変えたときは、水面の Inspector で「水面をベイク」を押してデータを作り直します。ベイクは保存済みのシーンで、Play していないときに行います。
■ サンプルシーン
完成例のサンプルシーンが付いています。3段のプール、ウォータースライダー、川、滝、海、浮き物(アヒル・ボール・浮き輪)、水上バイク、バケツ、雨、時刻で動く空が入っています。水上バイク・雨・空はサンプルの中の例で、Prefab としては同梱していません。ベイク済みのデータも入っているので、開いてすぐに動かせます。
■ 動作環境
・VRChat の PC ワールド(Android/Quest には対応していません) ・Unity 2022.3.22f1、Built-in Render Pipeline(URP/HDRP には対応していません) ・VRChat Worlds SDK 3.10.5 ・TextMesh Pro 3.0.6(Essential Resources を含む)、UGUI 1.0.0 ・VRC Light Volumes 3.0.1(任意。なくても動きます) ・サンプルシーンは Post Processing 3.4.0 を使います 依存パッケージは同梱していないので、先に導入しておいてください。
■ 制限と注意
・水面は1シーンに64枚まで(海も1枚に数えます)、浮き物と Surface Contact は合わせて128個までです。 ・上から見て重なる形の水面(管やらせんなど)には対応していません。 ・水のシェーダーは、カメラの深度テクスチャを必ず使います。プレイヤーの画面とカメラ(写真)では水システムが自動でオンにしますが、ワールドに独自のカメラを置いて水を映す場合は、そのカメラの深度テクスチャをオンにしてください。水面は深度テクスチャに入らないので、深度を使うほかのシェーダー(フォグなど)からは見えません。 ・同じマテリアルを使う水面は、すべて同じ色になります。別の色にしたい水面には、マテリアルを複製して使ってください。 ・泳ぎの設定は、シーン内の水すべてに共通です。 ・ClientSim で試すときは、Project Settings > Player > Other Settings > Active Input Handling を Both にしてください。この設定を変えると Editor の再起動を求められるので、先に作業を保存してください。
■ 同梱物
・Prefab:水システム、海、水の設定パネル、診断タブレット、容器の水の円盤 ・サンプルシーン ・ドキュメント(日本語・英語):ユーザーガイド、メニュー一覧、動作環境、フォルダ案内
■ フォントのライセンス
設定パネルなどの文字表示に、次のフォントを同梱しています。どちらも SIL Open Font License 1.1 のフォントで、TMP 用のフォントアセットもこのフォントから作っています。 ・Jost(ExtraLight、Regular) Copyright 2020 The Jost Project Authors (https://github.com/indestructible-type) ・Noto Sans JP(Light。JIS 第1水準の文字に絞ったもの) Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'
■ 利用規約
本アセット(OmniWater)を購入した時点で、この規約に同意したものとします。 【権利】 本アセットの著作権は作者(Rsea)にあります。購入者には、この規約の範囲で本アセットを使う権利を許諾します。著作権を譲渡するものではありません。 【できること】 ・購入者本人が制作するワールドに組み込んで使うこと。個人・法人、商用・非商用を問いません。 ・ワールドに合わせて、スクリプト・シェーダー・マテリアル・Prefab などを改変すること。 ・本アセットを使ったワールドを公開すること、そのワールドで撮影・配信・動画投稿をすること。 ・依頼を受けて制作するワールドに使うこと。ただし、Unity のプロジェクトや本アセットのデータを依頼者に渡す場合は、依頼者も本アセットを購入してください。 ・クレジットの表記は不要です(書いていただけると嬉しいです)。 【してはいけないこと】 ・本アセットの全部または一部を、そのまま、または改変して、再配布・譲渡・転売・共有すること。有償・無償を問いません。 ・本アセットに含まれるスクリプト・シェーダー・テクスチャ・音などを取り出して、素材やアセットとして配布・販売すること。 ・本アセットを使った、または改変したものを、アセット・ギミックとして配布・販売すること。 ・本アセットを自分が作ったものと偽ること。 ・法令や公序良俗に反する目的、他者の権利を侵害する目的で使うこと。 【同梱している第三者の素材】 同梱しているフォントは、それぞれのライセンス(SIL Open Font License 1.1)に従います。効果音とテクスチャの一部は CC0 の素材をもとに加工したものです。 【AI 生成物の使用】 次の素材は、AI で生成したものをこのアセット用に加工しています。 ・しぶきのパーティクル用テクスチャ(Splash fine droplets) ・サンプルシーンのアヒルのモデルとテクスチャ ・サンプルシーンの水上バイクのモデルとテクスチャ 【免責】 ・本アセットを使ったことで生じたトラブルや損害について、作者は責任を負いません。 ・VRChat・Unity・VRChat SDK などの仕様変更によって、本アセットが正しく動かなくなる場合があります。作者は可能な範囲で対応しますが、対応を保証するものではありません。 ・ご質問や不具合の報告は、BOOTH のメッセージで受け付けます。返信やアップデートは可能な範囲で行います。 【返金】 デジタルデータの性質上、購入後の返品・返金はお受けしていません。
■ 更新履歴
1.0.0(2026-11-09) 最初の公開版

















