[PUN2 Photon Unity Networking2]Startで一気にRPCを呼ぶと、うまくターゲットが選択できない問題

2024/03/05に公開

実行しようとしてうまくいかなかったコード

        private void Start()
        {
            _dollyCart = GetComponent<CinemachineDollyCart>();
            
            // マスタークライアント以外が入ってきたとき、マスタークライアントに合わせてDollyCartの位置を同期する
            if (!PhotonNetwork.IsMasterClient)
            {
                photonView.RPC(nameof(SetPositionRPC), RpcTarget.MasterClient);
            }
        }

        [PunRPC]
        private void SetPositionRPC()
        {
            photonView.RPC(nameof(ReceivePositionRPC), RpcTarget.Others, _dollyCart.m_Position);
        }

        [PunRPC]
        void ReceivePositionRPC(float position)
        {
            _dollyCart.m_Position = position;
        }

こう読んだときにRpcTargetがうまく認識できていない印象でした

解決方法

        [SerializeField] private CinemachineDollyCart _dollyCart;
        
        private CancellationToken _cancellationToken;

        private async UniTask Start()
        {
            _dollyCart = GetComponent<CinemachineDollyCart>();
            _cancellationToken = this.GetCancellationTokenOnDestroy();
            // 部屋に入ったことが呼ばれるまで待つ
            await UniTask.WaitUntil(() => PhotonNetwork.InRoom, cancellationToken: _cancellationToken);
            
            // マスタークライアント以外が入ってきたとき、マスタークライアントに合わせてDollyCartの位置を同期する
            if (!PhotonNetwork.IsMasterClient)
            {
                photonView.RPC(nameof(SetPositionRPC), RpcTarget.MasterClient);
            }
        }

        [PunRPC]
        private void SetPositionRPC()
        {
            photonView.RPC(nameof(ReceivePositionRPC), RpcTarget.Others, _dollyCart.m_Position);
        }

        [PunRPC]
        void ReceivePositionRPC(float position)
        {
            _dollyCart.m_Position = position;
        }

これで解決しました。

PhotonNetwork.InRoom

がtrueになるまで待てば純粋に動きますね。
ルームの概念を勉強しなおそう。

Discussion