View a markdown version of this page

Plugin für Unreal: Integriere deinen Spielcode - GameLift Amazon-Server

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Plugin für Unreal: Integriere deinen Spielcode

Bevor du deinen Spielserver für eine Flotte bereitstellen kannst, musst du eine Reihe von Aktualisierungen am Spielcode vornehmen und die Spielkomponenten für den Amazon GameLift Servers Dienst verpacken.

In diesem Thema werden die Schritte für eine Minimalintegration beschrieben. Verwenden Sie für die Serverintegration das mitgelieferte Codebeispiel, um den Spielmodus Ihres Projekts zu aktualisieren.

Richten Sie Build-Ziele und Modulregeln ein

Ändere deine Spielprojektdateien, um die Build-Komponenten zur Verwendung mit richtig zu generierenAmazon GameLift Servers.

So fügst du Client- und Server-Build-Ziele hinzu:
  1. Öffne die Codedateien deines Spielprojekts und suche die .../Games/[your application name]Source/[your application name]Target.cs Dateidatei. Beispiel: .../Source/GameLiftUnrealAppTarget.cs. (Wenn Sie Visual Studio verwenden, öffnen Sie die .sln Projektdatei.)

  2. Kopieren Sie diese Datei, um zwei neue Zieldateien im Source/ Verzeichnis zu erstellen.

    • Client-Ziel — Benennen Sie die neue Datei um in[your application name]Client.Target.cs. Bearbeiten Sie den Inhalt, um den Klassennamen und die Zieltypwerte zu aktualisieren, wie im folgenden Beispielcode dargestellt:

      using UnrealBuildTool; using System.Collections.Generic; public class GameLiftUnrealAppClientTarget : TargetRules { public GameLiftUnrealAppClientTarget ( TargetInfo Target ) : base ( Target ) { Type = TargetType.Client; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add( "GameLiftUnrealApp"); } }
    • Serverziel — Benennen Sie die neue Datei um in[your application name]Server.Target.cs. Bearbeiten Sie den Inhalt, um den Klassennamen und die Zieltypwerte zu aktualisieren, wie im folgenden Beispielcode dargestellt:

      using UnrealBuildTool; using System.Collections.Generic; public class GameLiftUnrealAppServerTarget : TargetRules { public GameLiftUnrealAppServerTarget ( TargetInfo Target ) : base ( Target ) { Type = TargetType.Server; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add( "GameLiftUnrealApp"); } }
  3. Regenerieren Sie Ihre Projektdateien. Wenn du Visual Studio verwendest, kannst du mit der rechten Maustaste auf die .uproject Datei deines Spielprojekts klicken und Visual Studio-Projektdateien generieren auswählen.

So aktualisierst du die Regeln für das Spielprojektmodul:

Aktualisiere die Modulregeln des Spielprojekts, sodass sie vom Plugin abhängig sind.

  1. Öffne die Codedateien deines Spielprojekts und suche die .../Games/[your application name]Source/[your application name].Build.cs Dateidatei. Beispiel: .../Source/GameLiftUnrealApp.Build.cs. (Wenn Sie Visual Studio verwenden, öffnen Sie die .sln Projektdatei.)

  2. Suchen Sie die ModuleRules Klasse und aktualisieren Sie sie wie im folgenden Beispielcode dargestellt:

    using UnrealBuildTool; public class GameLiftUnrealApp : ModuleRules { public GameLiftUnrealApp ( ReadOnlyTargetRules Target ) : base ( Target ) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDependencyModuleNames.AddRange( new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "EnhancedInput" }); // Add the following section if (Target.Type == TargetType.Server) { PublicDependencyModuleNames.Add("GameLiftServerSDK"); } else { PublicDefinitions.Add("WITH_GAMELIFT=0"); } bEnableExceptions = true; } }
  3. Nachdem Sie die neuen Zieldateien erstellt und die Modulregeln geändert haben, erstellen Sie Ihr Spielprojekt neu.

Aktualisiere deinen Spieleservercode

Aktualisiere deinen Spieleservercode, um die Kommunikation zwischen einem Spieleserverprozess und dem Amazon GameLift Servers Dienst zu ermöglichen. Ihr Spieleserver muss in der Lage sein, auf Anfragen von zu antwortenAmazon GameLift Servers, z. B. zum Starten und Beenden neuer Spielsitzungen.

