0 支持
(190 ポイント)

Oculus Integrationのcamerarigを使用してマルチプレイゲームを制作しているのですが、

複数クライアントで実行すると片方が視点を移動させるともう片方の視点も同期して動いてしまいます。なにか対策法はないでしょうか?

1点 MonobitTransformViewのRotationを切ることによって同期させないことはできるのですが、

プレイヤー同士の画面でお互いの視点移動を確認することができないので今回の問題の解決にはいたりませんでした。何か実例等があればお教えいただけると幸いです。

回答 1

0 支持
(580 ポイント)
選択
 
ベストアンサー
CameraRigのオブジェクト同期をMonobitTransformViewを使わず(MonobitTransformViewを外して)、CameraRigに対し以下のスクリプトを埋め込むことで対応できるのではないでしょうか?

class Foo : MonobitEngine.MonoBehaviour {
    // オブジェクト同期
    void OnMonobitSerializeView( MonobitEngine.MonobitStream stream,
                                                MonobitEngine.MonobitMessageInfo info ) {
        // 自分が保持するオブジェクトでなければ送受信しない
        if(!monobitView.isMine) return;

        if(stream.isWriting) {
            stream.Enqueue(gameObject.transform.position);
            stream.Enqueue(gameObject.transform.rotation);
            stream.Enqueue(gameObject.transform.scale);
        } else {
            gameObject.transform.position = (UnityEngine.Vector3)stream.Dequeue();
            gameObject.transform.rotation = (UnityEngine.Quaternion)stream.Dequeue();
            gameObject.transform.scale = (UnityEngine.Vector3)stream.Dequeue();
        }
    }
}
(190 ポイント)
返信ありがとうございます。
試してみたのですが、MonobitViewを入れる場所やオブジェクトを
管理するところがわからないのでご確認いただけると幸いです。
https://drive.google.com/drive/folders/1FqsU2Msj55OgHZxLSFKBnxyQCcD5eUZY?usp=sharing
画像データも用意してあるのでよろしくお願いします。
(580 ポイント)
MonobitViewは親オブジェクト(Player)で良いと思います。加えて、同じPlayerにスクリプトを追加して(以下の例で言えばFoo.csという名前に変更して)、以下のようにコード組めばいけると思いますよ。

class Foo : MonobitEngine.MonoBehaviour {

    // cameraRigオブジェクト
    UnityEngine.GameObject camRigObj = null;

    // Start
    public void Start() {
        camRigObj = transform.Find( "OVR CameraRig" );
    }

    // オブジェクト同期
    void OnMonobitSerializeView( MonobitEngine.MonobitStream stream,
                                                MonobitEngine.MonobitMessageInfo info ) {

        // 自分が保持するオブジェクトでなければ送受信しない
        if(!monobitView.isMine) return;
        if(camRigObj == null) return;

        if(stream.isWriting) {
            // 送信
            stream.Enqueue(camRigObj.transform.position);
            stream.Enqueue(camRigObj.transform.rotation);
            stream.Enqueue(camRigObj.transform.scale);
        } else {
            camRigObj.transform.position = (UnityEngine.Vector3)stream.Dequeue();
            camRigObj.transform.rotation = (UnityEngine.Quaternion)stream.Dequeue();
            camRigObj.transform.scale = (UnityEngine.Vector3)stream.Dequeue();
        }
    }
}
(190 ポイント)
返信ありがとうございます。
スクリプトを追加し実行する際にMonobitTransformViewを使わない場合だと2台で試すと位置関係を同期できないため失敗してしまいました。
お手数だとは思うのですが、プロジェクトを一度確認いただけないでしょうか。
現在発生している問題が
プレイヤーを二人 配置した際のカメラの動きが相手のアバターにも同期してしまう
MonobitTransformViewをきってインスタンスをすると相手との位置同期ができない
の2点になります
たびたび申し訳ございません。よろしくお願いします
https://drive.google.com/drive/folders/1-6Hy5VnsCjibviik5MiXg-oOYOcLTHBG?usp=sharing
...