見出し画像

『Azure Sea Fishing』VRChatワールド制作雑記

こんにちは。LoveNecoVです。
昨日、『Azure Sea Fishing』というVRChatのワールドを公開しました。

2022年の10月に作り始めて、結局2~3か月かかりました。苦労したこととか話したいことが山盛りあるので、noteの記事にしちゃうことにしました。超長文になるので、読みたい人だけ読んでください・・・。

わたしはプログラミングはできなくて、コードは書かずに作ったので「Udonはちょっと」という人の参考になればうれしいです。ちなみにワールド制作歴は1年半くらいです。※コードを消すぐらいはしましたけど

ワールドのプロモーション動画はこんな感じ。
しろまるさん(@WhiteSercle)にお願いして撮ってもらいました!

2023.1.9追記
初めてTwitterで1000いいね!超えた!うれしい。


作り始めた時の話

このワールドは最初から「こういうのを作る!」って明確に決めて作ったわけではありませんでした。

はじめはワールドを作るつもりもなく、水が好きなのでいろんな水シェーダーの研究だ~ってことで、いい水シェーダーを探していました。

その中で、宮野原宮乃さんの『solitude cottage -離島の別荘-』やC_Carrotさんの『Single Blue Room』の海がとてもリアルな雰囲気でいいなーと思って、調べたり人に聞いたりしてたどり着いたのがLux Water。新しい水シェーダーをゲットして、ワクワクしてUnityをいじり始めたのが最初でした。

水シェーダー触ってると楽しくなってきて、ついでに船を置いたり、釣り竿を置いたりして、ベースの形ができてきました。

いま見たら、10月5日に水シェーダー触りだして、10月10日にはもう船も入ってましたね。(これTwitter引用するとセンシティブな~ってなるのなんで?オフにしてるんだけどな)


わたしは以前、リアルのほうで船のクルーとして国際カジキ釣り大会に出たりとか、よく友達と沖縄に行ってスポーツフィッシング(船に乗ってルアーで大きい魚釣るやつ)したりしてたのですが、その時の楽しかった記憶に吸い込まれるように作っていったような感じでした。

いま書いてて思いましたが、このワールドは、わたしのワクワクした海の記憶が詰め込まれて再現されたものみたいです。

よく考えたら、真っ白なボートは実際に乗っていたヤンマーのAzulって船に似ているものを使っていました。紺碧の海は、伊豆大島〜三宅島あたりの夏の海の色を意識していました。デザインは違いますが黄色い浮魚礁は城ヶ島沖のものを意識して作っていました。

他にも沖の島は那覇のナガンヌ島、反対の大きな島は伊豆大島をなんとなくイメージしました。どちらもよく行ってました。泳いでいるマンタの群れは
国際カジキ釣り大会参加中に見た、伊豆下田沖の時の記憶でした。

ナガンヌ風の島から見る、伊豆大島風の島
マンタの群れ。伊豆下田沖で見たときは50匹以上いた。


そんなモチベーションでこのワールドは作られていきました。

苦労したこと5つ

なんだかんだ、10月以降、超細かい調整をやり続けてきました。60%くらいのものはすぐできるけど、90%、100%に近づけるのって永遠の時間かかる・・・。

①脳筋負荷対策

釣りやボート、ダイビングなどのアクティビティを楽しむワールドなので、動作が重くならないように注意しながら作りました。

具体的には、プレイヤーの位置によって、不要なオブジェクトはできるだけローカルでオフにするようにしています。

例えば水上にいるときは水面下のオブジェクトを消すとか、島より遠いとこにいるときは島の詳細なオブジェクトは全部消すとかを、コライダーのTrigger判定をつかって、Cyan Triggerで実装しています。部屋とかじゃないのでオクルージョンカリングとかは使ってません(使ったことなくて)。

なのでワールドの中には見えないトリガー判定がいっっぱいあります。制作の後工程になるほど調整するのが大変で、絶対もっといいやり方あると思いながら頑張りました。

あとはいつも通り。ワールドはDirectional Light一つだけですが、リアルタイムライトを使っているので極力影のいらないオブジェクトは影を落とさないように設定しています。共通で使うマテリアルのEnable GPU Instancingはオンにしたり、VRWorld Toolkitを使って重いテクスチャは軽くするとかはやっています。(QVPenを使わないときは非表示にするのも大事ですね)