Um Servercode hinzuzufügen für GameLift Amazon-Server
  1. Öffnen Sie in Ihrem Code-Editor die Solution (.sln) -Datei für Ihr Spielprojekt, die sich normalerweise im Stammordner des Projekts befindet. Beispiel: GameLiftUnrealApp.sln.

  2. Suchen Sie bei geöffneter Lösung nach der Headerdatei für den Spielmodus des Projekts: [project-name]GameMode.h file. Beispiel: GameLiftUnrealAppGameMode.h.

  3. Ändern Sie die Header-Datei so, dass sie dem folgenden Code entspricht. Achten Sie darauf, "GameLiftServer" durch Ihren eigenen Projektnamen zu ersetzen. Diese Updates sind spezifisch für den Spielserver. Wir empfehlen, eine Sicherungskopie der ursprünglichen Spielmodusdateien zur Verwendung mit Ihrem Client zu erstellen.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "GameLiftUnrealAppGameMode.generated.h" struct FProcessParameters; DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All); UCLASS(minimalapi) class AGameLiftUnrealAppGameMode : public AGameModeBase { GENERATED_BODY() public: AGameLiftUnrealAppGameMode(); protected: virtual void BeginPlay() override; private: void InitGameLift(); private: TSharedPtr<FProcessParameters> ProcessParameters; };
  • Öffnen Sie die zugehörige [project-name]GameMode.cpp Quelldatei (zum BeispielGameLiftUnrealAppGameMode.cpp). Ändern Sie den Code so, dass er dem folgenden Beispielcode entspricht. Achten Sie darauf, "GameLiftUnrealApp" durch Ihren eigenen Projektnamen zu ersetzen. Diese Updates sind spezifisch für den Spieleserver. Wir empfehlen dir, eine Sicherungskopie der Originaldatei zu erstellen, um sie mit deinem Client zu verwenden.

    Der folgende Beispielcode zeigt, wie man die mindestens erforderlichen Elemente für die Serverintegration mit hinzufügtAmazon GameLift Servers:

    • Initialisieren Sie einen Amazon GameLift Servers API-Client. Der InitSDK() Aufruf mit Serverparametern ist für eine Amazon GameLift Servers Anywhere-Flotte erforderlich. Wenn Sie eine Verbindung zu einer Anywhere-Flotte herstellen, speichert das Plugin die Serverparameter als Konsolenargumente. Der Beispielcode kann zur Laufzeit auf die Werte zugreifen.

    • Implementieren Sie die erforderlichen Callback-Funktionen, um auf Anfragen des Amazon GameLift Servers Dienstes zu antworten, einschließlich OnStartGameSessionOnProcessTerminate, undonHealthCheck.

    • Rufen Sie ProcessReady() mit einem bestimmten Port an, um den Amazon GameLift Servers Dienst zu benachrichtigen, wenn er bereit ist, Spielsitzungen zu veranstalten.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #include "GameLiftUnrealAppGameMode.h" #include "UObject/ConstructorHelpers.h" #include "Kismet/GameplayStatics.h" #if WITH_GAMELIFT #include "GameLiftServerSDK.h" #include "GameLiftServerSDKModels.h" #endif #include "GenericPlatform/GenericPlatformOutputDevices.h" DEFINE_LOG_CATEGORY(GameServerLog); AGameLiftUnrealAppGameMode::AGameLiftUnrealAppGameMode() : ProcessParameters(nullptr) { // Set default pawn class to our Blueprinted character static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter")); if (PlayerPawnBPClass.Class != NULL) { DefaultPawnClass = PlayerPawnBPClass.Class; } UE_LOG(GameServerLog, Log, TEXT("Initializing AGameLiftUnrealAppGameMode...")); } void AGameLiftUnrealAppGameMode::BeginPlay() { Super::BeginPlay(); #if WITH_GAMELIFT InitGameLift(); #endif } void AGameLiftUnrealAppGameMode::InitGameLift() { #if WITH_GAMELIFT UE_LOG(GameServerLog, Log, TEXT("Calling InitGameLift...")); // Getting the module first. FGameLiftServerSDKModule* GameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK")); //Define the server parameters for a GameLift Anywhere fleet. These are not needed for a GameLift managed EC2 fleet. FServerParameters ServerParametersForAnywhere; bool bIsAnywhereActive = false; if (FParse::Param(FCommandLine::Get(), TEXT("glAnywhere"))) { bIsAnywhereActive = true; } if (bIsAnywhereActive) { UE_LOG(GameServerLog, Log, TEXT("Configuring server parameters for Anywhere...")); // If GameLift Anywhere is enabled, parse command line arguments and pass them in the ServerParameters object. FString glAnywhereWebSocketUrl = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereWebSocketUrl="), glAnywhereWebSocketUrl)) { ServerParametersForAnywhere.m_webSocketUrl = TCHAR_TO_UTF8(*glAnywhereWebSocketUrl); } FString glAnywhereFleetId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereFleetId="), glAnywhereFleetId)) { ServerParametersForAnywhere.m_fleetId = TCHAR_TO_UTF8(*glAnywhereFleetId); } FString glAnywhereProcessId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereProcessId="), glAnywhereProcessId)) { ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*glAnywhereProcessId); } else { // If no ProcessId is passed as a command line argument, generate a randomized unique string. FString TimeString = FString::FromInt(std::time(nullptr)); FString ProcessId = "ProcessId_" + TimeString; ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*ProcessId); } FString glAnywhereHostId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereHostId="), glAnywhereHostId)) { ServerParametersForAnywhere.m_hostId = TCHAR_TO_UTF8(*glAnywhereHostId); } FString glAnywhereAuthToken = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAuthToken="), glAnywhereAuthToken)) { ServerParametersForAnywhere.m_authToken = TCHAR_TO_UTF8(*glAnywhereAuthToken); } FString glAnywhereAwsRegion = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAwsRegion="), glAnywhereAwsRegion)) { ServerParametersForAnywhere.m_awsRegion = TCHAR_TO_UTF8(*glAnywhereAwsRegion); } FString glAnywhereAccessKey = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAccessKey="), glAnywhereAccessKey)) { ServerParametersForAnywhere.m_accessKey = TCHAR_TO_UTF8(*glAnywhereAccessKey); } FString glAnywhereSecretKey = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSecretKey="), glAnywhereSecretKey)) { ServerParametersForAnywhere.m_secretKey = TCHAR_TO_UTF8(*glAnywhereSecretKey); } FString glAnywhereSessionToken = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSessionToken="), glAnywhereSessionToken)) { ServerParametersForAnywhere.m_sessionToken = TCHAR_TO_UTF8(*glAnywhereSessionToken); } UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_YELLOW); UE_LOG(GameServerLog, Log, TEXT(">>>> WebSocket URL: %s"), *ServerParametersForAnywhere.m_webSocketUrl); UE_LOG(GameServerLog, Log, TEXT(">>>> Fleet ID: %s"), *ServerParametersForAnywhere.m_fleetId); UE_LOG(GameServerLog, Log, TEXT(">>>> Process ID: %s"), *ServerParametersForAnywhere.m_processId); UE_LOG(GameServerLog, Log, TEXT(">>>> Host ID (Compute Name): %s"), *ServerParametersForAnywhere.m_hostId); UE_LOG(GameServerLog, Log, TEXT(">>>> Auth Token: %s"), *ServerParametersForAnywhere.m_authToken); UE_LOG(GameServerLog, Log, TEXT(">>>> Aws Region: %s"), *ServerParametersForAnywhere.m_awsRegion); UE_LOG(GameServerLog, Log, TEXT(">>>> Access Key: %s"), *ServerParametersForAnywhere.m_accessKey); UE_LOG(GameServerLog, Log, TEXT(">>>> Secret Key: %s"), *ServerParametersForAnywhere.m_secretKey); UE_LOG(GameServerLog, Log, TEXT(">>>> Session Token: %s"), *ServerParametersForAnywhere.m_sessionToken); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } UE_LOG(GameServerLog, Log, TEXT("Initializing the GameLift Server...")); //InitSDK will establish a local connection with GameLift's agent to enable further communication. FGameLiftGenericOutcome InitSdkOutcome = GameLiftSdkModule->InitSDK(ServerParametersForAnywhere); if (InitSdkOutcome.IsSuccess()) { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_GREEN); UE_LOG(GameServerLog, Log, TEXT("GameLift InitSDK succeeded!")); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } else { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_RED); UE_LOG(GameServerLog, Log, TEXT("ERROR: InitSDK failed : (")); FGameLiftError GameLiftError = InitSdkOutcome.GetError(); UE_LOG(GameServerLog, Log, TEXT("ERROR: %s"), *GameLiftError.m_errorMessage); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); return; } ProcessParameters = MakeShared<FProcessParameters>(); //When a game session is created, Amazon GameLift Servers sends an activation request to the game server and passes along the game session object containing game properties and other settings. //Here is where a game server should take action based on the game session object. //Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession() ProcessParameters->OnStartGameSession.BindLambda([=](Aws::GameLift::Server::Model::GameSession InGameSession) { FString GameSessionId = FString(InGameSession.GetGameSessionId()); UE_LOG(GameServerLog, Log, TEXT("GameSession Initializing: %s"), *GameSessionId); GameLiftSdkModule->ActivateGameSession(); }); //OnProcessTerminate callback. Amazon GameLift Servers will invoke this callback before shutting down an instance hosting this game server. //It gives this game server a chance to save its state, communicate with services, etc., before being shut down. //In this case, we simply tell Amazon GameLift Servers we are indeed going to shutdown. ProcessParameters->OnTerminate.BindLambda([=]() { UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating")); // First call ProcessEnding() FGameLiftGenericOutcome processEndingOutcome = GameLiftSdkModule->ProcessEnding(); // Then call Destroy() to free the SDK from memory FGameLiftGenericOutcome destroyOutcome = GameLiftSdkModule->Destroy(); // Exit the process with success or failure if (processEndingOutcome.IsSuccess() && destroyOutcome.IsSuccess()) { UE_LOG(GameServerLog, Log, TEXT("Server process ending successfully")); } else { if (!processEndingOutcome.IsSuccess()) { const FGameLiftError& error = processEndingOutcome.GetError(); UE_LOG(GameServerLog, Error, TEXT("ProcessEnding() failed. Error: %s"), error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); } if (!destroyOutcome.IsSuccess()) { const FGameLiftError& error = destroyOutcome.GetError(); UE_LOG(GameServerLog, Error, TEXT("Destroy() failed. Error: %s"), error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); } } }); //This is the HealthCheck callback. //Amazon GameLift Servers will invoke this callback every 60 seconds or so. //Here, a game server might want to check the health of dependencies and such. //Simply return true if healthy, false otherwise. //The game server has 60 seconds to respond with its health status. Amazon GameLift Servers will default to 'false' if the game server doesn't respond in time. //In this case, we're always healthy! ProcessParameters->OnHealthCheck.BindLambda([]() { UE_LOG(GameServerLog, Log, TEXT("Performing Health Check")); return true; }); //GameServer.exe -port=7777 LOG=server.mylog ProcessParameters->port = FURL::UrlConfig.DefaultPort; TArray<FString> CommandLineTokens; TArray<FString> CommandLineSwitches; FCommandLine::Parse(FCommandLine::Get(), CommandLineTokens, CommandLineSwitches); for (FString SwitchStr : CommandLineSwitches) { FString Key; FString Value; if (SwitchStr.Split("=", &Key, &Value)) { if (Key.Equals("port")) { ProcessParameters->port = FCString::Atoi(*Value); } } } //Here, the game server tells Amazon GameLift Servers where to find game session log files. //At the end of a game session, Amazon GameLift Servers uploads everything in the specified //location and stores it in the cloud for access later. TArray<FString> Logfiles; Logfiles.Add(TEXT("GameLiftUnrealApp/Saved/Logs/server.log")); ProcessParameters->logParameters = Logfiles; //The game server calls ProcessReady() to tell Amazon GameLift Servers it's ready to host game sessions. UE_LOG(GameServerLog, Log, TEXT("Calling Process Ready...")); FGameLiftGenericOutcome ProcessReadyOutcome = GameLiftSdkModule->ProcessReady(*ProcessParameters); if (ProcessReadyOutcome.IsSuccess()) { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_GREEN); UE_LOG(GameServerLog, Log, TEXT("Process Ready!")); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } else { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_RED); UE_LOG(GameServerLog, Log, TEXT("ERROR: Process Ready Failed!")); FGameLiftError ProcessReadyError = ProcessReadyOutcome.GetError(); UE_LOG(GameServerLog, Log, TEXT("ERROR: %s"), *ProcessReadyError.m_errorMessage); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } UE_LOG(GameServerLog, Log, TEXT("InitGameLift completed!")); #endif }

