Online Subsystem Overview.How to Start a Multiplayer Game.

Список разделов:
1.Введение
2.Framework & Network in Unreal Engine 4.
3.Dedicated vs Listen Server.Replication.Remote Procedure Calls.
4.Ownership.Actor:Role,RemoteRole,Relevancy,Priority.Traveling in Multiplayer.
5.Online Subsystem Overview.How to Start a Multiplayer Game. Вы здесь

Online Subsystem Overview
Online Subsystem и её интерфейсы существуют для обеспечения понимания основного онлайн функционала имеющихся платформ в данной среде. В данном контенксте, платформа это — Steam, Xbox Live, Facebook и т.д.
Портативность одна из основных целей.
Для чего мне нужен Subsystem?
По умолчанию вы будете использовать SubsystemNULL. Это позволяет размещать LAN сессии (вы можете найти сеансы через список серверов и присоединиться к ним в вашей локальной сети) или присоединиться непосредственно через IP.
Это не позволяет вам провести такую сессию в интернете. Почему?
Потому что у вас нет главного сервера предоставляющего клиенту список серверов/сессий.
Подсистемы, такие как, например, Steam, позволяют хостить сервер/сессии, которые видны через интернет. Это важно понимать!
Вы также можете создать свой собственный Subsystem/мастер-сервер, но это потребует много кодинга вне UE4.

Online Subsystem Module
Basic Design
Use of Delegates
Interfaces
Profile
Friends
Sessions
Shared Cloud
User Cloud
Leaderboards
Voice
Achievements
External UI
Sessions and Matchmaking
Матчмейкинг — процесс подбора игроков для сессии. Сессия в основном является экземпляром игры, запущенной на сервере с заданным набором свойств, бывает публичной, когда её можно найти и соединить игроков, которые хотят поиграть в игру, либо частной, когда присоединиться могут только те игроки, которые приглашены или уведомлены о том, что могут присоединиться.
Представьте онлайн лобби игры, в котором перечислены все игры которые происходят в реальном времени.
Каждая игра в списке является сессией или индивидуальным онлайн матчем. Игроки подбираются к сессиям либо с помощью функции поиска либо какими-либо другими способами, а затем присоединяются к сессии, чтобы сыграть матч.

Basic Life-Time of a Session
• Создать новую ссесию с требуемыми параметрами.
• Ожидание игроков запросивших присоединение к матчу.
• Регистрация игроков желающих присоединения.
• Старт сессии.
• Запуск матча.
• Завершение сессии.
• Убрать игроков.
• Или:
◦ Обновление сессии, если вы хотите изменить тип матча и вернуться к ожиданию присоединяющихся игроков.
◦ Удаление сессии.
Session Interface
Сессионный интерфейс IOnlineSession, предоставляетспецифичную для платформы функциональность для невидимой установки необходимых компонентов для выполнения матчмейкинга, а также другие методы разрешения ирокам находить и присоединиться к онлайн играм.
Это включает в себя управление сессиями, нахождение сессий через поиск или другие средства, для присоединяющихся/покидающих к сессии. Сессионный интерфейс создан и принадлежит Online Subsystem. Это означает, что он существует только на сервере.

Только один сессионный интерфейс может существовать одновременно — в настоящее время сессионный интерфейс уже работает на платформе движка. В то время как сессионный интерфейс выполняет всю обработку сессии, игра как правило, не взаимодействует непосредственно с ним.
Вместо этого, GameSession, AGameSession, выступает в качестве игровой обёртки вокруг сессионного интерфейса и код игры делает вызовы к ней, когда он должен взаимодействовать с сессией.
GameSession создан и принадлежит GameMode, а также существует только на сервере при запуске онлайн-игры.

Потенциально, каждая игра может иметь несколько типов GameSession, но только одна будет всегда использоватся в конкретный момент времени.
Самым распространенным случаем для игры, имеющей более чем один тип GameSession является добавление типа GameSession когда игра использует выделенный сервер.

Session Settings
SessionSettings, определяемые в «FOnlineSessionSettingsclass«, представляют собой совокупность свойств, определяющих характеристики сессии.
В базовой реализации это:
• Количество допущенных игроков.
• Сессия публичная или приватная.
• Является ли сессия локальным матчем.
• Сервер выделенный или на стороне игрока.
• Допустимы ли инвайты.
• И т.д.
Использование примера лобби онлайн игры, каждая из этих игр является сессией и имеет свои собственные SessionSettings. Например, некоторые сессии могут быть «игрок против игрока» (PvP), в то время как другие являются «совместным мультиплеером» (Co-Op).
Различные сессии могут играться на различных картах, требуют различного количества игроков и т.д.
Кликните по названию раздела для просмотра подробного урока по сессиям в С++.

