やぎりのブログ

やぎりのブログです。ゲーム制作、プログラミング、エフェクトのことについて書いていきます。

VRChatワールド「TextChat」ギミックざっくり解説

VRChatのワールド、「TextChat」ギミックのざっくりした解説です。
全体的にもっといい方法があるかもしれませんので、ご参考までに。

目次

各ギミック解説

三人称視点

ワールドに三人称用のカメラを置き、その映像をRenderTextureに出力し、プレイヤーカメラに貼り付けることで三人称視点の映像を表示しています。
カメラの位置、姿勢は、Udonで制御しています。Networking.LocalPlayerで取得したVRCPlayerApiの、GetPosition()GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotationを元に位置、姿勢を算出しています。

テキスト送信

同期されるstring変数をメンバに持ったUdonBehaviorをワールドに入る最大人数分用意し、各クライアントに一つづつ所有権を割り当てます。
テキスト送信時は、自分が所有権を持っているオブジェクトのstring変数を書き換えます。各クライアントは変数が書き換わっているかを常にチェックし、書き換わったらテキストが送信されたとみなします。
書き換わったかどうかは各自のローカルで保持している各stringの履歴との比較で判定します。

所有権割り当て

所有権割当マネージャーオブジェクトを用意し、それを所有しているクライアントが、所有権の割当を行います。
所有権の割当は、他のプレイヤーが入ってきた時に行われます。
割当処理はVRC PrefabsのUdonStringEventsを改変したものを用いており、各プレイヤーJoin時から少し間を開けて所有権を設定する処理はSimple Object Poolを参考にしています。

文字数制限

Udonのstringは一定文字数以上を同期すると後半が欠けるようなので、特定の文字数以上が入力された場合は文字をトリミングしてから送信しています。

UI

UIは全てuGUIを用いています。

Tを押すと入力開始する処理

Tキーを押した時にInputFieldが選択され、入力可能になります。
InputFieldのSelectを呼ぶだけだと入力開始にならない場合があるので、ダミーの選択可能UIを用意しておき、一度そのUIのSelectを呼んでから、InputFieldのSelectを呼んで確実に入力開始にしています。
また、Navigationが張られている場合、WASDを押すと他のUIにフォーカスが移るので、解除してあります。

各プレイヤー頭上のテキスト表示UI

一人称視点の場合はRender ModeWorld Spaceのテキスト表示UIを、
三人称視点の場合はRender ModeScreen Space - Overlayのテキスト表示UIを用いて表示を行っています。
テキスト表示UIは、一、三人称視点用それぞれにワールドに入る最大人数分用意してあります。