Как исправить RPC вызовов на всех клиентах?

#c# #unity3d #photon

Вопрос:

Я создал простой скрипт только для тестирования того, как работает 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 должен быть вызван дважды, и в методе обновления будет зарегистрировано 15.

PhotonView.Get(FindObjectOfType<TestRPC>()).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 помогло бы мне в дальнейшем создавать свою игру. Tnx

все еще 10

Ответ №1:

У вас есть 2 игрока, P1 и P2.

Каждый игрок управляет одним экземпляром в сцене.

У P1 есть экземпляр P2 с дистанционным управлением (управляемый игроком 2).
У P2 есть экземпляр P1 с дистанционным управлением (управляемый игроком 1).

P1 выполняет свой вызов RPC с помощью RPCTarget.Все:

Все удаленные (и локальные) экземпляры P1 на всех подключенных клиентах получают этот вызов.

На стороне P1 значение 5 добавляется к исходному значению 5, равному 10.
На стороне P2 тот же вызов выполняется с удаленно управляемым экземпляром P1 с тем же результатом.

Этот вызов генерирует отладочный вывод 10 в консоли для обоих игроков (из экземпляров P1).

P2 выполняет свой вызов RPC с помощью RPCTarget.Все:

Все удаленные (и локальные) экземпляры P2 на всех подключенных клиентах получают этот вызов.

На стороне P2 значение 5 добавляется к исходному значению 5, равному 10.
На стороне P1 тот же вызов выполняется с удаленно управляемым экземпляром P2 с тем же результатом.

Этот вызов также генерирует отладочный вывод 10 в консоли для обоих игроков (из экземпляров P2).

Журналы консоли
В консоли для каждого игрока вы должны увидеть 10 (из вызова RPC P1) и 10 (из вызова RPC P2).