0 支持
(140 ポイント)
Meta questでボールを複数人で掴んで投げるようなコンテンツを作成しています。

バウンドしたボールを手に持つと手に持っているユーザー以外から見るとボールが激しく上下して見えます。

またaddForceで飛ばしたボールが点滅するように動機されます。

どのようにすれば綺麗に同期できるでしょうか?

MonobitViewにRigidbodyをアタッチしたり、transformViewをアタッチしたりなどはしました。

よろしくお願いします。

回答 1

0 支持
(3.8k ポイント)

MUNのオブジェクト同期処理は毎フレーム実行されているわけではなく、
MonobitNetwork.updateStreamRate
https://www.monobitengine.com/doc/mun/contents/FeatureClient/SendRate.htm#MonobitEngine.MonobitNetwork.updateStreamRate%20%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3
の値に従って、数フレーム置きに同期を実行します。
その間に Rigidbody オブジェクトは「Unityクライアント側で独自に物理演算して移動する」ため、クライアントごとに非同期で動作してしまいます。ボールが激しく上下して見えるのはそのせいでしょう。

問題を解決するには
手順1)Instantiate で生成する Rigidbody オブジェクトについて、コンポーネントの Rigidbody -> Is Kinematic のチェックボックスをONにする(クライアント独自の物理演算処理を無効化する)
手順2)同オブジェクトについて、オブジェクトの所有権を有しているクライアント側の更新処理で上記の IsKinematic のチェックボックスを外す(所有権を持つクライアント側でのみ独自の物理演算処理を有効にする)

 void Update()
 {
    // 所有権の有無により、物理演算の有効/無効を切り替える
    Rigidbody _rigidbody = GetComponent<Rigidbody>();
    _rigidbody.isKinematic = !monobitView.isMine;

    // 通常の Update 処理をここに記述する
 }

のステップを踏めばよいと思います。

...