Накама-это сервер с открытым исходным кодом, предназначенный для питания современных игр и приложений. Функции включают учетные записи пользователей, чат, социальные, сваха, многопользовательский период в реальном времени и многое другое.
Этот клиент реализует полные параметры API и сокета с сервером. Он написан в C ++ с минимальными зависимостями для поддержки Unreal 4 и 5.
Если вы испытываете какие -либо проблемы с клиентом, может быть полезно для включения журналов отладки и открыть проблему.
Полная документация - онлайн - https://heroiclabs.com/docs
Этот плагин также можно использовать для программистов, которые любят C ++ или чертежи. Все переменные и функции подвергаются воздействию типов, используемых нереальным двигателем (Uproperties, Ustruct, Ufunctions и т. Д.)
Плагин разделен на три модуля, которые можно тянуть в зависимости от ваших потребностей.
NakamaUnreal Рекомендуемый C ++-модуль для использования Nakama в Unrealengine. Это интегрируется с нативными типами Unreal и Uobjects.NakamaBlueprints для пользователей, которые предпочитают использовать чертежи в своем проекте.NakamaCore для пользователей, которые мигрируют с Pre-V2.6.0 Unreal Client и хотят внести минимальные изменения, или используют наш API C ++ более низкого уровня без Unreal Tipes: (https://github.com/heroiclabs/nakama-cpp).Поскольку
NakamaCoreиспользует предварительно построенные библиотеки, вы можете столкнуться с проблемами сборки из -за различий в наборе инструментов Unreal от стандартных инструментов C ++. Вот почемуNakamaUnreal- наш рекомендуемый модуль.
В этой документации клиенты называются клиентом в реальном времени и клиенте по умолчанию, в котором клиент в реальном времени является сокетом, а клиент по умолчанию использует API REST для общения с Накамой.
Вам нужно будет настроить сервер и базу данных, прежде чем вы сможете подключиться к клиенту. Самый простой способ - использовать Docker, но посмотреть на документацию сервера для других вариантов.
Чтобы начать использовать Накаму в Unreal, вам понадобится следующее:
Кроме того, убедитесь, что ваш нереальный проект является проектом C ++. Если это только Blueprint, вы можете добавить новый файл C ++ в свой проект в Unreal Editor через «File -> New C ++ Class». Установите его на частном порядке и назовите все, что вам нравится. Наличие этого файла в вашем проекте позволяет нереально составлять плагин.
Чтобы использовать Nakama в вашем нереальном проекте, вам нужно будет загрузить наш плагин с Unreal Marketplace или скопировать файлы Nakama-Unreal, которые вы загрузили в соответствующее место. Сделать последнее:
C:\MyUnrealProject\ ) в Explorer или Finder.Plugins .Nakama от Nakama-Unreal и положите ее в папку Plugins Необязательно: вы можете поместить плагины в папку плагина Unreal Engine (например, C:Program FilesEpic GamesUE_4.26EnginePluginsMarketplace ), чтобы использовать плагин для нескольких проектов.
На этом этапе вы закончили. Перезапустить нереальные. После того, как он собирает вещи, откройте плагины редактирования и прокрутите вниз. Если все прошло хорошо, вы должны увидеть heroiclabs.nakama, указанные в плагине.
Клиенты
Вы должны решить, где вы хотите создать и вести учет этих клиентов.
Сеансы
Сеансы - это портативные UOBjects, которые содержат указатель сеанса и структуру с фактическими данными в сеансе, такие как токены, пользовательские данные, информация об истечении срока службы. Есть также некоторые функции утилиты, предоставленные объектами сеанса, например, получение конкретной переменной или восстановление сеанса.
Тик -система
Обычно вам придется обращаться с тиканием на основе C ++, к счастью, это автоматически выполняется под капотом в этом плагине после того, как вы создали клиент. Когда вы создаете клиента, вы можете определить интервал тикания, по умолчанию это установлено на 0, что означает, что он будет тикать каждый кадр, если вы хотите, чтобы он тикал каждые 50 мс, вам нужно установить его 0,05, чтобы он был тика каждую секунду, это число будет 1.
Ниже приведен простой пример настройки клиента по умолчанию, аутентификации, настройки клиента в реальном времени и присоединения к чату. В примере мы поместим все в пустой класс Aactor, который находится на уровне.
Не забудьте добавить NakamaUnreal к вашим частным зависимостям в соответствии с файлом вашего проекта build.cs. Например:
PrivateDependencyModuleNames . AddRange ( new string [ ] { "NakamaUnreal" } ) ;Начиная с общественных переменных заголовков, мы используем чистый актер, который будет размещен на сцене в этом примере. Unreal Engine использует систему отражения, которая предоставляет метаданные о своих классах и позволяет использовать такие расширенные функции, как связь Blueprint/C ++, сериализация и многое другое. При работе с объектами Nakama или любым классом, полученным из Uobject, важно отметить их, используя систему нереального отражения. Это делается с использованием макросов, таких как UFunction () и UpRoperty ().
UPROPERTY ()
UNakamaClient* NakamaClient;
UPROPERTY ()
UNakamaRealtimeClient* NakamaRealtimeClient;
UPROPERTY ()
UNakamaSession* UserSession;
UFUNCTION ()
void OnAuthenticationSuccess(UNakamaSession* LoginData);
UFUNCTION ()
void OnAuthenticationError( const FNakamaError& Error);
UFUNCTION ()
void OnRealtimeClientConnectSuccess();
UFUNCTION ()
void OnRealtimeClientConnectError( const FNakamaRtError& ErrorData);
// Initialize client and authenticate here
virtual void BeginPlay () override ;Например, если вы хотите, чтобы объект Nakama был доступен для манипуляций в редакторе Blueprint, вы отметите его UpRoperty ().
UPROPERTY (BlueprintReadWrite, EditAnywhere, Category= " Nakama " )
UNakamaClient* NakamaClientInstance;Используя спецификатор BluePrinTreadWrite, переменная NakamaclientInstance становится как читаемой, так и для записи в чертеже.
Затем в начале игры мы настроем клиента по умолчанию, аутентифицируйте и связывают делегатов.
// Called when the game starts or when spawned
void AMyActor::BeginPlay ()
{
Super::BeginPlay ();
// Default Client Parameters
FString ServerKey = TEXT ( " defaultkey " );
FString Host = TEXT ( " 127.0.0.1 " );
int32 Port = 7350 ;
bool bUseSSL = false ;
bool bEnableDebug = true ;
// Setup Default Client
NakamaClient = UNakamaClient::CreateDefaultClient (ServerKey, Host, Port, bUseSSL, bEnableDebug);
// Authentication Parameters
FString Email = TEXT ( " [email protected] " );
FString Password = TEXT ( " verysecretpassword " );
FString Username = TEXT ( " debug-user " );
TMap<FString, FString> Variables;
// Setup Delegates of same type and bind them to local functions
FOnAuthUpdate AuthenticationSuccessDelegate;
AuthenticationSuccessDelegate. AddDynamic ( this , &AMyActor::OnAuthenticationSuccess);
FOnError AuthenticationErrorDelegate;
AuthenticationErrorDelegate. AddDynamic ( this , &AMyActor::OnAuthenticationError);
NakamaClient-> AuthenticateEmail (Email, Password, Username, true , Variables, AuthenticationSuccessDelegate, AuthenticationErrorDelegate);
}Тогда ответ на вызов аутентификации
void AMyActor::OnAuthenticationSuccess (UNakamaSession* LoginData)
{
if (GEngine) GEngine-> AddOnScreenDebugMessage (- 1 , 15 . 0f , FColor::Green, FString::Printf ( TEXT ( " Authenticated As %s " ), *LoginData-> SessionData . Username ));
UserSession = LoginData;
// Setup Delegates of same type and bind them to local functions
FOnRealtimeClientConnected ConnectionSuccessDelegate;
ConnectionSuccessDelegate. AddDynamic ( this , &AMyActor::OnRealtimeClientConnectSuccess);
FOnRealtimeClientConnectionError ConnectionErrorDelegate;
ConnectionErrorDelegate. AddDynamic ( this , &AMyActor::OnRealtimeClientConnectError);
// This is our realtime client (socket) ready to use
NakamaRealtimeClient = NakamaClient-> SetupRealtimeClient ();
// Remember to Connect
bool bCreateStatus = true ;
NakamaRealtimeClient-> Connect (UserSession, bCreateStatus, ConnectionSuccessDelegate, ConnectionErrorDelegate);
}
void AMyActor::OnAuthenticationError ( const FNakamaError& Error)
{
if (GEngine) GEngine-> AddOnScreenDebugMessage (- 1 , 15 . 0f , FColor::Red, FString::Printf ( TEXT ( " Failed to Authenticate: %s " ), *Error. Message ));
}И, наконец, переоборудованный обратный вызов настройки клиента в реальном времени, теперь вы можете использовать клиент в реальном времени.
void AMyActor::OnRealtimeClientConnectSuccess ()
{
if (GEngine) GEngine-> AddOnScreenDebugMessage (- 1 , 15 . 0f , FColor::Green, FString ( TEXT ( " Socket Setup Success! " )));
// Example of Joining Chat without callbacks
NakamaRealtimeClient-> JoinChat ( " Heroes " , ENakamaChannelType::ROOM, true , false , {}, {});
}
void AMyActor::OnRealtimeClientConnectError ( const FNakamaRtError& ErrorData)
{
if (GEngine) GEngine-> AddOnScreenDebugMessage (- 1 , 15 . 0f , FColor::Red, FString ( TEXT ( " Socket Setup Failed! " )));
}Если вы правильно настроите все, создайте версию этого актера Blueprint и поместите его на уровне, который вы увидите на экране, в которых говорится, что вы аутентифицировали, ваше имя пользователя, а затем подключенное сообщение.
Последний релиз Nakama Unreal предлагает гибкость для использования либо Dynamic Multicast Delegates , либо Lambdas (TFunctions) для обработки функций и событий. Вот краткое сравнение и руководящие принципы о том, как их использовать:
AddDynamic . Предоставьте предпочтительный тип обратного вызова (либо delegate , либо lambda ) в параметры Success и Error соответствующей функции Накамы.
Вот демонстрация использования lambdas в качестве альтернативы delegates :
// Define success callback with a lambda
auto successCallback = [&](UNakamaSession* session)
{
UE_LOG (LogTemp, Warning, TEXT ( " Session Token: %s " ), *Session-> GetAuthToken ());
UE_LOG (LogTemp, Warning, TEXT ( " Username: %s " ), *Session-> GetUsername ());
};
// Define error callback with a lambda
auto errorCallback = [&]( const FNakamaError& Error)
{
UE_LOG (LogTemp, Warning, TEXT ( " Error Code: %d " ), Error. Code );
};
// Execute the AuthenticateEmail function with lambdas
Client-> AuthenticateEmail (TEXT( " [email protected] " ), TEXT( " verysecretpassword " ), TEXT( " debug-user " ), true, {}, successCallback, errorCallback);После инициализации вашего клиента в реальном времени важно создать слушателей событий для критических внутриигровых событий, от сообщений канала и уведомлений до партийных взаимодействий. Nakama Unreal обеспечивает гибкость, позволяя как Lambdas, так и делегатам для этой цели.
// Start by creating a Realtime Client:
UNakamaRealtimeClient* Socket = NakamaClient-> SetupRealtimeClient ();
// When using delegates, you need to declare functions that match the delegate's signature:
Socket->ChannelMessageReceived.AddDynamic( this , &ANakamaActor::OnChannelMessageReceived);
Socket->NotificationReceived.AddDynamic( this , &ANakamaActor::OnNotificationReceived);
// Lambdas offer a concise way to define event handlers directly in-line:
// Note: A lambda can be bound only once.
Socket-> SetChannelMessageCallback ( []( const FNakamaChannelMessage& ChannelMessage)
{
UE_LOG (LogTemp, Warning, TEXT ( " Channel Message: %s " ), *ChannelMessage. Content );
});
Socket-> SetNotificationsCallback ( []( const FNakamaNotificationList& NotificationList)
{
UE_LOG (LogTemp, Warning, TEXT ( " Notifications: %d " ), NotificationList. Notifications . Num ());
for ( auto & Notification : NotificationList. Notifications )
{
UE_LOG (LogTemp, Warning, TEXT ( " Notification: %s " ), *Notification. Content );
}
});
// Establish a connection to start receiving events.
// Optional success and error callbacks (either lambdas or delegates) can be provided:
Socket-> Connect (Session, true );Реализации функций могут выглядеть примерно так:
void ANakamaActor::OnChannelMessageReceived ( const FNakamaChannelMessage& ChannelMessage)
{
UE_LOG (LogTemp, Warning, TEXT ( " Channel Message: %s " ), *ChannelMessage. Content );
}
void ANakamaActor::OnNotificationReceived ( const FNakamaNotificationList& Notifications)
{
for ( auto NotificationData : Notifications. Notifications )
{
UE_LOG (LogTemp, Warning, TEXT ( " Notification: %s " ), *NotificationData. Content );
}
}NakamaBlueprintsВ этом разделе вы узнаете, как вручную создавать и управлять клиентами Nakama, которые предоставляются этим плагином, полностью в чертеже.
Это зависит от вас, где создавать и хранить ссылки на клиентов, это может быть сделано в любом актере, компоненте, персонаже, Gamemode и т. Д. Хорошее место для размещения клиентов - это контроллер игрока или экземпляр игры.
Начните с добавления клиентского узла Create по умолчанию , который является частью библиотеки Накама.

