C++ Replication в Unreal Engine

Репликация – Важная тема при создании мультиплеера. В Этом Шаблоне мы разберем простой пример. Далее, зная нужные макросы и параметры – Вы сможете спокойно переносить Blueprints в C++. 

Репликация переменных

При создании Actor класса в проекте необходимо указать, что он будет реплицироваться. В Конструкторе класса в CPP файле укажите значение унаследованной переменной: bReplicates = trueТак же необходимо подключить заголовок класса #include “Net/UnrealNetwork.h”

Объявляя переменные в заголовочном файле (.h) – В Макросе UPROPERTY мы должны указать, что эта переменная реплицируется: 

  1. public:
  2. UPROPERTY(Replicated, BlueprintReadWrite)
  3. int Lives;

Объявленные реплицируемые переменные – необходимо зарегистрировать. 

В h Файле делаем перезапись функции для репликации: virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

По крайней мере я использую данный термин. В .cpp файле прописываем метод, который, как раз и зарегистрирует наши переменные. Допустим мы делаем доработку в классе AFPS_Character, и нам нужно зарегистрировать объявленную переменную Lives:

  1. void AFPS_Character::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const
  2. {
  3. // Replication registration
  4. Super::GetLifetimeReplicatedProps(OutLifetimeProps);
  5. DOREPLIFETIME(AFPS_Character, Lives);
  6. };

Репликация Методов

Репликация методов указывается в макросе UFUNCTION с помощью параметров. Эти параметры влияют на то, где будет вызываться данный метод, На сервере, На клиенте, Мультикаст и т.п. Пример такого метода:

UFUNCTION(Reliable, Server, WithValidation, BlueprintCallable) void Server_Cast

 

Ниже представлена таблица параметров для UFUNCTION с их описанием. Переведено из официальной документации Unreal Engine. Далее мы рассмотрим уже реализацию таких методов.

Reliable

Функция реплицируется по сети и гарантированно выполняется независимо от пропускной способности или сетевых ошибок. Действует только при использовании в сочетании с Client или Server. Обратная функция: Unreliable

Server

Функция выполняется только на сервере. Объявляет дополнительную функцию с таким же именем, как у основной функции, но с _Implementation добавлением в конец, где должен быть написан код. Автоматически сгенерированный код будет вызывать _Implementation метод при необходимости.

Client

Функция выполняется только на клиенте, владеющем объектом, для которого вызывается функция. Объявляет дополнительную функцию с таким же именем, как у основной функции, но с _Implementation добавлением в конец. Автоматически сгенерированный код будет вызывать _Implementation метод при необходимости.

NetMulticast

Функция выполняется как локально на сервере, так и реплицируется на все клиенты, независимо от типа Актера NetOwner.

WithValidation

Объявляет дополнительную функцию с таким же именем, как у основной функции, но с _Validate добавлением в конец. Эта функция принимает те же параметры и возвращает  bool, чтобы указать, следует ли продолжать вызов основной функции.

Примеры:

.h
  1. UFUNCTION(Reliable, Server, WithValidation, BlueprintCallable)
  2. void Server_Cast();
.cpp
  1. bool AMR_FPS::Server_Cast_Validate()
  2. {
  3. // Проверка на выполнение. (Есть ли патроны, мана и т.п.)
  4. return true;
  5. }
  6. void AMR_FPS::Server_Cast_Implementation()
  7. {
  8. // Выполнение действия на сервере, откуда уже можно будет вызвать Мультикаст
  9. }
При отсутствии параметра проверки - WithValidation - Выполняем объявление только _Implementation()

Это базовые понятия о репликации в Unreal Engine. А то, каким будет сетевой код в дальнейшем – зависит от того, как вы будете использовать вызовы клиента и сервера. 

Вы всегда можете обратиться к нашей команде за помощью в разработке, обучению или заказать прототип под ключ. Вступайте в наш telegram канал: