パラリアル大阪の担当ギミック紹介と解説

# はじめに
このヨドコロちゃん、バーチャルマーケット2022 Summer(Vket2022 Summer)の会場の一つ「パラリアル大阪」で、JR西日本様のワールドギミックを担当させていただくことになりました。
Vket6のJR東日本様に続いて2回目です。(2021の時はいなかった)

https://summer2022.vket.com/

どこどこを作った、みたいなことは自由に書いていいという許可をPM兼Dの[なごみ](https://twitter.com/nagomin12 "なごみちゃんtwitter")ちゃんより頂いたので書いてみることにします。
あまり細かい解説はしないので、わからなくて気になる箇所があったらコメントしてください。気付いた時に返します。

※当たり前ですが、パラリアル大阪のネタバレを含みます。まだ行ってない人は是非行ってみてから読んでね。

# ゴジラの滑り台
大阪駅の目玉の一つ。矢印の通りに進むと足を滑らせたように滑り始め、そのままジャンプ台に飛び込み口の中へ……ｷﾞｬｰ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/b991c33e-3cf7-a0ed-65fd-a03b3cf60474.png)
これはStationのPlayer Enter LocationをAnimatorで動かすことで移動させています。自動で降りる部分はAnimation Clipの中でAnimation Eventを呼び、UdonからExitStationを呼びます。
移動はNetwork Eventで同期させ、誰かが滑っている時は他の人が進入できないようにしています。
状態遷移をNetwork EventでやるのはLate Joinerに同期できないので普通はやらないのですが、ここではJoinしてからここに辿り着くまでに時間がかかるのと、ほんの十数秒で自動で元の状態に戻るタイプのギミックなので軽量化を優先してます。
移動のアニメーションはもちろん同期ですが、テレポート時の暗転はローカル動作となるようにAnimator Controllerのレイヤーを分けて別の変数で制御しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/f986961e-2bb0-8162-e760-ef704d360c00.png)

ちなみに入り口のエレベーターはボタンをInteractする他、ドアに進入しようとしてもテレポートできます。親切！
暗転→テレポート→復帰、というシーケンスはVketの会場各所で散見されますが、これらは共通のPrefabが用意されておりヨドコロちゃんは特に何も作ってません。音を鳴らす機能までついてて至れり尽くせり。

# ぴちょんくんスイッチ
スイッチを押す度に色が変わります。ランダムではなく一定順序でローテします。そして同期しています。
実物は色だけでなく看板の文字も変わったり、「花粉症」でマスクをしたり、「熱中症　厳重警戒」とかいって汗だくぴちょんくんになったりするらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/a40c467e-c376-0ed9-0ef0-cd12392724ed.png)
これはAnimatorにintを渡しています。intの同期変数を用意し、Interactした人が+1します。一周したら0に戻します。
スイッチはゴジラ滑り台前と「時空の広場」の2箇所にあります。一見同じスイッチに見えますが、同期変数は1つでいいので、一方は同期を管理しているもう一方のメソッドを呼んでいるだけのサブUdonです。
当たり判定用のBox colliderを2つ付けるとかでもよかったのかもだけど、配置は他の人がやったりするので保守性の問題で分けました。

# ICOCA券売機・改札
そろそろ恒例になってきたやつ。今回はJR西日本様なのでSuicaではなくICOCAです。
これはVket6の時に作ったもののほぼ使い回し。Vket2021の時にも担当の方が改変して配置してくれていたとのこと。一度作ったものが長く愛されると……嬉しい！
西と東は別会社なので音とかは録り直しでは？　などひと悶着あったものの、機械のメーカーは同じじゃんってことでそのまま残されました。
もちろん3Dモデルの方は両方一新されてます。これについてはモデラーの倭文ちゃんが詳しくﾂｲｰﾖしてくれました。ありがと！

https://twitter.com/toy_box_sitori/status/1559460791459651586