Хорошей практикой является продвижение клиентов к переменным, чтобы вы могли получить доступ к ним в других местах на ваших графиках чертежа.

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

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

После того, как вы создали клиента по умолчанию, вы сможете настроить одного или нескольких клиентов в реальном времени (гнезда), которые взаимодействуют с сервером.
Перетащите из Nakamaclient , который вы создали ранее, и вызовите функцию клиента настройки в реальном времени .

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

После создания клиента в реальном времени вы готовы привязать к его событиям

После настройки ваших конкретных слушателей вы готовы привязать к обратным вызовам.

Создайте пользовательское событие и дайте ему значимое имя.

В приведенном ниже примере мы настроим слушателя для уведомлений, затем мы связываемся с событием, переоцениваем уведомления и печатаем его в виде струн отладки на экране.

В следующем примере мы слушаем событие Matchmaker Matched, а затем связываемся с ним и обрабатываем ответ, присоединившись к совпадению с возвращенным токеном, который затем возвращает совпадение, включая идентификатор матча, присутствие, этикетку и так далее.

Как описано ранее, когда вы аутентифицируете подлинность на Nakama, вы получите объект сеанса, который вы должны хранить где -то, легко доступное в ваших чертежах, поскольку многие из узлов в этом плагине требуют объекта сеанса в качестве входного функции.
Объект сеанса содержит фактическую ссылку на сеанс, а также структуру с данными, читаемыми в чертеже. Перетащите из сеанса и получите данные сеанса.

