-
Notifications
You must be signed in to change notification settings - Fork 4
Manual ObjectSync
VRC Object Sync
コンポーネントはアタッチするだけでいい感じに同期してくれますが、 ContinuousSync(連続同期) のため、 ManualSync(手動同期) のUdonスクリプトと相性が悪い事が知られています。
これは ManualSync な VRC Object Sync
として置き換える事を目指したU#スクリプトで、オブジェクトにアタッチするだけでTransformの位置、回転、スケールの変更が自動的に同期されるようになります。
Transformの変更はオブジェクトのオーナーの元でチェックされ、Transformに変更があった時だけ非オーナーに同期が走るようになっています。もちろんLater-joinerにも同期します。
- Manual ObjectSyncギミック
- Manual ObjectSync用または汎用補助ギミック
ManualObjectSyncを付けたいオブジェクトをHierarchyから選択し、「Add Comppnent」から Manual Object Sync
を検索してアタッチしてください。
このコンポーネントを付けると、オブジェクトのオーナーが一定間隔でTransformに変動があるかをチェックし、変動があれば同期します。
一緒に Rigidbody
が付いている場合はIs Kinematic、Gravityの同期的制御もできるようになっています(ただし、非オーナーは同期の都合上Is Kinematicが強制オンにされます)。
Warning
Rigidbody
のIs Kinematicがオフでも同期しようとはしますが、スムージング機能はありません。常時動き続けるようなオブジェクトには VRC Object Sync
の使用を検討してください。
一緒に VRC Pickup
が付いている場合は、ピックアップしたプレイヤーがオブジェクトのオーナーになり、ピックアップしている間は手ボーンからの相対位置を同期し、手への追従処理をローカルで計算するようになっています。そのため VRC Object Sync
と比べて最低限の通信量で、かつ滑らかに位置同期します。
デスクトップモードでピックアップのオフセット位置・向きを調整した時も自動的に検知して同期します。
ManualSync 同期のため、一緒に他の ManualSync な Udon 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
を再設定します。
サンプルに位置一括リセットスイッチのプレハブが入っています。
インタラクトすると Reset Objects
配列にセットされた同期オブジェクトを初期位置に戻すギミックです。
具体的には、 VRC ObjectSync
や Manual ObjectSync
、 SmartObjectSync
、または Respawn()
メソッドを持つUdonスクリプトが付いたオブジェクトのOwnerにRespawn()を実行させます。
サンプルにMOS Attacherという名前でオブジェクト追従化コライダーのプレハブが入っています。
このコライダーに接触(コリジョン or トリガー)した Manual Object Sync
をアタッチモードにします。
主にピックアップオブジェクトを引き出しの中に閉まっておいたり、トレーの上に乗せて運んだり、といった利用を想定しています。
オマケで、ピックアップ系イベント(OnPickup, OnPickupUseDown, OnPickupUseUp, OnDrop)とInteractイベントを別のオブジェクトに付いた Udon Behaviour
(またはU#スクリプト)に横流しできる、 Pickup Event Transfer
コンポーネントを追加しました。
VRC Object Sync
を使ったピックアップオブジェクトから ManualSync な Udon Behaviour
、U#スクリプトを使いたい場合に便利です。
以下の調節用パラメーターがあります。
- Move Check Tick Rate : オーナーがTransformの変動を確認する周期です。フレーム単位のため、オーナーのfpsに依存します。
- Move Check Space :Transformの変動チェックを自身のローカル空間で評価するか、ワールド空間で評価するか選択します。
- Attach Point : アタッチモード中の追従先です。U#スクリプトから動的に差し替える事は出来ますが、同期しないので、差し替えるスクリプト側で同期を組んでください。
以下のpublicなメソッド・プロパティを持ちます。 オブジェクトのオーナーが実行してください。
一緒に付いている Rigidbody
と VRC 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() | オブジェクトのアタッチモードを解除します。 |
VRC Pickup
と一緒に付けることで、ピックアップ系イベント(OnPickup, OnPickupUseDown, OnPickupUseUp, OnDrop)が呼ばれた時にTargetにセットされた Udon Behaviour
(またはU#スクリプト)に向けて同じイベントを実行します。
以下のパラメーターがあります。
- Target : ピックアップ系イベントを渡す先です。渡し先のオブジェクトには
VRC Pickup
が付いていなくても実行されます。
以下のパラメーターがあります。
- Reset Objects : このスイッチをインタラクトした時に位置リセットするオブジェクト。対象オブジェクトに
VRC Object Sync
か、Respawn()
メソッドを持ったUdonスクリプトが必要です。 - Interval : 位置リセットを連打されないためのインターバル期間です。単位は(秒)。
以下のパラメーターがあります。
- Target : このオブジェクトと衝突(コリジョンまたはトリガー)した時に、対象オブジェクトに
Manual Object Sync
が付いていたらアタッチモードにします。
このコンポーネントは 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