Skip to content

Manual ObjectSync

MimyQuality edited this page Mar 24, 2024 · 26 revisions

概要

VRC Object Sync コンポーネントはアタッチするだけでいい感じに同期してくれますが、 ContinuousSync(連続同期) のため、 ManualSync(手動同期) のUdonスクリプトと相性が悪い事が知られています。
これは ManualSyncVRC Object Sync として置き換える事を目指したU#スクリプトで、オブジェクトにアタッチするだけでTransformの位置、回転、スケールの変更が自動的に同期されるようになります。
Transformの変更はオブジェクトのオーナーの元でチェックされ、Transformに変更があった時だけ非オーナーに同期が走るようになっています。もちろんLater-joinerにも同期します。

導入手順

Installation

パッケージ内容

  • Manual ObjectSyncギミック
  • Manual ObjectSync用または汎用補助ギミック

使い方

ManualObjectSyncを付けたいオブジェクトをHierarchyから選択し、「Add Comppnent」から Manual Object Sync を検索してアタッチしてください。
このコンポーネントを付けると、オブジェクトのオーナーが一定間隔でTransformに変動があるかをチェックし、変動があれば同期します。

manualobjectsyncaddcomponent

一緒に Rigidbody が付いている場合はIs KinematicGravityの同期的制御もできるようになっています(ただし、非オーナーは同期の都合上Is Kinematicが強制オンにされます)。

Warning

RigidbodyIs Kinematicがオフでも同期しようとはしますが、スムージング機能はありません。常時動き続けるようなオブジェクトには VRC Object Sync の使用を検討してください。

一緒に VRC Pickup が付いている場合は、ピックアップしたプレイヤーがオブジェクトのオーナーになり、ピックアップしている間は手ボーンからの相対位置を同期し、手への追従処理をローカルで計算するようになっています。そのため VRC Object Sync と比べて最低限の通信量で、かつ滑らかに位置同期します。
デスクトップモードでピックアップのオフセット位置・向きを調整した時も自動的に検知して同期します。
ManualSync 同期のため、一緒に他の ManualSyncUdon Behaviour 、U#スクリプトをアタッチする事が可能です。

Warning

アバターをHideやFallbackしていたり、PC⇔Quest間などで異なるアバターが見えている場合、ピックアップ中の位置や向きがズレて見える事があります。その場合でも、ドロップすると正確な位置に同期します。

更新管理オブジェクト

シーン上に Manual Object Sync があると、MOS Update Managerと言う名前のオブジェクトがシーン上に一つ追加されます。 Manual Object Sync をシーン中に一つ以上使っている場合は、これを消さないでください。
誤って消してしまった場合は、どれでも良いので Manual Object Sync のパラメーターを変更してください。オブジェクトがシーン上に追加されます。(オブジェクト復旧後はパラメーターを戻して大丈夫です)。
Manual Object Sync の同期が動かないものが出た場合は、 MOS Update Manager コンポーネントのリセットを試してください。シーン中の全 Manual Object Sync を再設定します。

image

位置一括リセットスイッチ

サンプルに位置一括リセットスイッチのプレハブが入っています。
インタラクトすると Reset Objects 配列にセットされた同期オブジェクトを初期位置に戻すギミックです。
具体的には、 VRC ObjectSyncManual ObjectSyncSmartObjectSync 、または Respawn() メソッドを持つUdonスクリプトが付いたオブジェクトのOwnerにRespawn()を実行させます。

オブジェクト追従化コライダー

サンプルにMOS Attacherという名前でオブジェクト追従化コライダーのプレハブが入っています。
このコライダーに接触(コリジョン or トリガー)した Manual Object Sync をアタッチモードにします。
主にピックアップオブジェクトを引き出しの中に閉まっておいたり、トレーの上に乗せて運んだり、といった利用を想定しています。

ピックアップイベント転送スクリプト