Есть также некоторые дополнительные методы управления сеансами, такие как восстановление сеанса и проверка, истек ли сеанс

Рекомендуется сохранить токен Auth из сеанса и проверить за стартапом, если он истек. Если токен истек, вы должны повторно нанести. Время истечения токена может быть изменено как настройка на сервере.
Клиенты включают в себя множество встроенных API для различных функций игрового сервера. Доступ к ним можно получить с помощью асинхронных методов, которые возвращают успех и обратные вызовы ошибки. Они также могут вызывать пользовательскую логику в качестве функций RPC на сервере. Все запросы отправляются с объектом сессии, который разрешает клиентов.

Узел RPC может использоваться для запуска конкретной функциональности на сервере, полезная нагрузка должна быть в формате JSON.

Двигаясь вперед, вы должны быть готовы использовать все функциональные возможности Nakama для питания вашей удивительной игры или приложения, созданного нереальным двигателем, выполненным полностью в чертеже. Пожалуйста, обратитесь к официальной документации по адресу https://heroiclabs.com/docs, даже если некоторые документации описаны в C ++, такая же основная функция применима к реализации Blueprint.
Курсоры используются для добавления функциональности подыгрывания в определенные узлы, такие как список друзей и записи о таблице лидеров. Когда будет получено больше данных, в результате обратного вызова курсора будет возвращена строка курсора. Вы можете сохранить этот курсор в качестве строки и использовать его позже, например, когда человек нажимает кнопку «Больше» или немедленно использует ее, чтобы получить больше данных. Посмотрите на пример ниже.

