【问题标题】:How to correct call RPC on all clients?如何更正所有客户端上的调用 RPC?
【发布时间】:2021-09-29 10:15:51
【问题描述】:

我创建了一个简单的脚本只是为了测试 RPC 是如何工作的,但不能理解一件事。这是我的代码:

public class TestRPC : MonoBehaviour
{
    public static TestRPC Instance { get; private set; }

    [SerializeField]
    public static int Opp = 5;

    float timer = 2f;

    private void Awake()
    {
        if (Instance != null) return;
        else Instance = this;
    }

    [PunRPC]
    public void AddOpp(int add)
    {
        Opp += add;
    }

    void Update()
    {
        timer -= Time.deltaTime;
        if(timer <= 0)
        {
            Debug.LogError(Opp);
            timer = 2f;
        }
    }
}

我所期望的:场景中有 2 个玩家。调用 RPC AddOpp 后应该调用两次,并在 Update 方法中记录 15.

PhotonView.Get(FindObjectOfType&lt;TestRPC&gt;()).RPC("AddOpp", RpcTarget.All, new object[] { 5 });

我什至尝试使用 IPunObservable 来同步 Opp var,但没有帮助

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
            stream.SendNext(Opp);
        if (stream.IsReading)
            Opp = (int)stream.ReceiveNext();
    }

它还是记录了 10。那么 - RPC 是如何工作的或者我做错了什么?对 RPC 的理解将帮助我进一步创建我的游戏。天呐

【问题讨论】:

    标签: c# unity3d photon


    【解决方案1】:

    您有 2 个玩家,P1P2

    每个玩家控制场景中的一个实例。

    P1 有一个 P2 的远程控制实例(由玩家 2 控制)。
    P2 有一个 P1 的远程控制实例(由玩家 1 控制)。

    P1 使用 RPCTarget.All 进行 RPC 调用:

    所有已连接客户端上的 P1 的所有远程(和本地)实例都会收到该调用。

    在 P1 方面,将 5 的值加到 5 的起始值上,得到 10。
    在 P2 方面,同样的调用发生在 P1 的远程控制实例上,结果相同。

    此调用在控制台中为两个玩家(来自 P1 实例)生成 10 的调试输出。

    P2 使用 RPCTarget.All 进行 RPC 调用:

    所有连接的客户端上的所有远程(和本地)P2 实例都会收到该调用。

    在 P2 方面,5 的值与 5 的起始值相加得到 10。
    在 P1 方面,同样的调用发生在 P2 的远程控制实例上,结果相同。

    此调用还在控制台中为两个玩家(来自 P2 实例)生成 10 的调试输出。

    控制台日志
    在每个玩家的控制台中,您应该看到10(来自 P1 的 RPC 调用)和10(来自 P2 的 RPC 调用)。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多