ギミック的にはほぼAnimatorで完結してます。センサーとして状態を渡すUdonが3つあり、センサーの状態と時間経過に応じて機械の状態も遷移するというまんま組み込み系みたいな作りになってます。
余談だけどヨドコロちゃんは元々そういう組み込み畑の出身なのでこういうのは大好きだったりする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/ff94bfef-f2ef-3227-d671-b5ead92c8295.png)
センサーは「ICOCAタッチ」「進入」「逆進入」の3つで、Animator自体から各センサーのColliderもON/OFFしてしまうことでUdon側の状態管理を無にしています。ステートも一見複雑ですが、Idleから矢印を辿っていくと1つ1つの経路はシンプルになっていることがわかると思います。
タッチしたら開く、開いたら閉まる、タッチしてないのに入ったらエラー鳴る、鳴った後でタッチしたらまた開く……など。まさしくステートマシンですね。
こういうステートマシンをそのまんまの形で実装できるのはUnityのAnimatorの最高なところ。
そんなわけでUdonは1行も変えてませんが、モデルが変わって構造やオブジェクト名も変わったのでAnimation Clipは全部作り直しています。
センサーの方は別レイヤーになっていて、ICOCAをタッチした人としてない人ではセンサーの状態が変わるようになっています。なので誰かがタッチしてゲートが開いたからといって別の人が便乗して通ろうとするとちゃんとエラーになります。ピンポーン。キセル乗車はダメ、ゼッタイ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/cf0e78c1-9aa0-0d5c-99fe-a034a9d4cea6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/a88af0d8-50a4-dc0a-608b-0a33f43de339.png)

# 零式人機
個人的イチオシポイント。操作機のハンドルを握ると、人機一体様の人型重機"零式人機"の手が動きます。待機中はゆっくり手を振ってくれます。
当初は手を振るだけという提案だったのですが、ヨドコロちゃんがDの[あおみ](https://twitter.com/aomicreate "あおみちゃんtwitter")ちゃんに「動かさなきゃウソでしょ！？！？」っつって勝手に作り込んで、動くということにしてもらいました。
内部資料なので詳しくは言えないのですが、人機一体様から非常に詳細な資料を頂いており、その熱意にも強く影響されました。これを置物として飾るだけなんてとんでもない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/66c7a7c0-0571-b42c-29e4-8e14a1450d01.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/372cc0ba-eeab-b998-a203-19174cee1600.png)
その仕組みですが、当初はマジで6軸くらいのIKをUdonで書いてやろうじゃん！　と意気込んでいましたが、流石にそんな工数も能力もなかったのでAnimatorでどうにかしています。
零式人機はちょっとびっくりするくらい関節が多く、関節のいくつかをそれぞれ上下左右前後に独立に割り当てても余るくらいあります。なので「前後に動かすAnimation Clip」「左右に動かすAnimation Clip」「上下に動かすAnimation Clip」を、左右の腕で計6つ作成し、Motion Timeにfloatを渡すことで制御しています。
ハンドルの方にも同じようにAnimatorと6つのAnimation Clipが割り当てられており、同じくMotion Timeで制御しています。
で、握る部分のPickupは、握っている間だけUpdate()の中でローカル座標を取得し、可動範囲内にClampした上で各Animatorに渡す値を決定します。中央なら0.5、上なら1.0、下なら0.0、みたいな感じです。
左右だけはちょっと特殊で、位置ではなく軸の中心からの角度なのでそのままAtan2で求めています。
おまけでPickUpUseDown/Upで掴む・離すの動きも加えて動きは完成です。

同期は握ってるかどうかとPickupのObjectSyncの2点のみで、ハンドル位置は位置同期から自動で同期される仕組みです。
音は直前の5フレームくらいの位置を覚えておいて速度を求め、それをVolumeとPitchに割り当てています。

# 金属探知機
これはどこの企業様でもないプロップ。ワールドモデラーのコクリコちゃんが「作ったのでピーピー鳴らしたい」と言い出して音まで用意してくれたので速攻で作った。　勢い！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/765898cf-cc01-a8e6-6200-33bea38a8c46.png)
通常、この手のPickupは一般ブースと同じく時間経過で自動リスポーンする機能が入ったVketPickupというPrefabにくっつけてAnimator Overrideで制御することになっているのですが、そっちのAnimatorは諸事情によりPickupUseUp時のTransitionにExit timeとしてFixedな1[s]が挿入されており、トリガーを連打した時にちゃんとピーピー連打されてくれないので自分で作り直しています。

