見出し画像

VRChatで同期変数を使ったゲームギミックを実装する

これまでcluster上で制作していた巨大迷路を、プラットフォームを越えてVRChatでも公開を開始し始めました。

VRChatにはUdonというビジュアルプログラミング環境が用意されていますが、それをUnity C#のようにスクラッチに実装することの出来るudonsharpというコンパイラが存在しているということで、少し勉強がてらプレイヤー間で同期可能なゲームギミックを実装してみました。

まず最初にプレイヤー間で同期を取った処理を行うということはどういうことなのか、VRChatの仕組みそのものが分かっていなかったので、VRChatのリファレンスを読んでみたりWeb上をあさっていろいろ調べるところから始めて、
なかなか情報は少なくいろんなサイトをあさりましたが、ハツェさんという方の「ハツェの真時代傾向璋」というサイトがとても詳しく書かれていて大変お世話になりました!感謝ですね☆

そして今回ゲームギミックとして実現したかった機能としては、
① 参加ボタンで迷路ゲーム開始
② 各チェックポイント通過でチェックポイント毎にアバターの頭上へアイコン点灯
 (他プレイヤーからも見えること)
③ ゴール通過ですべてチェックポイント通過できていない場合はヒント表示、
 完全にゴールでゴール用のオブジェクト表示
④ リセットボタンで迷路ゲームを初めから再開
⑤ 終了ボタンで迷路ゲーム終了
⑥ ゲームの情報を参加者一覧ボードで表示
 (他プレイヤーからも見えること)

と、だいたいこんな感じ。

学んだ情報を踏まえて、
VRChatのプロセスとしては基本的に各ユーザの端末にクライアントが存在していて、ワールドを稼働させるためのプログラムをダウンロードした上で、あくまでローカルで稼働しているということ。
各ユーザ間で実現可能な同期処理には制約が多々あり、プリミティブな型でないと同期できなかったりするということ。
などなどの情報から、状態遷移を整理して同期する情報を絞って今回は文字列の配列を用いた状態の同期を採用しました。
ざっくりな方式イメージとしてはこんな感じで、
おおまかには、ユーザのアクションから状態を更新して、更新を検知したらオブジェクトへ反映するという流れです。
※イメージは想像も含まれているので誤っていたらすみません、

方式イメージ
概要シーケンス

ポイントとしては、
① OnValueChangedという同期変数の仕組みの採用(Manual同期)
② 同期変数を扱ううえで重要な制約となるオブジェクトのオーナ権を付与するためのSetOwnerの呼び出し
③ 同期変数を同期するためのRequestSerializationとOnDeserializationの呼び出し
のあたりかな。

そして無事実装を終えて実現したかったギミックを完成させることができました!
なかなかudonの開発は難しいと聞いてたのですが、同期のデバッグとか簡単にできないので無駄に取られる時間が多いなと実感します、、
(大人数でのテストとかできてないのでバグが無いといいのですが)
とはいえ、いろいろと学ぶことも多く次にやってみたいことも出てきたので、また次の試行錯誤始めていきたいと思います。

参加、リセット、終了ボタン
チェックポイントと通過アイコンの点灯
参加者一覧表示ボード

作成したワールドは現在コミュニティーラボに登録中となっています。
VRChatは公開ワールドとして全ユーザから見えるようになるためには、このラボで一定の基準を満たす必要があります。
基準は明確に公表されていないようですが、ワールドに訪れた人数(Visits)やお気に入り(Favorites)登録者数が影響しているらしいので、ご興味があればぜひぜひ遊びに来てください!!

ワールド : 懐かしの巨大迷路

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