あと、水中のライトシャフトや、チリ、コースティクスはワールド全体に効かせると重くなると思ったので、プレイヤー追従(ローカル)にしています。こちらのアセットを使わせていただきました。

https://booth.pm/ja/items/3406912

同じように、浅い海にいる魚は船の子にしています。飛び込んだらすぐ魚がいるようにしたかったし。


②水の色

ここに一番時間使ったとおもいます。

水面
まず水面のマテリアルは6種類を、プレイヤーの場所に合わせてトリガーで切り替えて使ってます。

  • 深い海の水上からみた水面(近景用、遠景用)

  • 深い海の水中からみた水面(近景用、遠景用)

  • 浅い海の水中からみた水面(近景用、遠景用)

※近景、遠景があるのはLuxWaterがそうなってたからです。

浅い海の水上からみた水面の色は、深いところから浅いところに行くときにシームレスに変わるようにしたかったので、深い海のマテリアルの色をトリガー判定でアニメーションして切り替えています。

水中の色
Lux Waterでは水中に飛び込んでもFogも何もかからないので、水中の色はSkyboxの下半分をグラデで塗りつぶして、Unity標準のFogとPostProcess(Bloom&Color Grading)で再現しています。深淵感がでるようにグラデにしています。

水中飛び込んだら、これらをオンにするという感じです。
水面にまっすぐトリガー判定が張ってあるので、波打ってる水面とちゃんと連動はしてないのが微妙ですが、わたしの力量ではこんなもんです。

スカイボックスの色は、何回も調整してVRで確認した。27枚あった。

と、こういうやり方をしているので、Lux Waterの色と、Skyboxの色に微妙に境目ができるわけで、その調整にめちゃくちゃ時間をかけてしまいました。

余談ですが、先日ワ探で『雨社明神社 -AmeSyaAkeShrine- 2023』行ったんですが、ちゃんと水面と水中がいい感じにつながってて、ほんとうらやましかったです。シェーダー書けるようになりたい~

ちなみに、水の色を変えるトリガーはざっくりこんな感じ。

簡略図

underwater gimmik①には、深い海の水上/水中のいろんな設定を入れて、
underwater gimmik②に浅い海の設定を入れておく。

Spawn時は①がオン、②がオフ。
トリガーAに入ったら、①オフ、②オン。

水中でリスポーンすることもあるので、スポーン地点にトリガーBをいれといて①オン、②オフ。

整理整頓できないUnity画面大公開。InspectorのCyanTriggerの長さよ(スクロールバー見て)

※2023.1.14追記
Triggerに入るとき、船に乗ったままだとonPlayerTriggerEnterが効かなかったので、船にonTriggerEnter判定を付けていたのですが、そうすると2隻あるうちの片方がTriggerをまたいだときに浅瀬の海の色が変わる状態になってしまっていたので、TriggerAの中にいるときは、onPlayerTriggerStayをいれて解決。

③運転できる船

いやーこれも苦労しました・・・。

Udon Kartを使ったのですが、座面の高さや位置を変えて、ちゃんと船の運転席で運転できるようにするのにも時間がかかりました。

記憶が定かではないですが、座る位置はEnterStationの位置じゃなくてSettingWindowのHight OffsetやFB Offsetの数値をいじる必要があったということだったと思います。

あと、ひたすらコライダージャンプしました。原因はRigidBodyの付いた船の子に、コライダー付いた床とかおくと、それ自体にRigidBodyが効いてぶつかるみたいな感じでした。床コライダーにわざわざRigidBodyをつけてis Kinematicにチェックを入れることで打ち消しできました。

Window > Analysis > Physics Debug でみると、どこにRigidbodyがついてるのかわかる。
知ってました?わたしは知りませんでした。

船にみんなでいい感じに乗れるようにするために、椅子はSwivelChairを使いました。SwivelChair、すごくいいです。スピード出して運転しても全然プレイヤーがぶれないし最高でした。

※1点だけ、UdonKartの子にしたSwivelChairに座ると、UdonKartのOwnerがおかしくなって運転できなくなる現象がありました。「なんでだ~!」ってSwivelChairのコードを気合で読んでたのですが、「親のオブジェクトのオーナーをセットする」みたいな雰囲気のコードをコメントアウトしたら大丈夫になりました。この行が何に使われているのかは不明ですが・・・