# 泉佐野市様
## 焼肉
ステーキ大の黒毛和牛を大胆にもそのまま網火で焼きまくります。ジュワーッ！　モクモク！
こだわりポイントとして、通常放置されているPickupは時間経過で自動リスポーンすることになっているのですが、この肉は網の上に乗っている間だけ自動リスポーンが無効になります。そして辺り一面においしそうな音と香ばしい煙パーティクルを永遠に振りまき続けます。バーチャル飯テロです。
牛肉なのでミディアムやレアの状態で焼くのをやめることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/b01ef556-85da-c47f-6aae-20761f835c57.png)
トングで掴む・離すは掴んだ人のローカルではSetParentで肉を一時的にトングの子オブジェクトにすることでPostLateUpdate()を呼ばずに済ませています。
他のプレイヤーからは普通にObjectSyncの位置同期のみで追従するように見せています。
色の変化はAnimatorから時間経過で進行させ、UdonからはSpeed Mutiplierで焼いたり止めたりをしています。
見え方自体は自作シェーダーです。焼いた前後のテクスチャをlerpでブレンドしています。この技術は弊ワールド「[Marshmallow Camp](https://vrchat.com/home/world/wrld_02a0cda8-9866-476f-96c2-756b2db39df1 "ワールドリンク") 」でマシュマロを焼くために作ったものを流用しています。

ところで今回のVketでは他にもBEAMS様、Y-YACHT様、ALPINE様のブースでそれぞれ肉を焼くギミックがあり、企業ブースは空前の肉焼きブームとなっています。それぞれアピールポイントが異なる個性豊かな内容となっておりますので是非制覇してみてください。
特にY-YACHT様は焼いた肉の3Dモデルを配布していてお得ですぞ。

## ポスターの矢印
ポスターに近付くと指が出てInteractできることを示唆します。こういう細かい気配りが大事なんだよな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/26e90905-697d-5475-9510-a3f396cf2ed1.png)
実装はプレイヤーのCollider進入をローカルに検知してAnimatorにBoolを渡しているシンプルなものです。
これは厳密さも不要なのでCulling ModeもCull Completelyにしています。出てる状態で視界から外して、離れてから振り向いてみると遅れてスッと消えるところが見えて面白い。
同じものを焼津市様のポスターにも配置しています。

## 喋るゆるナキン君
泉佐野市のゆるキャラ、ゆるナキン君が立っており、近付くと「ゆるナキンだよぉ～」「まいど～おおきに～」など、7種類のセリフを喋ります。
声は泉佐野市様から送られてきたゆるナキン君本人ボイスです。君は全部聞けたかな？

https://twitter.com/Virtual_Market_/status/1559717582978285568

実装はポスターと同じくプレイヤーのCollider進入をローカルに検知してAnimatorにBoolを渡しています。
しかしこっちはローカルのみの判定とは別に全プレイヤーの判定でTriggerも渡してあり、フキダシは自分だけ、セリフ音声は誰でも、となっています。
セリフはランダムなのでできるだけ再生機会を増やしたいのでこのようにしています。

## ロデオマシン
中央にあるロデオマシンにはStationがついていて、乗るとちゃんとまたがるポーズになります。イーハァ！
当初はロデオマシンとしてぐりんぐりん動かすという提案がありましたが、VRだと思いっきり酔うのであえなく却下になりました。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/cb7e846d-5c05-ad16-0db4-0ad8a7916550.png)
さりげないですが、アバターサイズに関わらずHipボーンらへんがちゃんと座り位置に来るように自動調整される機能が付いています。これもVketのCommon Prefabの1つで、会場各所の椅子で使われています。

# 焼津市様
## マグロ解体ショー
包丁を握ると掛け声とともに太鼓の演奏が始まり、マグロに刃を滑らせると華麗に解体されていきます。
これを作るためにマグロ解体動画をいっぱい見ました。どんなにデカくても基本は三枚おろしからなんですね。面白い。
事実に忠実に作ると縦にも切り込みを入れて4分の1ずつ切り離すみたいになるのですが、テンポが悪くなるのとシュパッと切った感が出たほうが嬉しいのでデフォルメしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/4f2725ea-1f7e-a479-b561-f15509bd4151.png)
マグロの中骨らへんと包丁にColliderがついていて、当たるとAnimationが再生されます。同期できるようにTriggerではなくintで遷移させており、Udon側で数値を管理しています。
完成後はカマ(頭)をPickupで持てるようになりますが、これは見せる用のメッシュとPickupのオブジェクトで別々になっていて持てるようになるタイミングで入れ替えています。VketPickupを初期Inactive状態にすると壊れるのでMesh RendererとVRCPickupのIsPickapableだけを切り替えてたりします。
ギミックはシンプルなのですがモデルと音響が本当に良くて、開発チーム内でちょっと盛り上がったりしました。