Integriere deine Client-Spielkarte

Die Start-Spielkarte enthält eine Blueprint-Logik und Benutzeroberflächenelemente, die bereits grundlegenden Code enthalten, um Spielsitzungen anzufordern und Verbindungsinformationen zu verwenden, um eine Verbindung zu einer Spielsitzung herzustellen. Sie können die Map unverändert verwenden oder sie nach Bedarf ändern. Verwende die Start-Game-Map mit anderen Spiel-Assets, wie z. B. dem Third Person-Vorlagenprojekt, das von Unreal Engine bereitgestellt wird. Diese Assets sind im Content Browser verfügbar. Du kannst sie verwenden, um die Bereitstellungsworkflows des Plugins zu testen, oder als Leitfaden für die Erstellung eines benutzerdefinierten Backend-Dienstes für dein Spiel.

Die Startup-Map weist die folgenden Eigenschaften auf:

  • Sie enthält Logik sowohl für eine Anywhere-Flotte als auch für eine verwaltete EC2-Flotte. Wenn Sie Ihren Client ausführen, können Sie wählen, ob Sie eine Verbindung zu einer der beiden Flotten herstellen möchten.

  • Zu den Client-Funktionen gehören das Suchen einer Spielsitzung (SearchGameSessions()), das Erstellen einer neuen Spielsitzung (CreateGameSession()) und die direkte Teilnahme an einer Spielsitzung.

  • Er erhält eine eindeutige Spieler-ID aus dem Amazon Cognito-Benutzerpool Ihres Projekts (dies ist Teil einer bereitgestellten Anywhere-Lösung).

