Closed purabesan closed 7 months ago
Manual ObjectSyncを付けたオブジェクトは、基本的にオブジェクトオーナーがTransform(またはRigidbody)を操作するたけで同期するように作ってあります。
Manual ObjectSyncではなく、Transformに対してSetPositionAndRotation()を実行してください。
VRC Object Poolからスポーンさせたオブジェクトのオーナーが、必ずしもVRC Object Poolのオーナーと一致しないことに注意してください。
反応が遅れてしまって大変申し訳ありませんでした。
うかがった方法を試してみましたが、Transformに対してSetPositionAndRotation()を実行しても同期されないようです。
やはり、私の環境では、Pull Requestした通りの修正を入れた方法でないとダメなようで…。
以下、私の利用シーンでございます。
// オーナ権限取得
SetOwner(spawnedObject);
// 指定の位置に移動
Rigidbody rb = spawnedObject.GetComponent<Rigidbody>();
if (rb != null)
{
rb.Sleep();
rb.position = sp.position;
rb.rotation = sp.rotation;
}
spawnedObject.transform.SetPositionAndRotation(sp.position, sp.rotation);
VRC Object PoolからSpawnしたオブジェクトのオーナ権限がPoolから独立していることは既知でしたため、元々オーナ権限獲得処理は加えておりました。
こちら、初期状態が非アクティブまたはVRCObjectPoolなどでアクティブ状態を管理している場合に、later-joinerに初期位置が同期しないのを確認しました。 ver 1.12.1 にて修正したのでご確認ください。
たいへん素早いご対応に感謝いたします。
確認して結果をお伝えします。
ダメでした😭
ver 1.12.2 でもう1箇所関係しそうなところに修正を入れましたが、これ以上はこちらで再現が取れない状況です。
まだダメそうなら、spawnedObject.transform.SetPositionAndRotation()
と合わせて、
spawnObject.GetComponent<ManualObjectSync>().RequestSerialization()
を実行して同期されるか試してみてください。
承知しました、ありがとうございます🙇♀️ また検証して結果をお伝えしますね。
こちらでも再現したため、ver1.12.3 で修正を入れました。
素早いご対応、誠にありがとうございます。 こちらでも検証いたします。
ver1.12.3でもダメでした😭
んーあと思い当たるのは、ObjectPoolに登録しているオブジェクトをシーン上でアクティブ状態のままビルドする事くらいですね…
シーン上では元々アクティブ状態のままビルドしております。
あとは、関係あるかどうか分かりませんが、初期位置とSpawn後の移動先がかなり離れている(y値50ほど)状況です。
初期位置がカメラのClipping Plane外であり、オクルージョンカリングもかかる位置です。
カリング関係はOnBecomeVisible/Invisible()を使っていない限り関係無いはずです。 VRCObjectPoolとの実行順起因と思われるので、TryToSpawnしてから1フレーム以上開けてSetPositionAndRotationしてみてください。(もしくはspawnObject側でOnEnableを見てSetPositionAndRotation)
承知しました。検証後、結果をまたご報告いたしますね。
SetPositionRotation メソッドを追加し、スクリプトで任意の位置に移動できるようにします。
お世話になっております。
1つのVRC Object Poolから複数の場所にSpawnオブジェクトを出現させる際、こうしたメソッドが欲しいと考え、ご提案させていただきました。 追加をご検討いただけましたら幸いです。