Networking.SetOwner(lPlayer, parent.gameObject);


④同期

同期は難しくて、いろいろ断念しました。

まず、釣り竿はほんとは船に追従させたかったんですが、これはわたしの力ではできませんでした。作者さまのお話によると、同期変数で管理されているので、これを変えるためにはコードを変えないといけないようでした。

他にも、トランシーバーも船に乗せたかったんですが、VRC Object Syncを付けて船に乗せると、船が動く以上にトランシーバーが動いてしまって、船の位置とずれてしまう現象が起きてしまいました。どうも動くオブジェクトの子にVRC Object Syncを付けるのは得策ではないみたいです。

結局、ちょっと強引ですが、試着ギミックでよく使われる「Attach-To-Me」を使って、持っていけるようにしました。

あと、クジラの位置とか、アニメーションで動いているオブジェクトの同期にはこちらのシステムを使わせていただきました。


⑤サムネイル

最後の最後まで、ワールド名とサムネイルは悩みました・・・。

せっかく作ったので多くの人に来て楽しんでもらえるようなものにしたいなと思う一方、「何でこのワールド作ったんだっけ?」というハザマで揺れ動き続けました。

「船に乗ってカジキが釣れるワールド」って感じでカジキがでかでかと写る写真にすると、「カジキ釣って誰が楽しいんだろう?」って感じだし、

「海がきれいなワールド」「ボートが運転できるワールド」だと、自分が作る意味ないし・・・

ということで、いつも釣りのワールドを作っているという軸はぶらさずに、「Azure Sea Fishing(=紺碧の海釣り)」というワールド名にしました。

サムネイルは紺碧感があって、うっすらカジキが釣れそうな感じのこの写真に決めました。

って、いま見たら同時接続100超えてた!
ありがとうございます!
記念魚拓

ワールドが、制作者の意志から離れる不思議な感覚を得た

今回、ワールドを作ってみて、少し不思議な感覚に陥ることがありました。

このワールドには、カジキやマグロ、浅い海のキレイな魚たちのほかにも、マンタやクジラ、トビウオなどがいます。この生き物たちは、結構探さないと見つからないようになっています。

ワールドを作っている自分自身、テストするときに「いまクジラどこかな?」って探したりしてたんですよね。

普通は、ワールドって制作者のもので、ワールドに起こる出来事はすべて制作者が把握しているというか、制作者が「創造主」的な存在だと思うんですが、このワールドに関しては、うっすら「ほんとに大自然の中で生き物がどこにいるか制作者であるわたし自身もわからない」みたいな心理に陥るときがありました。

もちろん、こういうロジックで動いているから、だいたいこの辺にいるだろう、というあたりはつくのですが。

もしかしたら、ランダムな仕組みで動くようなものを作られたことがある人がいたら同じ感覚を得たことがある人もいるかも?

なんとなく、ワールドと制作者の在り方みたいなことを考えさせられる現象でした。ワールドは、制作者の手を離れて存在した瞬間、現実に似た神がかった存在になってしまう、みたいな。もしかすると、いまは制作者が創造主となっている「ワールド」も、ゆくゆくは制作者自身のものではなく、ランダムな何か、例えば、複数の人の複雑に絡みあった意志や、AI、または自動で動いていく「資本主義」みたいな機構などによって、勝手に育っていってしまうようなことがあるのかもしれない、とか考えていました。

作った感想

前作のGood Night Whales~おやすみ僕らの世界~ を公開してから約1年経ってしまいました。その間こつこつBlender触ってみたり、プライベートワールドを作ったりして勉強してきたことを、うまく吐き出すことができました!

今回はBlenderでのモデリングにも挑戦しました。シームもなにもついてないような代物ですが、桟橋、トローリングチェア、イカダとかは自分でモデリングして作りました。自分でつくったものがワールドになるって、うれしいですね。モデリング、今後も勉強していきたいと思います。

あと、結構全体の工程の9割くらいは細部の調整ばかりやってたので、全体感でいい感じのワールドになっているのかが自分でも自信なくし気味だったのですが、公開後たくさんの人に「いいね!」してもらえて自己肯定感上がりました。ありがとうございます。

※2023.1.14追記
ワールドを更新しました!

https://twitter.com/LoveNecoV/status/1614261216851136514?s=20&t=kRNSPFZg5IMDv2NuSzsdKQ

最後に #ワールド制作初心者交流会 で待ってます!