По умолчанию регистрация отключена. Однако при создании клиента у вас есть возможность Enable Debug , позволяя записать журналы с использованием категории журнала отладки. Вы также можете вручную управлять журналом.
Включение журнала из чертежей: 
Включение журнала из C ++
Чтобы включить регистрацию через C ++, включите следующий файл заголовка:
# include " NakamaLogger.h "Впоследствии, чтобы переключить регистрацию, использовать:
UNakamaLogger::EnableLogging ( true );Чтобы установить уровень журнала, используйте:
UNakamaLogger::SetLogLevel (ENakamaLogLevel::Debug);Категории журналов следующие:
Debug пишет все журналы.
Info записывает журналы с Info , Warn , Error и Fatal уровнем ведения журнала.
Warn пишет журналы с Warn , Error и Fatal уровнем регистрации.
Error записывает журналы с Error и Fatal уровнем ведения журнала.
Fatal записи только вводится только с Fatal уровнем ведения ведения ведения.
Этот репозиторий включает в себя тестовую подставку для проверки различных функций Nakama для Unreal, тесты могут быть запускаются в редакторе, из командной строки, и есть Eve BlueprintsTest с отдельной документацией, если вы хотите запустить те же тесты в чертепринтах.
Nakama в каталог Plugins в проектеFunctional Testing Editor в Unreal в разделе Edit -> Plugins , затем перезапустите редакторTool -> TestAutomationStart Tests
Тесты можно запускать как в упаковке, так и с использованием версии командной строки нереального редактора.
Для всех тестов на основе командной строки начинаются с выполнения этих шагов:
Nakama в каталог Plugins в рамках проектаNakama для проектаWindows - редактор:
Чтобы построить тест, запустите:
" <Path_To_Unreal_Engine>EngineBuildBatchFilesBuild.bat " < YourProjectName > Editor Win64 Development -Project= " <Path_To_Your_Project><YourProjectName>.uproject "Чтобы запустить тест, запустите:
" <Path_To_Unreal_Engine>EngineBinariesWin64UnrealEditor-Cmd.exe " " <Path_To_Your_Project><YourProjectName>.uproject " -ExecCmds= " Automation RunTests <YourTestName> " -log -NullRHI -verbose -unattended -ReportOutputPath= " <Path_To_Store_Report> " Если вы хотите запустить все тесты, замените <YourTestName> с помощью Nakama.Base , если вы указате ReportOutputPath , вы получите обзор JSON LogFile, журналы будут храниться в каталоге Saved/Logs .
Windows - упакован:
Чтобы построить тест, запустите:
" <Path_To_Unreal_Engine>/Engine/Build/BatchFiles/RunUAT.sh " BuildCookRun -targetconfig=Debug -project= " <Path_To_Your_Project><YourProjectName>.uproject " -noP4 -installed -utf8output -build -cook -stage -package -verbose -stdout -nohostplatform -useshellexecuteЧтобы запустить тест, запустите:
./ < YourProjectName > /Saved/StagedBuilds/Windows/ < YourProjectName > .exe -nullrhi -verbose -ExecCmds= " Automation RunTests Nakama.Base " -logMac - упакован:
Чтобы построить тест, запустите:
" <Path_To_Unreal_Engine>/Engine/Build/BatchFiles/RunUAT.sh " BuildCookRun -project= " <Path_To_Your_Project><YourProjectName>.uproject " -targetConfig=Debug -noP4 -platform=Mac -Architecture_Mac=arm64 -targetconfig=Debug -installed -unrealexe=UnrealEditor -utf8output -build -cook -stage -package -verboseЧтобы запустить тест, запустите:
./ < YourProjectName > /Binaries/Mac/ < YourProjectName > .app/Contents/MacOS/ < YourProjectName > -nullrhi -stdout -forcelogflush -ExecCmds= " Automation RunTests Nakama.Base " -logLinux - упакован:
Чтобы построить тест, запустите:
" <Path_To_Unreal_Engine>/Engine/Build/BatchFiles/RunUAT.sh " BuildCookRun -project= " <Path_To_Your_Project><YourProjectName>.uproject " -clientconfig=Test -noP4 -platform=Linux -targetconfig=Debug -installed -utf8output -build -cook -stage -package -verboseЧтобы запустить тест, запустите:
./ < YourProjectName > /Binaries/Linux/ < YourProjectName > -nullrhi -stdout -forcelogflush -ExecCmds= " Automation RunTests Nakama.Base " -logПроходящие параметры
Такие параметры, как имя хоста, порт и ключ сервера, могут быть переданы в качестве аргументов командной строки, вот пример:
-hostname= " 127.0.0.1 " -port=7350 -serverkey= " defaultkey " -serverhttpkey= " defaulthttpkey " -timeout=45 -useSSLНекоторые из функций этого плагина зависят от JSON, таких как отправка сообщений чата и хранение данных с использованием объектов хранения. Поэтому рекомендуется, чтобы, если вы используете чисто чертежи, вы найдете плагин, который может построить и разрабатывать строки json, такие как варианты.
Когда вы разрабатываете в редакторе, вы можете запустить несколько нереальных экземпляров, используя PIE (воспроизводить в редакторе) и способны аутентифицировать с использованием отдельных учетных записей, что очень полезно при тестировании функциональных возможностей, которые требуют нескольких игроков, таких как чат, многопользовательский период в реальном времени, совпадение и так далее.
В части этой документации мы добавляем C ++ в наш проект, это только для того, чтобы собирать плагин, вы все равно можете использовать только чертежи.
С этим плагином приведен пример проекта, который разрабатывается в чистых чертежах, который демонстрирует почти все основные функции Накамы.