Все ноды сессии являются асинхронными задачами (Clock Symbol) и будут называть «OnSuccess» или «OnFailure«, как только они закончат своё исполнение. В то же время, вы можете использовать самые наиболее исполняемые решения.

Creating Sessions
Для того, чтобы игроки, нашли сессию и присоединились к ней, необходимо создать сессию и настроить
её свойства, а также решить, какие из этих свойств будут видны. Регистрация сессии на выделенном сервере может посредством блупринта может не поддерживатся текущей версией движка. В C ++ вы должны сделать нормальное создание C ++ сессии внутри AGameSession путем переопределения функции «RegisterServer«!
Создание сессии посредством блупринтаСоздание сессии посредством С++
111
Для создания сессии в блупринте, вы можете использовать ноду CreateSession, которую уже предоставили эпики. Она не предлагает много опций, но она может быть расширена с помощью плагинов с форума.
Updating Sessions

Обновление производится когда вы хотите изменить настройки существующей сессии и выполняется с использованием функции IOnlineSession::UpdateSession().
Например, сессия может поддерживать только 8 игроков, в то время как следующему матчу нужны 12 игроков. Чтобы обновить сессию, «UpdateSession () будет вызываться передавая ей новые параметры сессии, которые определяют максимум 12 в игроков.
После того как запрос на обновление сессии завершён, делегат «OnUpdateSessionComplete» удаляется. Это дает возможность выполнить любую конфигурацию или инициализацию, необходимую для обработки изменений настроек сессии.
Обновление сессии обычно выполняется между матчами на сервере, но также это выполняется и на клиенте, дабы синхронизировать информацию о сессии.
На данный момент реализация этой функции посредством блупринта не представлена, но можно заиметь её если пошерстить форум.

[свернуть]
Destroying Sessions
Когда сессия заканчивается и больше не нужна — она удаляется с помощью функции «IOnlineSession::DestroySession()«. Когда операция удаления завершена, делегат «OnDestroySessionComplete» удаляют, что позволяет выполнять операции очищения.

Удаление сессии посредством блупринтаУдаление сесси посредством С++
111
В блупринтах, вы можете использовать ноду DestroySession, которая реализована эпиками.
Searching Sessions
Самый простой способ найти сессию — поиск сессии которая удовлетворяет какие-либо параметры.
Подбор сессий может осуществлятся посредством выбора игроком каких-либо фильтров или основываясь на уровне мастерства игрока, либо же каких-либо других факторов, либо же сочетанием обоих методов.
Браузер серверов является наиболее распространённой формой поиска сервера, где игрок может установить желаемые фильтры.
Поиск сессии посредством блупринтаПоиск сессии посредством С++
111

В блупринтах вы можете использовать ноду FindSessions, которую сделали эпики. Вы можете указать количество результатов, а также поиск среди локальных/интеренет срверов. Расширить функционал можно с помощью плагинов с форума.

Joining Sessions
После того как вы определили сессию к которой присодиняется игрок, процесс присоединения инициируется вызовом IOnlineSession::JoinSession () и передавая ему номер игрока, имя и поисковой результат присоединяемой сессии. После завершения процесса присоединения, делегат OnJoinSessionComplete удаляют. В этом месте выполняет логика присоединения игрока к матчу.
Более подробную информацию об этой логике можно прочитать ниже, а также на странице автора.

Присоединение к сессии посредством блупринтаПрисоединение к сессии посредством С++
111

Для присоединения к сессии с помощью блупринта, вы можете использовать ноду JoinSession, которую сделали эпики. Она нуждается в SessionResult, которую вы можете получить из ноды «FindSession«. Он возвращает на массив SessionResults. Нода «JoinSession» будет напрямую присоединять карту «OnSuccess«. Вам не придется иметь дело с этим.

Cloud-Based Matchmaking
Облачный матчмейкинг относится к встроенному сервису матчмейкинга доступному на конкретной платформе. Примером такого вида сервиса является TrueSkill System доступная через Microsoft Xbox Live Service.

