Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее См. в Словарь Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects. |
Под синхронизацией состояний понимается синхронизация значений, таких как целые числа, числа с плавающей запятой, строки и логические значения, принадлежащие скриптамA фрагмент кода, который позволяет вам создавать свои собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
См. Словарь в вашей сети GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь.
Синхронизация состояния выполняется с сервера на удаленные клиенты. локальный клиент не имеет сериализованных данных. Он ему не нужен, потому что он разделяет СценуСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь с сервером. Однако перехватчики SyncVar вызываются на локальных клиентах.
Данные не синхронизируются в обратном направлении — от удаленных клиентов к серверу. Для этого вам нужно использовать команды.
Переменные синхронизации
SyncVars — это переменные скриптов, наследуемые от NetworkBehaviour, которые синхронизируются с сервера на клиентов. Когда создается GameObject или новый игрок присоединяется к текущей игре, ему отправляется последнее состояние всех SyncVars на видимых им сетевых объектах. Используйте настраиваемый атрибут [SyncVar]
, чтобы указать, какие переменные в сценарии вы хотите синхронизировать, например:
Класс Player : NetworkBehaviour {
[SyncVar]
int health;
public void TakeDamage(int amount)
{
if (!isServer)
return;
health -= amount;
}
}
Состояние SyncVars применяется к GameObjects на клиентах до вызова OnStartClient(), поэтому внутри OnStartClient() состояние объекта всегда актуально.
SyncVars могут быть базовых типов, таких как целые числа, строки и числа с плавающей запятой. Они также могут быть типами Unity, такими как Vector3 и определяемые пользователем структуры, но обновления для структур SyncVars отправляются как монолитные обновления, а не добавочные изменения, если поля внутри структуры изменяются. Вы можете иметь до 32 SyncVars в одном скрипте NetworkBehaviour, включая SyncLists (см. следующий раздел ниже).
Сервер автоматически отправляет обновления SyncVar при изменении значения SyncVar, поэтому вам не нужно отслеживать их изменение или отправлять информацию об изменениях самостоятельно.
Списки синхронизации
В то время как SyncVars содержат значения, SyncLists содержат списки значений. Содержимое SyncList включается в обновления начального состояния вместе с состояниями SyncVar. Поскольку SyncList — это класс, который синхронизирует свое собственное содержимое, для SyncList не требуется атрибут SyncVar. Для базовых типов доступны следующие типы SyncList:
SyncListString
SyncListFloat
SyncListInt
SyncListUInt
SyncListBool
Есть также SyncListStruct, который можно использовать для синхронизации списков ваших собственных типов структур. При использовании SyncListStruct выбранный тип структуры может содержать элементы базовых типов, массивов и распространенных типов Unity. Они не могут содержать сложные классы или универсальные контейнеры, и сериализуются только общедоступные переменные в этих структурах.
Списки SyncList имеют делегат SyncListChanged с именем Callback, который позволяет клиентам получать уведомления об изменении содержимого списка. Этот делегат вызывается с указанием типа выполненной операции и индекса элемента, для которого выполнялась операция.
public class MyScript : NetworkBehaviour
{
public struct Buf
{
public int id;
public string name;
public float timer;
};
public class TestBufs : SyncListStruct {}
TestBufs m_bufs = new TestBufs();
void BufChanged(Operation op, int itemIndex)
{
Debug.Log("buf changed:" + op);
}
void Start()
{
m_bufs.Callback = BufChanged;
}
}