是否只有 masterclient 可以加载光子对象?

Is it possible for only masterclient to load photon object?

示例场景:舞台上有 4 个座位,我有一个名为 x 的 int 值。每次玩家坐在椅子上时,x 值都会增加 1。当你从座位上站起来时,x值减1,我借助rpc将这个值发送给所有玩家。当游戏中的所有玩家都就座时(当游戏中的玩家数量等于 x 时),我将一个光子对象加载到场景中。最后坐在座位上的人将此对象上传到舞台。因为当最后一个玩家坐在座位上时,x 的值就等于游戏中的玩家数量。在游戏的一部分中,我必须完全摧毁这个物体。只有座位上的最后一个玩家才能摧毁它,因为该物体的主人是他自己。我想要的是这样的:即使masterclient是第一个入座的玩家,它也会等待其他玩家入座,并且当x值等于游戏中的玩家数量时(当最后一个玩家入座时), masterclient 加载项目。因此对象的所有者成为游戏中的主客户。而masterclient可以随意销毁对象。我怎样才能做到这一点。 我使用的代码文件:

public class control : MonoBehaviourPunCallbacks{
private int x;
private GameObject nesne;

public void sit()
{

    x = PlayerPrefs.GetInt("kaçoldu");

    photonView.RPC("KacOldu", RpcTarget.OthersBuffered,x);
    KacOldu(x);


    if (PhotonNetwork.CurrentRoom.PlayerCount == x)
    {
         nesne = PhotonNetwork.Instantiate("nesne", Vector3.zero, Quaternion.identity, 0, null);
    }

}
public void up()
{
    x = PlayerPrefs.GetInt("kaçoldu");

    photonView.RPC("KacOldueksi", RpcTarget.OthersBuffered, x);
    KacOldueksi(x);

    PhotonNetwork.Destroy(nesne);

}

[PunRPC]
private void KacOldu(int x)
{
    x = PlayerPrefs.GetInt("kaçoldu");
    x++;
    Debug.Log("kaç?"+ x);
    PlayerPrefs.SetInt("kaçoldu", x);
}
[PunRPC]
private void KacOldueksi(int x)
{
    x = PlayerPrefs.GetInt("kaçoldu");
    x--;
    Debug.Log("kaç?" + x);
    PlayerPrefs.SetInt("kaçoldu", x);
}

}

游戏中的masterclient无法破坏名为“nesne”的物体,因为“nesne”的主人是其他玩家。如果我试试这个: if (PhotonNetwork.CurrentRoom.PlayerCount == x && PhotonNetwork.IsMasterClient) { nesne = PhotonNetwork.Instantiate("nesne", Vector3.zero, Quaternion.identity, 0, null); } 我仍然无法成功,因为如果最后坐着的玩家不是 masterclient,那么“nesne”的所有者仍然无法成为 masterclient。当游戏中的玩家数量等于 x 时,我希望 masterclient 加载“nesne”。你能帮帮我吗?

老实说,我不太理解你在那些 PlayerPrefs 背后的逻辑以及 x 应该是什么,因为每个玩家似乎都能完全否决它......

但是对于你的要求我会

  • a) 只需使用 RpcTarget.AllBuffered 代替,这样您也可以自己接电话
  • b) 改为检查 RPC 中的金额

比如

public void sit()
{
    x = PlayerPrefs.GetInt("kaçoldu");

    photonView.RPC(nameof(KacOldu), RpcTarget.AllBuffered, x);
}

public void up()
{
    x = PlayerPrefs.GetInt("kaçoldu");

    photonView.RPC(nameof(KacOldueksi), RpcTarget.AllBuffered, x);
}

[PunRPC]
private void KacOldu(int x)
{
    x = PlayerPrefs.GetInt("kaçoldu");
    x++;
    Debug.Log("kaç?"+ x);
    PlayerPrefs.SetInt("kaçoldu", x);

    // This happens now regardless of whether you or anyone else is the last sitting client
    if (PhotonNetwork.IsMasterClient && PhotonNetwork.CurrentRoom.PlayerCount == x)
    {
         // I would actually use this instead in case the Masterclient role is shifted to someone else
         nesne = PhotonNetwork.InstantiateRoomObject("nesne", Vector3.zero, Quaternion.identity, 0, null);
    }
}

[PunRPC]
private void KacOldueksi(int x)
{
    x = PlayerPrefs.GetInt("kaçoldu");
    x--;
    Debug.Log("kaç?" + x);
    PlayerPrefs.SetInt("kaçoldu", x);

    // This happens for any standing up client including the masterclient himself
    if (PhotonNetwork.IsMasterClient && nesne)
    {
         PhotonNetwork.Destroy(nesne);
    }
}