Um die Startkarte des Spiels zu verwenden
  1. Öffne im UE-Editor die Seite „Projekteinstellungen, Karten und Modi“ und erweitere den Bereich „Standardkarten“.

  2. Wählen Sie für die Editor-Startkarte in der Dropdownliste die Option StartupMap "" aus. Möglicherweise müssen Sie nach der Datei suchen, die sich in ... > Unreal Projects/[project-name]/Plugins/Amazon GameLift Servers Plugin Content/Maps befindet.

    Anmerkung

    Um die Beispiel-Startmap zu finden, wählen Sie das Einstellungssymbol und dann Plugin-Inhalt anzeigen.

  3. Wähle für die Standardkarte des Spiels dasselbe "StartupMap" aus der Dropdownliste aus.

  4. Wähle für die Server-Standardkarte „Lv1_ThirdPerson" für Unreal Engine 5.6 oder höher oder "ThirdPersonMap" für frühere Versionen. Dies ist eine Standardkarte, die in deinem Spielprojekt enthalten ist. Diese Karte ist für zwei Spieler im Spiel konzipiert.

  5. Öffne das Detailfenster für die Standardkarte des Servers. Setzen Sie GameMode Override auf „Keine“.

  6. Erweitere den Abschnitt „Standardmodi“ und setze den globalen Standard-Server-Spielmodus auf den Spielmodus, den du für deine Serverintegration aktualisiert hast.