Дорожная карта разработки управляется как выпуски Github, а запросы на привлечение приветствуются. Если вы заинтересованы в улучшении кода, пожалуйста, откройте проблему, чтобы обсудить изменения или запустить и обсудить его на форуме сообщества.
Unreal Module основан на общем C ++ SDK
Мы используем VCPKG для установки Nakama-SDK для любого данного набора инструментов, прежде чем поместить его в каталог NakamaCore/libnakama :
ARM64-OSX: vcpkg install --overlay-triplets=./triplets --host-triplet=arm64-osx-release-heroic --triplet=arm64-osx-release-heroic
x64-Windows: vcpkg install --overlay-triplets=./triplets --host-triplet=x64-windows-heroic --triplet=x64-windows-heroic
ARM64-Windows: vcpkg install --overlay-triplets=./triplets --host-triplet=arm64-windows-heroic --triplet=arm64-windows-heroic
x64-linux: vcpkg install --overlay-triplets=./triplets --host-triplet=x64-linux-release-heroic --triplet=x64-linux-release-heroic
Затем скопируйте библиотеку из VCPKG_INSTALLAD в каталог Либнакамы и заголовки в NakamaCore/Public/nakama-cpp .
Затем вы можете собрать плагин из командной строки, пропустив флаг -Rocket , если вы включили редактор через эпическую пусковую установку. Тем не менее, использование эпического распределения пусковых установков не рекомендуется, по крайней мере, для запуска командной строки.
Windows:
${UNREAL_ENGINE} /Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -NoHostPlatform -Plugin= " ${NAKAMA_UNREAL} /Nakama/Nakama.uplugin " -TargetPlatforms=Win64 -package= ${NAKAMA_UNREAL} /Out/NakamaMac:
${UNREAL_ENGINE} /Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -NoHostPlatform -Plugin= " ${NAKAMA_UNREAL} /Nakama/Nakama.uplugin " -TargetPlatforms=Mac -package= ${NAKAMA_UNREAL} /Out/Nakama -Architecture_Mac=arm64 Для iOS передайте iOS TargetPlatforms .
Чтобы просмотреть полный список команд автоматизации, запустите:
${UNREAL_ENGINE}/Engine/Build/BatchFiles/RunUAT.sh -List
Linux:
${UNREAL_ENGINE}/Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -NoHostPlatform -Plugin="${NAKAMA_UNREAL}/Nakama/Nakama.uplugin" -TargetPlatforms=Linux -package=${NAKAMA_UNREAL}/Out/Nakama
Вы можете найти здесь руководство по клиенту Накамы.
Этот проект лицензирован по лицензии Apache-2.