212danf34
@212danf34 (情報工学生T)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Unity VR】PUN2を使って情報を同期させたい

解決したいこと

Unityを使ってVRの開発をしてます。使っているVR機器はOculusQuest2です。PUN2を使ってマルチプレイを実装しています.Oculus Integrationを使用しています.

やりたいことを3行で説明すると,
①2つのOculusQuest2を用意する.
②それぞれがアバターを1台ずつ操作する.
③2つのアバターが1つのVR空間を共有する.

アバターの形は大きく2つに分かれ,ヘッドマウントディスプレイ用の球体オブジェクト(大きいのが1つ)と,両手にもつコントローラー用の球体オブジェクト(小さいのが2つ)です.これらの球体は互いに干渉せず,使用者の動作を反映して動きます.

現時点での状況は2つのアバターを使って1つのVR空間を共有はできています.
問題は,自分のゴーグルの視界から,相手のコントローラー操作が見えないということです.

要するに頭の情報は同期できていますが,手の情報が同期できていません.

発生している問題・エラー

エラーコードがでてないので、どこが悪いのかわかりません.せめてエラー出してくれると場所がわかるのですが...
コード内の
GameObject networkPlayer;
GameObject networkPlayer2;
のnetworkPlayerとnetworkPlayer2とは,生成するアバターの名前です.
このアバターはプレハブ化してresource内に入れています.
PUN2の実装上,resource内のプレハブ化されたアバターを生成するという仕組みのようです.

該当するソースコード


using UnityEngine;
using Photon.Pun;
using UnityEngine.XR;

public class NetworkPlayer : MonoBehaviourPunCallbacks, IPunObservable
{
    [SerializeField]
    GameObject avater_Face, avater_RightHand, avater_LeftHand;

    [SerializeField]
    string avater_LayerMask;

    Transform cameraTransform;
    Transform rightHandTransform;
    Transform leftHandTransform;


    GameObject networkPlayer;
    GameObject networkPlayer2;

    void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        
        if (stream.IsWriting)
        {
            stream.SendNext(cameraTransform.position);
            stream.SendNext(cameraTransform.rotation);
            stream.SendNext(rightHandTransform.position);
            stream.SendNext(rightHandTransform.rotation);
            stream.SendNext(leftHandTransform.position);
            stream.SendNext(leftHandTransform.rotation);
            //stream.SendNext(cubeview);

        }
        else
        {
            this.transform.position = (Vector3)stream.ReceiveNext();
            this.transform.rotation = (Quaternion)stream.ReceiveNext();
            this.rightHandTransform.position = (Vector3)stream.ReceiveNext();
            this.rightHandTransform.rotation = (Quaternion)stream.ReceiveNext();
            this.leftHandTransform.position = (Vector3)stream.ReceiveNext();
            this.leftHandTransform.rotation = (Quaternion)stream.ReceiveNext();
            networkPlayer.transform.localPosition = (Vector3)stream.ReceiveNext();
            networkPlayer.transform.localRotation = (Quaternion)stream.ReceiveNext();
            networkPlayer2.transform.localPosition = (Vector3)stream.ReceiveNext();
            networkPlayer2.transform.localRotation = (Quaternion)stream.ReceiveNext();
        }
    }
    void Start()
    {
        cameraTransform = Camera.main.GetComponent<Transform>();
        rightHandTransform = GameObject.Find("RightControllerAnchor").GetComponent<Transform>();
        leftHandTransform = GameObject.Find("LeftControllerAnchor").GetComponent<Transform>();

        if (photonView.IsMine)
        {
            avater_Face.transform.parent = cameraTransform;
            avater_RightHand.transform.parent = rightHandTransform;
            avater_LeftHand.transform.parent = leftHandTransform;

            avater_Face.transform.localPosition = Vector3.zero;
            avater_Face.transform.localRotation = Quaternion.Euler(0f, -90f, 0f);

            avater_RightHand.transform.localPosition = Vector3.zero;
            avater_RightHand.transform.localRotation = Quaternion.identity;

            avater_LeftHand.transform.localPosition = Vector3.zero;
            avater_LeftHand.transform.localRotation = Quaternion.identity;

            foreach (Transform child in avater_Face.GetComponent<Transform>())
            {
                child.gameObject.layer = LayerMask.NameToLayer(avater_LayerMask);
            }
        }
    }
    /*void Update()
    {
        MapPosition(cameraTransform, XRNode.Head);
        MapPosition(rightHandTransform, XRNode.RightHand);
        MapPosition(leftHandTransform, XRNode.LeftHand);
        Debug.Log("Update");
    }
    void MapPosition(Transform target, XRNode node)
    {
        InputDevices.GetDeviceAtXRNode(node).TryGetFeatureValue(CommonUsages.devicePosition, out Vector3 position);
        InputDevices.GetDeviceAtXRNode(node).TryGetFeatureValue(CommonUsages.deviceRotation, out Quaternion rotation);

        target.position = position;
        target.rotation = rotation;
        Debug.Log("Void map");
    }*/
}

自分で試したこと

これらのサイト,YouTubeを見ながら書いてます.
void update{}の中身を参考サイトをみながら書いたりしてるのですが,コメントアウトしてるのを外してプロジェクトを実行すると,アバターとカメラが生成位置から動かなくなったりしたのでコメントアウトしたままにしてます.あとはif(stream.IsWriting){}の中身で手の同期に関する情報が書けていないのかもしれません.

どんな意見でもいただけると幸いです.よろしくお願いします.

参考文献・サイト

0

1Answer

Your answer might help someone💌