Как синхронизировать холст с Photon Engine в Unity

#c# #unity3d #networking #synchronization #photon

#c# #unity3d #сеть #синхронизация #photon

Вопрос:

Я пытаюсь синхронизировать холст с photon Engine, чтобы каждый игрок мог его видеть. Этот холст будет своего рода телевизором, который может включить любой игрок, а остальные могут его смотреть. Я мог бы синхронизировать куб, добавив компоненты PhotonView и PhotonRigidBody в сборку, но когда я попробовал то же самое с canvas, это вообще не сработало. Кто-нибудь может сказать мне, какие компоненты требуются для этого, и если это необходимо, что я должен обработать с помощью дополнительного скрипта (т.е. Передать право собственности).

Ответ №1:

В canvas нет ничего особенного, но его можно зафиксировать на месте.

У меня есть для вас два решения:

Наблюдаемый компонент:

Вы могли бы написать пользовательский наблюдаемый компонент и добавить его в PhotonView:

Чтобы использовать эту функцию, скрипт должен реализовать интерфейс IPunObservable.

 public class CustomObservable : MonoBehaviourPunCallbacks, IPunObservable
{
    [SerializeField] PlayerController playerController;

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            stream.SendNext(playerController.playerNumber);
            stream.SendNext(playerController.playerScore);
        }
        else
        {
            playerController.playerNumber = (int)stream.ReceiveNext();
            playerController.playerScore = (float)stream.ReceiveNext();
        }
    }
}
 

Пользовательские свойства:

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

Пользовательские свойства Photon состоят из хэш-таблицы key-values, которую вы можете заполнить по запросу. Значения синхронизируются и кэшируются на клиентах, поэтому вам не нужно извлекать их перед использованием. Изменения передаются другим с помощью SetCustomProperties().

Чем это полезно? Обычно комнаты и игроки имеют некоторые атрибуты, которые не связаны с игровым объектом: текущая карта или цвет персонажа игрока (например, 2d-прыжок и бег). Они могут быть отправлены через синхронизацию объектов или RPC, но часто удобнее использовать пользовательские свойства.

 PhotonNetwork.CurrentRoom.SetCustomProperties(Hashtable propsToSet)
 

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

 OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
 

Комментарии:

1. Я не уверен, как использовать первый пример для взаимодействия с canvas, и у меня еще меньше опыта работы с пользовательскими свойствами. Можно ли обработать синхронизацию с помощью RPC? Я думаю, что это единственный способ синхронизации, который я могу понять, я мог бы попытаться создать какой-нибудь RPC, который позволит вам взаимодействовать с canvas, поэтому, когда главный клиент «включает телевизор», он вызывает и RPC, которые имитируют это действие, таким образом, все тоже его активируют. Спасибо за ответ! 🙂

2. @CioCasado да, RPC хороши и, вероятно, хорошо подходят для вашего варианта использования .

3. Я работал! большое спасибо за ваш ответ, в конце я смог немного понять наблюдаемый компонент и пользовательские свойства, поэтому я бы попытался использовать один из разработчиков, если он не сработает!

4. Рад, что это было полезно! 🙂