⛳
[PUN2 Photon Unity Networking2]Startで一気にRPCを呼ぶと、うまくターゲットが選択できない問題
実行しようとしてうまくいかなかったコード
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