Для того, чтобы инициировать матчмейкинг на платформах, которые поддерживают его, вы вызываете «IOnlineSession::Startmatchmaking ()» и передаёте ему номер контроллера игрока; SessionName, SessionSettings используют при создании новой сессии, а также настройки для поиска. Делегат «OnMatchmakingComplete» удаляется, когда матчмейкинг завершен. Это обеспечивает логическое значение, определяющее, был ли процесс успешным, и если успешен, то также предоставляет имя сеанса, чтобы присоединиться.

Процесс матчмейкинга можно отменить посредством вызова IOnlineSession::CancelMatchmaking () и передавая ей номер контроллера игрока и SessionName, который был передан при вызове старта матчмейкинга в первую очередь. Делегат OnCancelMatchmakingCompletedelegate удаляется, когда операция отмены завершена.

Following and Inviting Friends
На платформах, которые поддерживают концепцию друзей, игроки могут следовать за друзьями в сессию или пригласить друзей присоединиться к ним в сессию.
Следование за другом в сессию вызывается «IOnlineSession:FindFriendSession ()» и передавая ему номер локального игрока, который хочет присоединиться к сессии и идентификатор друга который уже находится в сессии. Делегат «OnFindFriendSessionComplete» удаляется, когда сессия найдена, и она содержит SearchResult, который может использоваться, чтобы присоединиться к сессии.
Игрок также может пригласить одного или нескольких друзей, чтобы присоединиться к нему в текущей сессии; используя «IOnlineSession::SendSessionInviteToFriend ()» или «IOnlineSession::SendSessionInviteToFriends ()» и передавая локальный номер игрока, имя сесии, и ID игрока(ов),которые приглашены.
Когда друг принимает приглашение, то делегат «OnSessionInviteAccepted«, содержащий SearchResult сессии для присоединения — удаляют.
How to Start a Multiplayer Game
Самый простой способ, чтобы начать многопользовательскую игру — установить Number of Players, в выпадающем меню Play, больше чем 1.

111

Это автоматически создаст сетевое соединение между сервером и клиентами. Так что даже если вы начинаете игру в вашем уровне главное меню с числом игроков установленным на 2+, то игры будут подключены!
Это всегда сетевое соединение. Это не локальное соединение мультиплеера. Это должно обрабатываться по-разному и не рассматривается на данный момент.

Advanced Settings
111 Расширенные настройки позволяют задать некоторые дополнительные опции для Play-Mode.
Одна из категорий позволяет установить опции мультиплеера:
111

Нижеприведённая таблица объясняет мультиплеерные опции.

Опция Описание
Number of Players Этот параметр определяет количество игроков для спавна в игре при запуске. Редактор и listen-server считаются как игроки, выделенный сервер не считается. Клиенты составляют остальную часть игроков.
Server Game Options Здесь вы можете указать дополнительные настройки, которые будут переданы на сервер в качестве URLparameters.
Run Dedicated Server Если этот флажок установлен, будет запущен выделенный сервер. В противном случае первый игрок будет выступать в качестве listen-server‘а, так что все остальные игроки могут к нему подключиться.
Route 1st Gamepad to 2nd Client Когда запущены несколько окон игрока в одном процессе, эта опция определяет то, куда направлен сигнал управление. Если флажок не установлен (по умолчанию) 1-й игровой манипулятор прикреплен к 1-му окну, 2й ко 2му окну, и так далее. Если флажок установлен, то 1-й игровой манипулятор переходит ко 2-му окну. После чего первое окно может управляться с помощью клавиатуры/мыши, что удобно, если два человека занимаються тестированием на одном и том же компьютере.
Use Single Process Это создаёт несколько окон игрока в одном экземпляре Unreal Engine 4. Это будет загружаться гораздо быстрее, но имеет предпосылки возникновения проблем. Когда этот флажок не установлен, дополнительные опции становятся доступными.
Create Audio Device for Every Player Включение этой опции позволит воспроизводить точный звук с точки зрения каждого игрока, но будет использовать больше ресурсов процессора.
Play in Editor Description Это описание того, что происходит при воспроизведении на основе применяемых в настоящее время настроек мультиплеера.
Use Single Process
111

Когда выбрано Use Single Process, несколько окон создаются в одном экземпляре Unreal Engine 4. Когда эта опция отключена, несколько экземпляров UE4 будут запущены для каждого игрока который назначен и дополнительные опции становятся доступными.

