#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. Рад, что это было полезно! 🙂