Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее См. в Словарь Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects. |
В многопользовательской сетевой игре без выделенного сервера один из экземпляров игры выступает в роли хоста — центра управления игрой. Это игрок, чья игра выступает в роли сервера и «локального клиента», в то время как каждый из других игроков запускает «удаленный клиент». Дополнительную информацию см. в документации по концепциям сетевой системы.
Если хост отключится от игры, продолжение игры будет невозможно. Распространенными причинами отключения хоста являются уход игрока хоста, сбой хост-процесса, отключение компьютера хоста или потеря хостом сетевого подключения.
Функция переноса хоста позволяет одному из удаленных клиентов стать новым хостом, чтобы можно было продолжить многопользовательскую игру.
Как это работает
Во время многопользовательской игры с включенной миграцией узла Unity распределяет адреса всех одноранговых узлов (игроков, включая хост и всех клиентов) всем другим одноранговым узлам в игре. Когда хост отключается, один узел становится новым хостом. Затем другие узлы подключаются к новому хосту, и игра продолжается.
Компонент Network Migration Manager использует Unity Networking HLAPI. Это позволяет продолжить игру с новым хостом после отключения исходного хоста. На приведенном ниже снимке экрана показано состояние миграции, отображаемое в Network Migration Manager в Inspectorокне Unity, в котором отображается информация о текущем выбранном GameObject, активы или настройки проекта, позволяющие просматривать и редактировать значения. Дополнительная информация
См. в окне Словарь.
Диспетчер миграции сети предоставляет базовый пользовательский интерфейс, похожий на HUD диспетчера сети. Этот пользовательский интерфейс предназначен для тестирования и прототипирования во время разработки игры; прежде чем выпустить игру, вы должны внедрить собственный пользовательский интерфейс для переноса хоста и пользовательскую логику для таких действий, как автоматический выбор нового хоста без ввода данных пользователем.
Несмотря на то, что миграция могла произойти из-за того, что старый хост потерял соединение или вышел из игры, старый хост игры может снова присоединиться к игре в качестве клиента на новом хосте.
Во время переноса узла Unity поддерживает состояние SyncVars и Списки синхронизации во всех сетевых GameObjectsФундаментальный объект в сценах Unity, который может представлять персонажей, реквизит, декорации. , камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь в СценаСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь. Это также относится к пользовательским сериализованным данным для GameObjects.
Unity отключает все игровые объекты игрока в игре, когда хост отключается. Затем, когда другие клиенты снова присоединяются к новой игре на новом хосте, соответствующий модуль игроков повторно включает этих клиентов на новом хосте и повторно порождает их на других клиентах. Это гарантирует, что Unity не потеряет данные о состоянии игрока во время переноса хоста.
ПРИМЕЧАНИЕ. Во время переноса хоста Unity сохраняет только те данные, которые доступны клиентам. Если данные есть только на сервере, то они недоступны клиенту, который становится новым хостом. Данные на хосте доступны только после переноса хоста, если они находятся в SyncVars или SyncList.
Когда клиент становится новым хостом, Unity вызывает функцию обратного вызова OnStartServer для всех сетевых игровых объектов. На новом хосте Network Migration Manager использует функцию BecomeNewHost для создания сетевой сцены сервера из состояния текущего ClientScene.
В игре с включенной миграцией узла узлы идентифицируются по их connectionId на сервере. Когда клиент повторно подключается к новому хосту игры, Unity передает этот идентификатор соединения новому хосту, чтобы он мог сопоставить этого клиента с клиентом, который был подключен к старому хосту. Этот идентификатор указан в ClientScene
как reconnectId.
Игровые объекты, не являющиеся игроками
Игровые объекты, не являющиеся игроками, с правами доступа клиента также обрабатываются миграцией хоста. Unity отключает и повторно включает неигровые игровые объекты, принадлежащие клиенту, точно так же, как она отключает и повторно включает игровые объекты игрока.
Идентификация пиров
Перед тем, как хост отключится, все одноранговые узлы будут подключены к хосту. Каждый из них имеет уникальный идентификатор подключения на хосте — в контексте переноса хоста он называется oldConnectionId.
Когда Network Migration Manager выбирает новый хост и одноранговые узлы повторно подключаются к нему, они предоставляют свой oldConnectionId
, чтобы определить, к какому из одноранговых узлов они относятся. Это позволяет новому хосту сопоставить этого повторно подключающегося клиента с соответствующим игровым объектом игрока.
Старый хост использует специальный oldConnectionId
, равный нулю, для повторного подключения. Поскольку у него не было подключения к старому хосту, он БЫЛ старым хостом. Для этого существует константа ClientScene.ReconnectIdHost.
При использовании встроенного пользовательского интерфейса Network Migration Manager Network Migration Manager автоматически устанавливает oldConnectionId
. Чтобы установить его вручную, используйте NetworkMigrationManager.Reset или ClientScene. SetReconnectId.
Процедура переноса хоста
На MachineA размещена игра Game1, для которой включен перенос хоста
-
Компьютер B запускает клиент и присоединяется к Game1
- Компьютеру B сообщается об одноранговых узлах (MachineA–0 и о себе (MachineB)–1)
-
MachineC запускает клиент и присоединяется к Game1
- MachineC сообщается об одноранговых узлах (MachineA–0, MachineB–1 и о себе (MachineC)–2)
Компьютер A разрывает соединение в игре 1, поэтому хост отключается
-
Компьютер B отключается от хоста
Функция обратного вызова MachineB вызывается в MigrationManager на клиенте
Игровые объекты MachineB player для всех игроков отключены
MachineB остается в онлайн-сцене
-
MachineB использует служебную функцию для выбора нового хоста, выбирает себя
MachineB вызывает BecomeNewHost()
MachineB начинает слушать
Игровой объект игрока MachineB для себя повторно активирован
MachineB Игрок для MachineB вернулся в игру со всем своим старым состоянием
-
MachineC отключается от хоста
Функция обратного вызова MachineC вызывается в MigrationManager на клиенте
Игровые объекты MachineC player для всех игроков отключены
MachineC остается в онлайн-сцене
-
MachineC использует служебную функцию для выбора нового хоста, выбирает MachineB
- MachineC повторно подключается к новому хосту.
-
Компьютер B получает соединение от MachineC
MachineC отправляет сообщение о повторном подключении с oldConnectionId (вместо сообщения AddPlayer)
функция обратного вызова вызывается в MigrationManager на сервере
MachineB использует oldConnectionId для поиска отключенного игрового объекта игрока для этого игрока и повторно добавляет его с помощью ReconnectPlayerForConnection()
Игровой объект игрока повторно создается для MachineC
Проигрыватель для MachineC вернулся в игру со всем своим старым состоянием
-
MachineA восстанавливается (старый хост)
Компьютер A использует служебную функцию для выбора нового хоста, выбирает компьютер B
Компьютер A "повторно подключается" к MachineB
Компьютер B получает соединение от компьютера A
-
MachineA отправляет сообщение о повторном подключении с идентификатором oldConnectionId, равным нулю
функция обратного вызова вызывается в MigrationManager на сервере (MachineB)
MachineB использует oldConnectionId для поиска отключенного игрового объекта игрока для этого игрока и повторно добавляет его с помощью ReconnectPlayerForConnection()
Игровой объект игрока повторно создается для MachineA
Проигрыватель для MachineA вернулся в игру со всем своим старым состоянием
Функции обратного вызова
Функции обратного вызова в NetworkHostMigrationManager:
// called on client after the connection to host is lost. controls whether to switch Scenes
protected virtual void OnClientDisconnectedFromHost(
NetworkConnection conn,
out SceneChangeOption sceneChange)
// called on host after the host is lost. host MUST change Scenes
protected virtual void OnServerHostShutdown()
// called on new host (server) when a client from the old host re-connects a player
protected virtual void OnServerReconnectPlayer(
NetworkConnection newConnection,
GameObject oldPlayer,
int oldConnectionId,
short playerControllerId)
// called on new host (server) when a client from the old host re-connects a player
protected virtual void OnServerReconnectPlayer(
NetworkConnection newConnection,
GameObject oldPlayer,
int oldConnectionId,
short playerControllerId,
NetworkReader extraMessageReader)
// called on new host (server) when a client from the old host re-connects a non-player GameObject
protected virtual void OnServerReconnectObject(
NetworkConnection newConnection,
GameObject oldObject,
int oldConnectionId)
// called on both host and client when the set of peers is updated
protected virtual void OnPeersUpdated(
PeerListMessage peers)
// utility function called by the default UI on client after connection to host was lost, to pick a new host.
public virtual bool FindNewHost(
out NetworkSystem.PeerInfoMessage newHostInfo,
out bool youAreNewHost)
// called when the authority of a non-player GameObject changes
protected virtual void OnAuthorityUpdated(
GameObject go,
int connectionId,
bool authorityState)
Ограничения
Чтобы миграция хоста работала правильно, вам нужно перейти к Диспетчеру сетиСетевому компоненту GameObject, который управляет состоянием сети. проекта. Подробнее
Просмотреть в компоненте Словарь и включить Автоматическое создание проигрывателя . Данные, которые присутствуют только на сервере (узле), теряются при отключении узла. Чтобы игры могли корректно выполнять миграцию хоста, важные данные должны передаваться клиентам, а не храниться тайно на сервере.
Это работает для игр с прямым подключением. Чтобы это работало с механизмом сопоставления и сервером ретрансляции, требуется дополнительная работа.