SyncVar
SyncVars - это свойства классов, наследуемых от NetworkBehaviour, которые синхронизируются с сервера на клиенты. Когда создается игровой объект или новый игрок присоединяется к текущей игре, ему отправляется последнее состояние всех SyncVar сетевых объектов, которые ему видны. Используйте пользовательский атрибут SyncVar
чтобы указать, какие переменные в вашем скрипте вы хотите синхронизировать.
Состояние SyncVars применяется к игровым объектам на клиентах перед вызовом OnStartClient()
, поэтому состояние объектов всегда актуально внутри OnStartClient()
.
SyncVars могут использовать любые типы данных, поддерживаемые Mirror. У вас может быть до 64 SyncVar в одном скрипте NetworkBehaviour, включая SyncLists (смотрите следующий раздел ниже).
Сервер автоматически отправляет обновления SyncVar при изменении значения SyncVar, поэтому вам не нужно отслеживать, когда они изменяются, или отправлять информацию об изменениях самостоятельно. Изменение значения в инспекторе не вызовет обновления.
Атрибут SyncVar hook может использоваться для указания метода, который будет вызываться при изменении значения SyncVar на клиенте.
Пример использования SyncVar
Допустим, у нас есть сетевой объект со скриптом под названием Enemy:
PlayerController
может выглядеть примерно так:
В этом примере, когда игрок нажимает на врага, игровой объект врага присваивается переменной PlayerController.currentTarget
. Когда игрок нажимает на клавишу X с выбранной целью, эта цель передается в метод [Command], который выполняется на сервере, для вычисления health
SyncVar. У всех клиентов обновится значение ХП у этого врага. Затем вы можете создать пользовательский интерфейс на враге (к примеру полоску ХП), чтобы показывать его текущее значение ХП.
Наследование классов
SyncVars работает с наследованием классов. Рассмотрим этот пример:
Вы можете перетащить компонент Cat на ваш Prefab кота и у него будут синхронизироваться оба его name
и color
.
Внимание: Оба
Cat
иPet
должно быть в том же билде. Если они находятся в разных билдах, убедитесь, чтоname
не изменяется внутриCat
, вместо этого добавьте метод классуPet
.
Last updated