オマケで、ピックアップ系イベント(OnPickup, OnPickupUseDown, OnPickupUseUp, OnDrop)とInteractイベントを別のオブジェクトに付いた Udon Behaviour (またはU#スクリプト)に横流しできる、 Pickup Event Transfer コンポーネントを追加しました。
VRC Object Sync を使ったピックアップオブジェクトから ManualSyncUdon Behaviour 、U#スクリプトを使いたい場合に便利です。

高度な使い方

Manual ObjectSync

以下の調節用パラメーターがあります。

  • Move Check Tick Rate : オーナーがTransformの変動を確認する周期です。フレーム単位のため、オーナーのfpsに依存します。
  • Move Check Space :Transformの変動チェックを自身のローカル空間で評価するか、ワールド空間で評価するか選択します。
  • Attach Point : アタッチモード中の追従先です。U#スクリプトから動的に差し替える事は出来ますが、同期しないので、差し替えるスクリプト側で同期を組んでください。

以下のpublicなメソッド・プロパティを持ちます。 オブジェクトのオーナーが実行してください。
一緒に付いている RigidbodyVRC Pickup の一部パラメーターは Manual Object Sync から変更するようにしてください。変更は同期されます。

返り値 名前 説明
bool UseGravity Ridigbody が一緒に付いている場合、そのUse Gravityパラメーターを変更します。
bool IsKinematic RigidBody が一緒に付いている場合、そのIs Kinematicパラメーターを変更します。
bool Pickupable VRC Pickup が一緒に付いている場合、そのPickupableパラメーターを変更します。
bool IsHeld オブジェクトをピックアップ中か。他人がピックアップ中もtrueになります。(読み取り線用)
PickupHand PickupHand どちらの手でピックアップしているか。他人がピックアップ中も変化します。(読み取り線用)
bool IsEquiped オブジェクトがボーン装着モードか。(読み取り線用)
bool IsAttached オブジェクトがアタッチモードか。(読み取り線用)
void Respawn() オブジェクトを初期位置に強制移動させます。
void ResetScale() オブジェクトのスケールを初期サイズに変更します。
void Equip(HumanBodyBones) オブジェクトをボーン装着モードにします。対象はオブジェクトのオーナーです。実行時に指定したボーンとのオフセット位置・向きを維持、同期します。
void Unequip() オブジェクトのボーン装着モードを解除します。
void Attach() オブジェクトをアタッチモードにします。オブジェクトがAttach Pointで指定した位置・向きに揃います。
void Detach() オブジェクトのアタッチモードを解除します。

PickupEvent Transfer

VRC Pickup と一緒に付けることで、ピックアップ系イベント(OnPickup, OnPickupUseDown, OnPickupUseUp, OnDrop)が呼ばれた時にTargetにセットされた Udon Behaviour (またはU#スクリプト)に向けて同じイベントを実行します。
以下のパラメーターがあります。

  • Target : ピックアップ系イベントを渡す先です。渡し先のオブジェクトには VRC Pickup が付いていなくても実行されます。

ResetSwitch For ObjectSync

以下のパラメーターがあります。

  • Reset Objects : このスイッチをインタラクトした時に位置リセットするオブジェクト。対象オブジェクトに VRC Object Sync か、 Respawn() メソッドを持ったUdonスクリプトが必要です。
  • Interval : 位置リセットを連打されないためのインターバル期間です。単位は(秒)。

MOS Attacher

以下のパラメーターがあります。

  • Target : このオブジェクトと衝突(コリジョンまたはトリガー)した時に、対象オブジェクトに Manual Object Sync が付いていたらアタッチモードにします。

Equip With MOS

このコンポーネントは VRC Pickup と一緒に使う必要があります。
Useすると Target に指定した Manual Object Sync に対してボーン装着を実行します。対象は実行者です。
ピックアップすると Target に指定した Manual Object Sync に対してボーン装着を解除します。
以下のパラメーターがあります。

  • Snap Point : ここにセットしたオブジェクトを基準に、もよりボーンをサーチします。
  • Target : 操作対象の Manual Object Sync です。

サンプル

以下のワールドにサンプルを設置しています。
https://vrchat.com/home/world/wrld_4b7ed36e-c436-409f-9f87-8a6f4c80e79b