Unity Photon - Как синхронизировать статистику / информацию об игроке - PullRequest
1 голос
/ 29 июня 2019

Я пытаюсь создать совместную многопользовательскую игру от первого лица и думаю, что неправильно понял, как должны работать Photon и RPC. У меня есть работающий многопользовательский проект от первого лица, в котором аватары игроков могут видеть друг друга и перемещаться, поскольку аватары игроков имеют вид фотонного преобразования. В рамках скрипта контроллера игрока (обрабатывает движение игрока только для локального игрока), который прикреплен к префабу аватара игрока, у меня есть атрибут:

public PlayerCharacterInfo myCharacter;

, который содержит всю информацию и статистику игрока, включая имя, уровень, currentHP, maxHP и т. Д., Которые добавляются в PlayerController аватара игрока, когда игрок входит в комнату и создается его аватар.

Когда я присоединяюсь к многопользовательской комнате, каждый игрок может видеть только свою собственную статистику. Например, в редакторе при запуске игры на контроллере игрока myCharacter отображаются только значения локального редактора аватара игрока. Я вижу, что на других аватарах игроков есть экземпляр myCharacter, но значения не отображаются. На данный момент, я полагаю, мне просто нужно иметь функцию RPC, подобную этой, в моем контроллере плеера, которая просто переназначает myCharacter себе, чтобы он мог быть передан всем:

[PunRPC]
void RPC_AddCharacter(PlayerCharacterInfo paramCharacter)
{
    myCharacter = paramCharacter;
}

в пустом начале ():

if(PV.IsMine)
{
    PV.RPC("RPC_AddCharacter", RpcTarget.All, myCharacter);
}

Но это не позволяет мне видеть значения myCharacter для аватаров нелокальных игроков.

Моя цель - сначала показать имя аватара игрока, на которого вы смотрите, с помощью raycast, но я даже не могу синхронизировать эти данные.

Правильно ли я понял здесь, но я ошибаюсь? Или это просто не так, как работает Фотон? Нужно ли вместо этого хранить PlayerCharacterInfo каждого игрока в контроллере комнаты для каждого игрока или что-то в этом роде?

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Решено несколько! Я удалил свой вызов RPC, который пытался синхронизировать мой пользовательский объект PlayerCharacterInfo, и вместо этого сделал вызов и новую строку «myCharacterName» в PlayerController для хранения только имени игрока.

Новый вызов RPC принимает myCharacter.characterName локального игрока (из PlayerCharacterInfo) и устанавливает myCharacterName и синхронизирует все. Это работает, и мой редактор проигрыватель может видеть myCharacterName других игроков! Однако я не был ближе к синхронизации всего моего класса myCharacter.

Теперь, когда у меня было правильное представление о том, как это работает, я смог немного больше исследовать и обнаружил, что Photon не может нормально синхронизировать пользовательские классы, но вы можете сериализовать свой класс, чтобы иметь возможность отправлять его: https://doc.photonengine.com/en-us/realtime/current/reference/serialization-in-photon

Однако, прочитав это, я понял, что мне, вероятно, не нужно синхронизировать все данные об игроках (они содержат не только здоровье и статус, но и инвентарь, оборудование, квесты и т. Д.), И что мне, вероятно, лучше просто синхронизация отдельных типов данных в отдельных вызовах.

Эта тема тоже помогла: https://forum.photonengine.com/discussion/880/custom-class-object-sent-over-rpc

0 голосов
/ 29 июня 2019

Вы хотите использовать Пользовательские свойства .

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

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

...