PUN 2 Unity Photon.LoadLevel, IOnEventCallback и RaiseEvent - PullRequest
0 голосов
/ 11 марта 2020

Я работаю над многопользовательской пошаговой игрой с использованием PUN 2. У меня проблемы с созданием объекта после загрузки сцены с помощью RaiseEvent.

Все началось с этой проблемы: Синхронизация GameObjects с игроками , но мне кажется, сначала нужно решить другие проблемы. Позвольте мне объяснить немного.

У меня есть сцена с кнопкой «Присоединиться к очереди», которая создает комнату, если нет других доступных, и MaxPlayerCount = 2. Поэтому после присоединения второго игрока я использую Photon.LoadLevel (sceneName) для загрузки игровой сцены. На игровой сцене у меня есть компонент, который порождает некоторые объекты. В этом компоненте я использую PhotonNetwork.RaiseEvent для отправки этих объектов другим игрокам.

PhotonView photonView = containerTile.GetComponent<PhotonView>();
if(PhotonNetwork.AllocateViewID(photonView))
{
    object[] data = new object[]
    {
        containerTile.transform.position, containerTile.transform.rotation, photonView.ViewID
    };

    RaiseEventOptions raiseEventOptions = new RaiseEventOptions
    {
        Receivers = ReceiverGroup.Others,
        CachingOption = EventCaching.AddToRoomCache
    };

    SendOptions sendOptions = new SendOptions
    {
        Reliability = true
    };

    PhotonNetwork.RaiseEvent(CustomEvent, data, raiseEventOptions, sendOptions);
}

public void OnEvent(EventData photonEvent)
{        
    if(photonEvent.Code == CustomEvent)
    {
        object[] data = (object[])photonEvent.CustomData;

        GameObject containerTile = (GameObject)Instantiate(containerPrefab, (Vector3)data[0], (Quaternion)data[1]);
        PhotonView photonView = containerTile.GetComponent<PhotonView>();
        photonView.ViewID = (int)data[2];
    }
}

«CustomEvent» - это пользовательское событие, которое я пытаюсь получить, реализовав обратный вызов OnEvent с помощью Интерфейс IOnEventCallback. Когда OnEvent вызывается EventData, это код «PropertiesChanged (253)», который из документации кажется, что он вызывается, когда MasterClient изменил комнату, поэтому я предполагаю, что PhotonNetwork.LoadLevel делает это.

Их документация говорит: «Когда вы вызовите OpSetProperties с опцией широковещания "on", это событие вызывается. Оно содержит устанавливаемые свойства. " Я пытаюсь пропустить этот код события 253, и я понятия не имею, как мне отключить «опцию широковещания» или какой подход я пытаюсь достичь.

Спасибо за чтение!

1 Ответ

0 голосов
/ 11 марта 2020

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

Вместо этого:

использовать PhotonNetwork.Instantiate ()

или

используйте интерфейс IPunPrefabPool, чтобы создать собственную систему для генерации сетевых экземпляров (ознакомьтесь с классом DefaultPool, чтобы узнать, как это происходит внутри) gr asp несколько важных особенностей PUN и как с ним начать.

https://doc.photonengine.com/en-us/pun/v2/demos-and-tutorials/pun-basics-tutorial/player-instantiation Пока,

Жан

...