Опция Описание
Editor Multiplayer Mode Это NetMode используюется для игры в редакторе (играть в автономном режиме, играть как Listen-сервер либо же играть как клиент).
Command Line Arguments Здесь вы можете задать дополнительные параметры командной строки, которые будут переданы в самостоятельные экземпляры игры.
Multiplayer Window Size (in pixels) Определяет высоту/ширину окна создаваемого экземпляра игры.
Run as Dedicated Server
111

Если не выбрать «Run Dedicated Server«, то первый клиент будет Listen-Server’ом.
С другой стороны, если выбрать этот пунктик, то все игроки будут клиентами.

Start and Connect to a Server
Разделы Subsystem и Session уже объяснил, как настроить сессию/сервер через систему сессии, но как насчёт нормального запуске и подключение через IP? Довольно легко!

Блупринт
Start a ServerConnect to a Server
111

Для запуска сервера без системы сессии, вы просто используете ноду OpenLevel и передаёте его Level Name и listen опции. Кроме того, можно передать больше опций, разделяя их ‘?’, которые можно получить в GameMode класса, как описано.
Выделенный сервер, без системы сессий, начинается уже на нужной карте, которую можно указать во вкладке Maps & Nodes, в настройках проекта.

111

Для подключения к серверу, вы просто используете ноду «Execute Console Command» с командой «open IPADDRESS«, где ‘IPADDRESS‘ заменяется фактическим IPADRESS сервера.
Это может быть заполнено через виджет Text-Box, например.

[свернуть]
UE4++

Подобно блупринтам, вы можете использовать эти две функции, которые имеют один и тот же результат, что и ноды блупринта.

Start a ServerConnect to a Server
UGameplayStatics::OpenLevel(GetWorld(), “LevelName”, true, “listen”);
// Assuming you are not already in the PlayerController (if you are, just call ClientTravel directly)
APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
PlayerController->ClientTravel(“IPADDRESS”, ETravelType::TRAVEL_Absolute);
[свернуть]
Starting via Command Line

Основные командные строки (эти команды используют редактор и поэтому не требуют cooked-данных):

Тип Команда
Listen Server UE4Editor.exe ProjectName MapName?Listen -game
Dedicated Server UE4Editor.exe ProjectName MapName -server -game -log
Client UE4Editor.exe ProjectName ServerIP -game

Примечание: Выделенные серверы по умолчанию без интейфеса.
Если вы не используете «-log», вы не увидите окно представляющее выделенный сервер!

[свернуть]
Connection Process
When a new Client connects for the first time, a few things happen:
First, the Client will send a request to the Server to connect.
The Server will process this request, and if the Server doesn’t deny the connection, will send a response back to the Client, with proper information to proceed.
The following page will show the major steps of the connection process. This is a direct extract from the official Documentation.

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

Основыне шаги:

1. Клиент посылает запрос на соединение.
2. Если сервер принимает, то он посылает текущую карту.
3. Сервер будет ждать клиента, чтобы загрузить эту карту.
4. После загрузки, сервер будет локально вызывать»AGameMode::PreLogin«.
• Это даст шанс GameMode‘у отклонить соединение.
5. Если он будет принят, то затем сервер будет вызывать «AGameMode::Login«.
• Роль этой функции заключается в создании PlayerController, который затем будет реплицирован для вновь подключенного клиента. После получения, этот PlayerController заменит клиентский временный PlayerController, который был использован в качестве заполнитель в процессе подключения.
• Обратите внимание, что здусь будет вызываться»APlayerController::BeginPlay«.
Следует отметить, что это еще не безопасно для вызова RPC функции на этом экторе.
Вы должны ждать, пока «AGameMode::PostLogin» вызывается.
6. Предполагая, что все прошло хорошо, вызывается «AGameMode::PostLogin».
• К этому моменту, для сервера, безопасен вызвов функции RPC на этом PlayerController.

А на этом всё.
Надеюсь, что данное руководство помогло/поможет начать работу с мультиплеером и сетью в Unreal engine 4, и в будующем мы увидим интересные мультиплеерные игры.
Данное руководство, возможно, в будующем будет дополнено, но на данный момент, я считаю, что раскрыл основные и не только вещи для мультиплеера.

Сделал — Cedric ‘eXi’ Neukirchen ( cedric.bnslv.de )
Актуально для Unreal Engine 4 Version: 4.11.
Перевёл на великий и могучий — RedComrade
Оригинал
Если вы нашли какую-либо ошибку в текстах перевода, просьба, напишите об этом в ЭТОЙ теме.

Читайте также: