mimyquality / FukuroUdon

MimyLab's U# utilitiy pack for VPM.
MIT License
30 stars 4 forks source link

任意の位置にスクリプトで移動できるようにする #8

Closed purabesan closed 7 months ago

purabesan commented 9 months ago

SetPositionRotation メソッドを追加し、スクリプトで任意の位置に移動できるようにします。

お世話になっております。
1つのVRC Object Poolから複数の場所にSpawnオブジェクトを出現させる際、こうしたメソッドが欲しいと考え、ご提案させていただきました。 追加をご検討いただけましたら幸いです。

mimyquality commented 9 months ago

Manual ObjectSyncを付けたオブジェクトは、基本的にオブジェクトオーナーがTransform(またはRigidbody)を操作するたけで同期するように作ってあります。
Manual ObjectSyncではなく、Transformに対してSetPositionAndRotation()を実行してください。

VRC Object Poolからスポーンさせたオブジェクトのオーナーが、必ずしもVRC Object Poolのオーナーと一致しないことに注意してください。

purabesan commented 8 months ago

反応が遅れてしまって大変申し訳ありませんでした。
うかがった方法を試してみましたが、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から独立していることは既知でしたため、元々オーナ権限獲得処理は加えておりました。

mimyquality commented 8 months ago

こちら、初期状態が非アクティブまたはVRCObjectPoolなどでアクティブ状態を管理している場合に、later-joinerに初期位置が同期しないのを確認しました。 ver 1.12.1 にて修正したのでご確認ください。

purabesan commented 8 months ago

たいへん素早いご対応に感謝いたします。
確認して結果をお伝えします。

purabesan commented 8 months ago

ダメでした😭

mimyquality commented 8 months ago

ver 1.12.2 でもう1箇所関係しそうなところに修正を入れましたが、これ以上はこちらで再現が取れない状況です。 まだダメそうなら、spawnedObject.transform.SetPositionAndRotation() と合わせて、 spawnObject.GetComponent<ManualObjectSync>().RequestSerialization() を実行して同期されるか試してみてください。

purabesan commented 8 months ago

承知しました、ありがとうございます🙇‍♀️ また検証して結果をお伝えしますね。

mimyquality commented 8 months ago

こちらでも再現したため、ver1.12.3 で修正を入れました。

purabesan commented 8 months ago

素早いご対応、誠にありがとうございます。 こちらでも検証いたします。

purabesan commented 8 months ago

ver1.12.3でもダメでした😭

mimyquality commented 8 months ago

んーあと思い当たるのは、ObjectPoolに登録しているオブジェクトをシーン上でアクティブ状態のままビルドする事くらいですね…

purabesan commented 8 months ago

シーン上では元々アクティブ状態のままビルドしております。
あとは、関係あるかどうか分かりませんが、初期位置とSpawn後の移動先がかなり離れている(y値50ほど)状況です。
初期位置がカメラのClipping Plane外であり、オクルージョンカリングもかかる位置です。

mimyquality commented 8 months ago

カリング関係はOnBecomeVisible/Invisible()を使っていない限り関係無いはずです。 VRCObjectPoolとの実行順起因と思われるので、TryToSpawnしてから1フレーム以上開けてSetPositionAndRotationしてみてください。(もしくはspawnObject側でOnEnableを見てSetPositionAndRotation)

purabesan commented 8 months ago

承知しました。検証後、結果をまたご報告いたしますね。