Framework & Network in Unreal Engine 4

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.

Network in Unreal
Unreal Engine 4 использует стандартную архитектуру клиент-сервер. Это означает, что сервер авторитарно и все данные должны быть сперва отправлены от клиента к серверу. Затем сервер проверяет достоверность данных и реагирует в зависимости от вашего кода.

Небольшой пример:
При перемещении вашего персонажа, как клиент, в многопользовательском матче, вы на самом деле не перемещаете персонаж самостоятельно, а сообщаете серверу, что вы хотите, переместить его. Затем сервер обновляет расположение персонажей для всех остальных, включая вас.
При отправке чат-сообщения другому
Примечание: Для того, чтобы предотвратить чувство «лага» для локального клиента, кодеры часто, дают игроку управлять персонажем локально, хотя сервер все еще может переопределить расположение персонажа, когда клиент начинает читерить! Это означает, что клиент, почти, никогда не «говорит» с остальными клиентами напрямую.

Другой пример:
При отправке чат-сообщения другому клиенту, вы фактически отправляет его на сервер, который затем передает его клиенту, которому вы пишите. Это также может быть команда, гильдия, группа и т.д.

Важно!
Никогда не верьте клиенту!Верить клиенту, значит не проверять его действия перед выполнением. Это прямая дорога к читерству.
Простой пример, стрельба:
Удостовертесь на сервере, что клиент в действительности имеет патроны и имеет возможность совершать стрельбу.
Framework & Network
Исходя из информации выше про архитектуру UE4 Сервер-Клиент, мы можем разделить структуру на 4 раздела:

  • Server Only — Эти объекты существуют только на сервере.
  • Server & Clients — Эти объекты существуют на сервере и на всех клиентах.
  • Server & Owning Client — Эти объекты существуют только на сервере и владющем клиенте.
  • Owning Client Only — Эти объекты существуют только на клиенте.

«Owning Client» — это игрок\клиент, которому принадлежит Actor. Аналогично тому, как вы являетесь владельцем своего компьютера. Собственность важна для “RPCs”, позже. В приведённой ниже таблице, показываются некоторые из общих классов и в каком разделе они существуют.

Framework & Network in Unreal Engine 4

Framework & Network in Unreal Engine 4

Common Classes

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

Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

Класс AGameMode используется для определения правил игры. В него входят используемые классы, такие как : APawn, APlayerController, APlayerState и многое другое. Он доступен только на сервере. Клиенты не имеют объект GameMode и будет получать nullptr при попытке получить его.

Пример:
GameModes могут быть известны через основные режимы Deathmatch, Team Deathmatch или Capture the Flag.

Это означает, что GameMode может определить такие вещи, как:
• У нас есть команды или же все играют сами по себе?
• Каковы выигрышные условия? Сколько уничтожений нужно для кого-нибудь/команды?
• Каким образом достигаются очки? Уничтожение кого-то? Кража флаг?
• Какие персонажи будут использоватся? Какое оружие разрешено? Только пистолеты?

Примеры и использование
В мультиплеере GameMode также имеет некоторые интересные функции, которые помогут нам управлять игроками/процессом матча.
Блупринт
UE4++
Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

Класс AGameState, пожалуй, самый важный класс для совместного обмена информацией между сервером и клиентами. GameState используется для отслеживания текущего состояния в игре. Это включает в себя, важно для мультиплеера, список подключенных игроков (APlayerState). GameState копируется всем клиентам. Так что каждый может получить доступ к нему. Это делает GameState одним из основных классов для мультиплеерных игр.В то время как GameMode говорит, сколько уничтожений нужно сделать чтобы выиграть, GameState следит за текущим количеством уничтожений для каждого игрока и/или команды. То, какую информацию вы храните в здесь, полностью зависит от вас. Это может быть массив очков или массив пользовательской структуры, для отслеживания групп и гильдий.

Примеры и использование

В мультиплеере, класс GameState используется для отслеживания текущего состояния игры, который также включает в себя игроков и их состояние. GameMode гарантирует, что функции состояния матча GameState вызывается и сам GameState даёт вам возможность использовать его также и на клиенте.
По сравнению с GameMode, GameState не дает нам много работать. Но это всё ещё даёт нам создавать нам собственную логику, которая в основном должна пытаться распределять информацию для клиентов.

Блупринт
UE4++
Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

Класс APlayerState является наиболее важным классом для конкретного игрока. Он предназначен для хранения текущей информации о игроке. Каждый игрок имеет свой собственный PlayerState. PlayerState также реплицируется для всех, и может быть использован для извлечения и отображения данных на других клиентах. Самый простой способ получить доступ ко всем PlayerStates, которые в текущее время в игре, является PlayerArray внутри GameState класса.

Пример информация, которую вы можете хранить здесь:
PlayerName — текущее имя подключенного игрока.
Счёт — текущий счет подключенного игрока.
Ping — Текущий Ping подключенного игрока.
GuildID — Идентификатор гильдии, в которой игрок может состоять.
• Или другая реплицируемая информация которую могут знать другие игроки.

Примеры и использование

В мультиплеере, PlayerState предназначен для хранения информации о состоянии подключенного игрока. Это включает в себя имя, очки, Ping и ваши пользовательские переменные. Так как этот класс PlayerState дублируется, он может легко использоваться для извлечения данных клиента на других клиентах.

