0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unity:PhotonでのGameManagerへの変更→Sceneの変更の間には、ディレイが必要っぽい

Last updated at Posted at 2023-09-23

はじめに

Photon初心者が躓いた所をメモ。
ボタンをクリックで、GameManagerへの変更→Sceneの変更を行い、
それを同期をさせたかったので以下のようなコードを書いた。

GManaSceneChange.cs
using Photon.Pun;
using UnityEngine.SceneManagement;

public class GManaSceneChange : MonoBehaviourPunCallbacks
{
    public void Reflesh()
    {
        // 全てのプレイヤーのGameManagerChangeを同期させる
        photonView.RPC("GameManagerChange", RpcTarget.AllViaServer);

        // 全てのプレイヤーのSceneChangeを同期させる
        photonView.RPC("SceneChange", RpcTarget.AllViaServer);
    }

    [PunRPC]
    private void GameManagerChange()
    {
        GameManager.instance.Deck = 16;
        GameManager.instance.Hand = 0;
        GameManager.instance.Dust = 0;
        GameManager.instance.Public = 0;
    }
    [PunRPC]
    private void SceneChange()
    {
        SceneManager.LoadScene("Load");
    }
}

しかし

上記のではSceneChangeは同期するものの、gameManagerChangeは同期されないみたい。
そこで、以下のように処理と処理の間にディレイを挿入することで変更されるようになった。

GManaSceneChange.cs
using Photon.Pun;
using UnityEngine.SceneManagement;

public class GManaSceneChange : MonoBehaviourPunCallbacks
{
    public void Reflesh()
    {
        StartCoroutine(DelayedSceneChange());
    }
    private IEnumerator DelayedSceneChange()
    {
        // 全てのプレイヤーのGameManagerChangeを同期させる
        photonView.RPC("GameManagerChange", RpcTarget.AllViaServer);

        // 0.3秒待機
        yield return new WaitForSeconds(0.3f);

        // 全てのプレイヤーのSceneChangeを同期させる
        photonView.RPC("SceneChange", RpcTarget.AllViaServer);
    }
    [PunRPC]
    private void GameManagerChange()
    {
        GameManager.instance.Deck = 16;
        GameManager.instance.Hand = 0;
        GameManager.instance.Dust = 0;
        GameManager.instance.Public = 0;
    }
    [PunRPC]
    private void SceneChange()
    {
        SceneManager.LoadScene("Load");
    }
}

たぶん

GameManagerChangeが同期完了していないのに、SceneChange同期が始まってしまうから、
処理がキャンセルされているor同期前のデータを読み込んでしまってる?とかなのかな。
よくわからないけど、時間を挟むといいみたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?