PUN2: нет вызова OnPhotonSerializeView для обновления значений массива? - PullRequest
0 голосов
/ 03 апреля 2020

Похоже, что все логики c, которые использует PUN, чтобы определить, изменились ли свойства наблюдаемого скрипта, не смотрят значения в массивах. Изменение значений всех других свойств генерирует автоматические c вызовы OnPhotonSerializeView, но изменение значений в массивах - нет. Есть ли способ заставить PUN проверять содержимое массива, или я должен создать бессмысленный бул, который будет переворачиваться всякий раз, когда я хочу принудительно обновить обновление?

ПРИМЕЧАНИЕ. У меня в PhotonView установлено значение Ненадежное при изменении. Я пробовал byte [], который, как кажется, Photon поддерживает , и я также пробовал bool [].

1 Ответ

1 голос
/ 03 апреля 2020

Прежде всего: я действительно не эксперт по Photon, поэтому я должен доверять своим возможностям Google: P


В общем: убедитесь, что GameObject с вашим компонентом на самом деле список PhotonView "Наблюдение", иначе он вообще не будет вызываться OnPhotonSerializeView.


Я бы предположил: массив является ссылочным типом. Photon, вероятно, не выполняет итерацию по всему массиву все время, чтобы отслеживать какие-либо изменения, а только проверяет, изменилась ли сама ссылка.

В качестве альтернативы вы можете, однако, через некоторое время после изменения просто вручную отправить массив, например,

public bool[] myBools;

...
    photonView.RPC("SetArrayRPC", PhotonTargets.All, (object)myBools);
...    

[PunRPC]
private void SetArrayRPC(bool[] array)
{
    myBools = array;
}

Но на самом деле это тоже должно быть сделано

public class Example : Photon.MonoBehaviour
{
    public bool[] myBools = new bool[5];

    // Hit "Test" in the context menu in order to invert all values
    // Then everywhere you should see in the Inspector the updated array
    [ContextMenu(nameof(Test))]
    private void Test()
    {
        for(var i = 0; i < myBools.Length; i++)
        {
            myBools[i] = !myBools[i];
        }
    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            // We own this player: send the others our data
            stream.SendNext(myBools);
        }
        else
        {
            // Network player, receive data
            myBools = (bool[])stream.ReceiveNext();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...