Блупринт
UE4++
Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

Класс APawn является «Actor», которым управляет игрок. В большинстве случаем это человек, но это также может быть кошка, самолёт, корабль, блок и т.д. Игрок может иметь только один Pawn единовременно, но может легко переключаться между Pawn.

Pawn в основном реплицируется для всех клиентов.
ACharacter дочерний класс Pawn, часто используется, потому что он поставляется с уже сетевым MovementComponent, который обрабатывает реплицированием позиции, вращения и т.д.
персонажа игроков.
Примечание: Не клиент перемещает персонажа; а сервер получает Move-входы от клиента и затем перемещаеи и реплицирует персонажа!

Примеры и использование

В мультиплеере, мы в основном используем часть репликации Pawn для отображения персонажа и чтобы поделиться информацией с другими пользователями. Простой пример является «здоровье» персонажа.
Но мы не только реплицируем «здоровье», чтобы сделать его видимым для других, мы также реплицируем его, чтобы клиент не мог читерить, ибо только сервер имеет над ним контроль.

Блупринт
UE4++
Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

Класс APlayerController наверное самый интересный и сложный класс, который мы рассматриваем. Это также центр для многих клиентских вещей, так как это первый класс которым владеет клиент. PlayerController можно рассматривать как "Input" игрока. Это связующее звено игрокам с сервером. Это означает, что каждый клиент имеет один PlayerController. PlayerController клиента существует только у себя и на сервере, и другие клиенты не знают о других PlayerController.
Каждый клиент знает только о своем собственном!
Результатом этого является то, что сервер имеет референсы всех PlayerControllers клиента! Понятие "Input" непосредственно не значит, что все функции ввода (нажатия кнопок,движение мышки, контроллер оси и т.д.) должны быть помещены в PlayerController. Это хорошее решение, чтобы поместить ввод конкретного персонажа (автомобили работают по-разному, чем люди) в ваши Character/Pawn классы и поставить вход, который должен работать со всеми персонажами, или даже тогда, когда объект персонажа не действителен в своём PlayerController!

Важное замечание состоит в следующем:
Input всегда сначала пропускают через PlayerController. Если PlayerController не использует его, он будет обработан в других классах, которые могут использовать один и тот же вход. Input может быть деактивирован при необходимости.

Важно знать:
Как получить правильный PlayerController?
Известная нода "GetPlayerController (0)" или строка кода "UGameplayStatics :: GetPlayerController (GetWorld (), 0);" работает по-разному на сервере и клиентах, но это не очень сложно.
  1. Вызов её на Listen-серверe возвратит PlayerController Listen-Сервера.
  2. Вызов её на клиенте будет возвращать PlayerController Клиента.
  3. Вызов её на выделенном сервере будет возвращать PlayerController первого Клиента.

Отличные от «0» цифры не вернут других клиентов для клиента. Этот индекс предназначен для использования для локальных игроков (Splitscreen), которых мы не рассматриваем.

Примеры и использование

Несмотря на то, что PlayerController является одним из наиболее важных классов для работы в сети, в нём не так много заложено по умолчанию. Таким образом, мы создадим небольшой пример, просто чтобы дать понять, почему это необходимо. В главе о собственности, вы прочитаете о том, почему PlayerController имеет важное значение для репликации. Следующий пример покажет вам, как использовать PlayerController для увеличения реплицированной переменной в GameState, нажав на кнопку виджета.

Зачем нам нужен PlayerController для этого?

Я не хочу, расписывать тут главы про реплигацию и собственность опять, так что просто краткое объяснение:
Виджеты существуют только на Client/Listen-Server и даже если они принадлежат клиенту, серверверная репликация не имеет инстанса на сервере для запуска.

Это просто не реплицируются!

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

Блупринт
UE4++
Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

AHUD является классом, который доступен только на каждом клиенте и может быть доступен через PlayerController. Он будет автоматически спавниться.
Перед темUMG (Unreal Motion Graphics) как был выпущен, HUD класс был использован для рисования текста, текстур и многого другого во вьюпорте клиента.
К настоящему времени, виджеты заменили HUD класс в большинстве случаев.
Вы все еще можете использовать HUD класс для отладки или, может быть, иметь изолированную зону для управления спавном, показывая, скрывая и уничтожения виджетов.
Поскольку HUD не связан напрямую с сетью, примеры будут показываться только сингплеерных вещей.
Вот почему я пропущу их.

Кликните по названию этого раздела, чтобы узнать больше про API этого класса.

Виджеты используются в новой системе пользовательского интерфейса Epic Games, называемого Unreal Motion Graphics.
Они наследуются от Slate, который является языком, используемый для создания пользовательского интерфейса в C ++, а также используется для самого Unreal Engine 4 Editor.
Виджеты доступны только локально на клиенте (Listen-сервер).
Они не реплицируются, и вы всегда должны отделять, реплицированный класс для выполнения реплицированных действия с помощью, например, кнопка-нажата.
Чтобы узнать больше о UMG и виджетах, пожалуйста, используйте прилагаемую ссылку выше.
У нас уже был небольшой пример для виджетов исползуемых внутри APawn примеров.
Так что я пропущу их здесь.

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

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