Nachdem du diese Änderungen an deinem Projekt vorgenommen hast, bist du bereit, deine Spielkomponenten zu erstellen.

Anmerkung

Wenn du bei Unreal Engine 5.6 oder höher den Charakter nicht bewegen kannst, nachdem du dich mit dem Spielserver verbunden hast, aktualisiere den ThirdPersonCharacter BP_-Blueprint, um den Eingabe-Mapping-Kontext für IMC_Default und IMC_MouseLook wie unten gezeigt hinzuzufügen:

Blueprint-Knoten, die zeigen, dass Event BeginPlay mit den Knoten „Cast To“ und „Add Mapping Context“ für IMC_Default PlayerController und IMC_ verbunden ist. MouseLook

Packen Sie Ihre Spielkomponenten

Um deine Spieleserver- und Spieleclient-Builds zu verpacken
  1. Öffne dein Spielprojekt in einer von der Quelle erstellten Version des Unreal Engine-Editors.

  2. Wenn du Unreal Engine 5.6 oder höher verwendest, gehe zu Bearbeiten, Projekteinstellungen, Paketieren. Suchen Sie im Inhaltsverzeichnis des Projekts nach Cook everything und aktivieren Sie es.

  3. Benutze den Editor, um deine Spielclient- und Server-Builds zu verpacken.

    1. Wähle ein Ziel. Gehen Sie zu Plattformen, Windows und wählen Sie eine der folgenden Optionen aus:

      • Server: [your-application-name]Server

      • Client: [your-application-name]Client

    2. Starten Sie den Build. Gehen Sie zu Plattform, Windows, Paketprojekt.

Jeder Paketiervorgang generiert eine ausführbare Datei: [your-application-name]Client.exe oder[your-application-name]Server.exe.

Legen Sie im Plugin die Pfade zu den ausführbaren Client- und Server-Build-Dateien auf Ihrer lokalen Workstation fest.