Manual ObjectSync - mimyquality/FukuroUdon GitHub Wiki
概要
Manual ObjectSync は、より軽量な VRC Object Sync として置き換える事を目指した U# コンポーネントです。
VRC Object Sync コンポーネントはアタッチするだけでいい感じに同期してくれますが、内部的に ContinuousSync(連続同期) で通信しているうえ、不動(Sleep)状態だと同期も同じオブジェクトにある Udon ごと停止します。
Manual ObjectSync は名前の由来にもなっている ManualSync モードで同期するため、ManualSync 同期の他の Udon コンポーネントと共存可能です。
オブジェクトにアタッチするだけで Transform の位置、回転、スケールの変更が自動的に同期されるようになります。Transform の変更はオブジェクトのオーナーの元でチェックされ、Transform に変更があった時だけ非オーナーに同期が走るようになっています。もちろん Later-joiner にも同期します。
ピックアップオブジェクトに付ける場合、ピックアップ中はピックアップしているプレイヤーの手ボーンに追従する仕組みのため、VRC Object Sync のような位置ズレも起きません。
Manual ObjectSync を補助するコンポーネントもいくつか用意しています。
アタッチするだけで AudioSource の再生位置や Animator パラメーターをいい感じに同期してくれるコンポーネントもあります。
導入手順
パッケージ内容
- Manual ObjectSync ギミック
- Manual ObjectSync 用または汎用補助コンポーネント
- AudioSource や Animator パラメーターの同期コンポーネント
使い方
Manual ObjectSync を付けたいオブジェクトを 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 コンポーネントが付いたオブジェクトのオーナーに Respawn() を実行させます。
オブジェクト追従化コライダー
サンプルに MOS Attacher という名前でオブジェクト追従化コライダーのプレハブが入っています。
このコライダーに接触(コリジョン or トリガー)した Manual Object Sync をアタッチモードにします。
主にピックアップオブジェクトを引き出しの中に閉まっておいたり、トレーの上に乗せて運んだり、といった利用を想定しています。
ピックアップイベント転送コンポーネント
Pickup Event Transfer は、ピックアップ系イベント(OnPickup, OnPickupUseDown, OnPickupUseUp, OnDrop)と Interact イベントを別のオブジェクトに付いた Udon コンポーネントに横流しできるコンポーネントです。これにより、ピックアップオブジェクトと、Udon コンポーネントを別オブジェクトに分離できます。
VRC Pickup が付いているオブジェクトに「Add Comppnent」からPickup Event Transfer を検索してアタッチします。Target に Udon Behaviour (または U# コンポーネント)を設定してください。
VRC Object Sync を使ったピックアップオブジェクトから ManualSync な Udon コンポーネントを使いたい場合に便利です。
音声の再生状態同期コンポーネント
Audio Play Sync は音声の再生時間と状態を同期するコンポーネントです。
Audio Source が付いているオブジェクトに「Add Comppnent」からAudio Play Sync を検索してアタッチしてください。このオブジェクトのオーナーが周期的に再生時間と状態を確認し、同期します。
仕様上、再生開始/終了 のタイミングを完全に同期するものではありません。主に Later-joiner に再生時間を同期するためのコンポーネントとなります。
Sync Volume にチェックを入れると、音量も同期できるようになります。
Animator のパラメーター同期コンポーネント
Animator Parameter Sync は(アニメーションの結果ではなく)アニメーターのパラメーター値を同期するコンポーネントです。要するにワールド版 ExpressionParameters です。
Animator が付いているオブジェクトに「Add Comppnent」からAnimator Parameter Sync を検索してアタッチし、同期したいパラメーター名を Parameter Names に羅列してください。型は自動で判別しますが、プラットフォーム間で一致している必要があります。
float 型のパラメーターはリモート視点で値の変化をなだらかにする補間機能があります。使い分けたい場合は Animator Parameter Sync を二つ付けて別々に設定してください。
高度な使い方
Manual ObjectSync
以下の調節用プロパティがあります。
- 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() | オブジェクトのアタッチモードを解除します。 |
| void | CallEquip(int) | SendCustomNetworkEvent から呼び出す用の Equip() です。仕様上、引数をintにキャストする必要があります。 |
| void | CallUnequip() | SendCustomNetworkEvent から呼び出す用の Unequip() です。 |
| void | CallAttach() | SendCustomNetworkEvent から呼び出す用の Attach() です。 |
| void | CallDetach() | SendCustomNetworkEvent から呼び出す用の Detach() です。 |
Manual ObjectSync と同じオブジェクトに任意の Udon コンポーネントを付けて以下のメソッドを定義すると、そのイベントを受け取ることができます。
実装としては UdonBehaviour.SendCustomEvent() です。
| スコープ | 返り値 | 名前 | 説明 |
|---|---|---|---|
| public | void | OnEquip() | Manual ObjectSync がボーン装着モードになった時に呼ばれます。 |
| public | void | OnUnequip() | Manual ObjectSync のボーン装着モードが解除された時に呼ばれます |
| public | void | OnAttach() | Manual ObjectSync がアタッチモードになった時に呼ばれます。 |
| public | void | OnDetach() | Manual ObjectSync のアタッチモードが解除された時に呼ばれます。 |
PickupEvent Transfer
VRC Pickup と一緒に付けることで、ピックアップ系イベント(OnPickup, OnPickupUseDown, OnPickupUseUp, OnDrop)が呼ばれた時に Target にセットされた Udon Behaviour (または U# コンポーネント)に向けて同じイベントを実行します。
以下のプロパティがあります。
- Target : ピックアップ系イベントを渡す先です。
ResetSwitch For ObjectSync
以下のプロパティがあります。
- Reset Objects : このスイッチをインタラクトした時に位置リセットするオブジェクト。対象オブジェクトに
VRC Object Syncか、Respawn()メソッドを持った Udon コンポーネントが必要です。 - Interval : 位置リセットを連打されないためのインターバル期間です。単位は(秒)。
以下の public メソッドがあります。
| 返り値 | 名前 | 説明 |
|---|---|---|
| void | ResetObjectsPosition() | 実行するとインタラクトと同じ処理を実行します。 |
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です。
Audio Play Sync
Audio Source と一緒に付けることで、このオブジェクトのオーナーが周期的に再生時間と状態を確認し、同期します。
仕様上、再生開始/終了 のタイミングを完全に同期するものではありません。主に Later-joiner にループ再生音源の再生位置を同期するためのコンポーネントとなります。
以下のプロパティがあります。
- Play Check Interval : オーナーが再生状態の変動を確認する周期です。単位は(秒)。
- Sync Volume : チェックを付けると、
Audio Sourceの Volume パラメーターも同期するようになります。
Animator Parameter Sync
一言で言うとワールド版 ExpressionParameters です。Animator と一緒に付けることで、Parameter Names 配列にある名前のパラメーターが同期するようになります。
以下のプロパティがあります。
- Parameter Names : 同期させるパラメーター名の配列。型は自動で判別しますが、プラットフォーム間で一致している必要があります
- Smoothing Mode : float 型のパラメーターを同期時にリモート視点で補間させるか
- None : 補間処理をせず、同期された値を即時反映します
- Linear : 時間比例で補間処理をします
- Smooth : いわゆるイージングで補間処理をします
サンプル
以下のワールドにサンプルを設置しています。
https://vrchat.com/home/world/wrld_4b7ed36e-c436-409f-9f87-8a6f4c80e79b