Manual ObjectSync - mimyquality/FukuroUdon GitHub Wiki
概要
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スクリプトが付いたオブジェクトのオーナーに 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#スクリプトを使いたい場合に便利です。
高度な使い方
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() です。 |
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