ケセドさん主催のワールド制作初心者交流会でスタッフやってます!
ほんとにワールド制作って最初はつまづくことが多くて、わたしも教えてもながら覚えてきました。だから、つまづいたら気軽に来て、解決していってほしい!

毎週金曜21:00~開催!
ご参加お待ちしてます。


使わせていただいたアセット類

さやまめのお店
【無料】アニメーション同期システム【UdonGraph】https://booth.pm/ja/items/3645740

3Dモデル(その他)
望遠機能付きテレスコープ【アバター/ワールドギミック】
https://siodamari.booth.pm/items/1441718

DW164のお店
【3Dモデル】シーリングファンライト
https://booth.pm/ja/items/3170865

spookyghostboo
Cliffside Modern Home VRChat Udon World
https://booth.pm/ja/items/2988514

Small Yacht 3D model
https://done3d.com/small-yacht/

cgmodel
ベッド シングル01
https://cgmodel.booth.pm/items/1462134

kurotori4423
KurotoriUdonKart
https://github.com/kurotori4423/KurotoriUdonKart

Package Shop @aivrc
QvPen
https://booth.pm/ja/items/1555789

RAKURAI WORKS
FakeCausticsShader
https://rakuraiworks.booth.pm/items/2157742

スズ製作所
【VRChatワールド用】釣り竿
https://suzufactory.booth.pm/items/2943095

NORIBEN LUNCH -のりべん専門店-
[遠景用]鳥パーティクル / Bird particle
https://booth.pm/ja/items/2339673

AllSky - 220+ Sky / Skybox Set
https://assetstore.unity.com/packages/2d/textures-materials/sky/allsky-220-sky-skybox-set-10109

Lux Water
https://assetstore.unity.com/packages/vfx/shaders/lux-water-119244

Ocean fish - underwater world
https://assetstore.unity.com/packages/3d/characters/animals/fish/ocean-fish-underwater-world-184955

GloverGames Free Ground Textures
https://assetstore.unity.com/packages/2d/textures-materials/glovergames-free-ground-textures-135418

PBR Texture Lib
https://assetstore.unity.com/packages/2d/textures-materials/pbr-texture-lib-82799

Underwater life deluxe
https://assetstore.unity.com/packages/3d/characters/animals/fish/underwater-life-deluxe-115733

Humpback Whale Animated
https://assetstore.unity.com/packages/3d/characters/animals/mammals/humpback-whale-animated-200220

Underwater FX
https://assetstore.unity.com/packages/vfx/particles/environment/underwater-fx-61157

Manta Ray
https://assetstore.unity.com/packages/3d/characters/animals/fish/manta-ray-112440

WATER & BLOOD MEGABundle 02 (331+ VFX)
https://assetstore.unity.com/packages/vfx/particles/environment/water-blood-megabundle-02-331-vfx-22127

Simple Dock Free low-poly 3D model
https://www.cgtrader.com/free-3d-models/exterior/landscape/simple-dock-1ae39aad-9925-404a-acd6-0ff02de4d6ba

みみーラボ
【VRChat】スイベルチェアーギミック(座高調節・キャスター移動機能付き)【Udon】
https://booth.pm/ja/items/2996819

RAKURAI WORKS
CustomFog(Distance,Height,Skybox FogShader)
https://rakuraiworks.booth.pm/items/3718968

noriben
ライトシャフトパーティクル / LightShaft Particle
https://noriben.booth.pm/items/3847304

るしぃ / Rsea
【3D小物】トロピカルジュース【VRChat想定】
https://rsea.booth.pm/items/3728584

bdunderscore
【VRChat用ギミック】 Attach-To-Me
https://booth.pm/ja/items/3132128

潮だまり
エフェクトセット 「雨、雪、風、雪虫」
https://booth.pm/ja/items/3406912

temporal
VRCPlayersOnlyMirror (背景なし No background)
https://booth.pm/ja/items/2685621

仮想雑貨屋 泡沫
Yellow Fin *DB
https://booth.pm/ja/items/2285568

仮想雑貨屋 泡沫
3Dモデル「酸素ボンベ」
https://booth.pm/ja/items/2565464

東京アザラシセンター / TokyoSealCenter
水中ゴーグル_3色セット(UnityPackage)
https://booth.pm/ja/items/3886824

いいなと思ったら応援しよう!