Unity Photon PUN - невозможно получить обратный вызов IPunObservable для работы

Я пытаюсь понять архитектуру Photon Pun. Я не могу вызвать обратный вызов OnPhotonSerializeView() в 'IPunObservable'.

Что у меня есть в моей сцене

  • GameObject по имени DataHandler на вершине иерархии

  • DataHandler имеет прикрепленные PhotonView и PhotonTransformView

  • DataHandler также имеет прикрепленный скрипт под названием DataHandler

  • Скриптовый компонент DataHandler был перетащен на первый наблюдаемый объект в компоненте PhotonView (поэтому он показывает 'DataHandler (DataHandler)' как наблюдаемый компонент).

  • Сценарий DataHandler реализует IPunObservable, и единственным методом в нем является

     public class DataHandler : MonoBehaviourPunCallbacks, IPunObservable
     {
     ....
    
         public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
         {
             Debug.Log("OnPhotonSerializeView(): " + (stream.IsWriting ? "writing" : "reading"));
         }
     ....
     }
    

В журнале при запуске ничего не отображается.

Однако при сборке и запуске как EXE-файла Windows, подключенного к помещению, возникают NullReferenceExceptions. Журнал показывает:

    NullReferenceException: Object reference not set to an instance of an object
      at Photon.Pun.PhotonView.SerializeComponent (UnityEngine.Component component, Photon.Pun.PhotonStream stream, Photon.Pun.PhotonMessageInfo info) [0x0001e] in C:\Users\nick\Documents\Unity3D\PhotonPunTest\Assets\Photon\PhotonUnityNetworking\Code\PhotonView.cs:368 
      at Photon.Pun.PhotonView.SerializeView (Photon.Pun.PhotonStream stream, Photon.Pun.PhotonMessageInfo info) [0x00024] in C:\Users\nick\Documents\Unity3D\PhotonPunTest\Assets\Photon\PhotonUnityNetworking\Code\PhotonView.cs:330 
      at Photon.Pun.PhotonNetwork.OnSerializeWrite (Photon.Pun.PhotonView view) [0x00089] in C:\Users\nick\Documents\Unity3D\PhotonPunTest\Assets\Photon\PhotonUnityNetworking\Code\PhotonNetworkPart.cs:1593 
      at Photon.Pun.PhotonNetwork.RunViewUpdate () [0x000b3] in C:\Users\nick\Documents\Unity3D\PhotonPunTest\Assets\Photon\PhotonUnityNetworking\Code\PhotonNetworkPart.cs:1522 
      at Photon.Pun.PhotonHandler.LateUpdate () [0x00042] in C:\Users\nick\Documents\Unity3D\PhotonPunTest\Assets\Photon\PhotonUnityNetworking\Code\PhotonHandler.cs:155 
     
    (Filename: C:/Users/nick/Documents/Unity3D/PhotonPunTest/Assets/Photon/PhotonUnityNetworking/Code/PhotonView.cs Line: 368)

и код вокруг строки 368 в PhotonView.cs

    protected internal void SerializeComponent(Component component, PhotonStream stream, PhotonMessageInfo info)
    {
        IPunObservable observable = component as IPunObservable;
        if (observable != null)
        {
            observable.OnPhotonSerializeView(stream, info);
        }
        else
        {
            Debug.LogError("Observed scripts have to implement IPunObservable. "+ component + " does not. It is Type: " + component.GetType(), component.gameObject);
        }
    }

(строка Debug.LogError равна 368).

Не вижу, что не так, хотя я предполагаю, что component, вероятно, null. Сценарий реализует IPunObservable. Кто-нибудь может помочь?


person nmw01223    schedule 24.06.2020    source источник
comment
да, похоже, что component это null...   -  person derHugo    schedule 24.06.2020
comment
да. Есть идеи, почему?   -  person nmw01223    schedule 24.06.2020
comment
Нет, я не вижу, где вызывается ваш метод ... но, похоже, это собственный код PUN, так что, возможно, какая-то ошибка или, по крайней мере, необработанный случай ... вы пытались просто отладить свой код и установить точку останова в этой строке, чтобы вы могли пройти его шаг за шагом и посмотреть, что именно происходит?   -  person derHugo    schedule 24.06.2020
comment
У меня не настроен отладчик, но я добавляю строку Debug.Log(SerializeComponent(): component is + (component == null ? null : not null)); в начале SerializeComponent() - никогда не отображалось в журнале, поэтому я не знаю, что происходит.   -  person nmw01223    schedule 24.06.2020


Ответы (1)


Проблема здесь в фотонной логике относительно локального игрока и главного клиента. Правила о том, кто может посылать, связаны с этим.

В конце концов, мне оказалось намного проще перейти на более высокий уровень «вспомогательных» компонентов (PhotonView и т. д.) и отправить все с помощью механизма RaiseEvent() / OnEvent() более низкого уровня.

См. ответ на предыдущий вопрос.

person nmw01223    schedule 03.07.2020