https://twitter.com/furusat72966846/status/1555508917295149056

https://twitter.com/furusat72966846/status/1560582357626798080

イベントでも活用して頂いたようです。世界初！ありがとうございます！

# 無限納税シューター
これ何？？？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627722/4385c27a-bc36-699a-d518-d45564b7cc85.png)
「泉佐野市のアピール」的なキャプションが付いたﾂｲｰﾖをいくつか見かけましたが、これはワールド側のプロップの一種でいかなる参加団体様とも無関係です。Vketに参加してくれた市区町村に向かって「Lv.1 寒村A」なんて言うわけないでしょーが！
ふるさと納税を扱うエリアなのでふるさと納税自体を面白くアピールしたいね……くらいのふわっとした要望をヨドコロちゃんが~~マフィアシティ~~パリピ風に味付けしたものです。
Particle Collisionを検知して値を加算、一定時間当たらないと時間経過で減算、という処理をUpdate()でやっていて、その値をAnimatorに渡してMotion TimeでLv.1～Lv.5000兆の間で遷移させています。

ギミック自体は7月末に完成していたのですが、肝心の演出部分が全く決まらないまま開催前夜くらいにパーティクル担当のReimhakさんに無茶振りが飛び、出てきたものを元にヨドコロちゃんがえいやっと仕上げました。勢い！
わけのわからない物体の割にtwitterでは大変好評いただいており、社長のおすすめコンテンツにまで選ばれました。なんでやねん！
落書きが異様に伸びちゃって微妙な気分の絵師ってこんな気持ちなのかもしれん。いや遊んでいただいてとても嬉しいですありがとうございます。

https://twitter.com/funacosystem/status/1558287005405941760

# その他
他、Vket6の頃に作ったものの流用として774.inc様のチラシ配りがあります。ヨドコロちゃんのnamespaceに入ったままCommon Prefab扱いになってニューヨークでも使われてました。一度作ったものが長く愛されると……嬉しい！　誰が配置してくれたのか知らないけどありがとうございます。

作ったけどオミットされたものとして、大阪駅前の階段らへんと空港エリアを直接繋ぐテレポートがありました。Webページ開くやつの改変で「テレポートしますか？」という確認ダイアログが出る代物です。急に言われて慌てて作ったけど急にキャンセルになってお蔵入り。ゲーム開発あるある。

あと電車ギミックですが今回はヨドコロちゃんの作ではありません。鋭い人は前回までとは挙動が微妙に違うことに気が付いたかと思います。
ギミックチームの一人、[ちう](https://twitter.com/ChiuGameProject "ちうさんtwitter")さんが新規に書き下ろしています。車窓が写真に写らない、乗り遅れた人が車窓の外に見える、Pickupが取り残される、などの問題が解消され、なんと電車をカーブさせるという無茶振りにも対応予定だったとか何とか。すごいぜ！

# まとめ
こうして並べてみるとほとんどAnimatorでどうにかしているのがよくわかりますね。Udonは添えるだけ。
Animatorを制する者はUnityを制するのだ。ワハハ。

実は今回は特に参加するつもりはなかったのですが、あおみちゃんから要請を受けて開催間近で飛び込みでの参加になりました。なのでVket公式アカウントに投稿されたクリエイター紹介動画にも載ってません。影の立役者みたいでかっこいい。
作ったものでみんなが遊んでくれるとやっぱり嬉しいですね。これからも色々作っていきたい！ VRの世界にハッピーを届けていくよっ！

# 謝辞
ヨドコロちゃんはUdonスクリプトと付随するAnimatorという見えない箇所の担当で、ヨドコロちゃんひとりではどんなギミックも中身のない箱に過ぎません。目に見える、聴こえる部分を作ってくださった他のクリエイターたちあってのギミックチームなのです。
3Dモデラーの倭文さん、熊谷クルルさん、丸井アリスさん、コクリコちゃん、音響のyuugen6さま、パーティクル・演出のReimhakさん、ポーズアニメーションの八ツ橋まろんさん、そして誘ってくれたディレクターのあおみちゃん、出展企業・団体のみなさまとご来場いただいた全てのVRChatterにスペシャルに感謝申し上げます。