Plugin untuk Unreal: Siapkan pengujian lokal dengan Amazon GameLift Anywhere - Amazon GameLift

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Plugin untuk Unreal: Siapkan pengujian lokal dengan Amazon GameLift Anywhere

Dalam alur kerja ini, Anda menambahkan kode game klien dan server untuk GameLift fungsionalitas Amazon, dan menggunakan plugin untuk menunjuk workstation lokal Anda sebagai host server game uji. Ketika Anda telah menyelesaikan tugas integrasi, gunakan plugin untuk membangun klien game dan komponen server Anda.

Untuk memulai alur kerja Amazon GameLift Anywhere:
  • Di bilah alat utama editor Unreal, pilih GameLift menu Amazon, dan pilih Host with Anywhere. Tindakan ini membuka halaman plugin Deploy Anywhere, yang menyajikan proses enam langkah untuk mengintegrasikan, membangun, dan meluncurkan komponen game Anda.

Langkah 1: Atur profil Anda.

Pilih profil yang ingin Anda gunakan saat mengikuti alur kerja ini. Profil yang Anda pilih memengaruhi semua langkah dalam alur kerja. Semua sumber daya yang Anda buat dikaitkan dengan AWS akun profil dan ditempatkan di AWS Wilayah default profil. Izin pengguna profil menentukan akses Anda ke AWS sumber daya dan tindakan.

Untuk mengatur profil pengguna
  1. Pilih profil dari daftar dropdown profil yang tersedia. Jika Anda belum memiliki profil atau ingin membuat yang baru, buka GameLift menu Amazon dan pilih Set AWS User Profiles.

  2. Jika status bootstrap tidak “Aktif”, pilih profil Bootstrap dan tunggu statusnya berubah menjadi “Aktif”.

Langkah 2: Siapkan kode permainan Anda

Pada langkah ini, Anda membuat serangkaian pembaruan untuk klien dan kode server Anda untuk menambahkan fungsionalitas hosting. Jika Anda belum menyiapkan versi editor Unreal yang dibuat sumber, plugin menyediakan tautan ke instruksi dan kode sumber.

Dengan plugin, dapat mengambil keuntungan dari beberapa kemudahan saat mengintegrasikan kode permainan Anda. Anda dapat melakukan integrasi minimal untuk mengatur fungsionalitas hosting dasar. Anda juga dapat melakukan integrasi kustom yang lebih luas. Informasi di bagian ini menjelaskan opsi integrasi minimal. Gunakan peta pengujian yang disertakan dengan plugin untuk menambahkan GameLift fungsionalitas Amazon klien ke proyek game Anda. Untuk integrasi server, gunakan contoh kode yang disediakan untuk memperbarui mode permainan proyek Anda.

Integrasikan mode permainan server Anda

Tambahkan kode server ke game Anda yang memungkinkan komunikasi antara server game Anda dan GameLift layanan Amazon. Server game Anda harus dapat menanggapi permintaan dari Amazon GameLift, seperti memulai sesi permainan baru, dan juga melaporkan status kesehatan server game dan koneksi pemain.

Untuk menambahkan kode server untuk Amazon GameLift
  1. Di editor kode Anda, buka file solution (.sln) untuk proyek game Anda, biasanya ditemukan di folder root proyek. Sebagai contoh: GameLiftUnrealApp.sln.

  2. Dengan solusi terbuka, cari file header mode game proyek: [project-name]GameMode.h file. Sebagai contoh: GameLiftUnrealAppGameMode.h.

  3. Ubah file header agar sejajar dengan kode contoh berikut. Pastikan untuk mengganti "GameLiftServer" dengan nama proyek Anda sendiri. Pembaruan ini khusus untuk server game; kami menyarankan Anda membuat salinan cadangan dari file mode permainan asli untuk digunakan dengan klien Anda.

    // 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 "GameLiftServerGameMode.generated.h" struct FProcessParameters; DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All); UCLASS(minimalapi) class AGameLiftServerGameMode : public AGameModeBase { GENERATED_BODY() public: AGameLiftServerGameMode(); protected: virtual void BeginPlay() override; private: void InitGameLift(); private: TSharedPtr<FProcessParameters> ProcessParameters; };
  4. Buka file [project-name]GameMode.cpp file sumber terkait (misalnyaGameLiftUnrealAppGameMode.cpp). Ubah kode untuk menyelaraskan dengan kode contoh berikut. Pastikan untuk mengganti "GameLiftUnrealApp" dengan nama proyek Anda sendiri. Pembaruan ini khusus untuk server game; kami menyarankan Anda membuat salinan cadangan dari file asli untuk digunakan dengan klien Anda.

    Kode contoh berikut menunjukkan cara menambahkan elemen minimum yang diperlukan untuk integrasi server dengan Amazon GameLift:

    • Inisialisasi GameLift API klien Amazon. InitSDK()Panggilan dengan parameter server diperlukan untuk armada Amazon GameLift Anywhere. Saat Anda terhubung ke armada Anywhere, plugin menyimpan parameter server sebagai argumen konsol Kode sampel dapat mengakses nilai saat runtime.

    • Menerapkan fungsi panggilan balik yang diperlukan untuk menanggapi permintaan dari GameLift layanan Amazon, termasukOnStartGameSession,OnProcessTerminate, danonHealthCheck.

    • Panggil ProcessReady() dengan port yang ditunjuk untuk memberi tahu GameLift layanan Amazon saat siap menyelenggarakan sesi permainan.

    // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #include "GameLiftServerGameMode.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); AGameLiftServerGameMode::AGameLiftServerGameMode() : 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 AGameLiftServerGameMode...")); } void AGameLiftServerGameMode::BeginPlay() { Super::BeginPlay(); #if WITH_GAMELIFT InitGameLift(); #endif } void AGameLiftServerGameMode::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. ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8( *FText::Format( FText::FromString("ProcessId_{0}"), FText::AsNumber(std::time(nullptr)) ).ToString() ); } 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); } 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, 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, GameLift 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. GameLift 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 GameLift we are indeed going to shutdown. ProcessParameters->OnTerminate.BindLambda([=]() { UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating")); GameLiftSdkModule->ProcessEnding(); }); //This is the HealthCheck callback. //GameLift 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. GameLift 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 GameLift where to find game session log files. //At the end of a game session, GameLift uploads everything in the specified //location and stores it in the cloud for access later. TArray<FString> Logfiles; Logfiles.Add(TEXT("GameServerLog/Saved/Logs/GameServerLog.log")); ProcessParameters->logParameters = Logfiles; //The game server calls ProcessReady() to tell GameLift 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 }

Integrasikan peta permainan klien Anda

Peta game startup berisi logika cetak biru dan elemen UI yang sudah menyertakan kode dasar untuk meminta sesi game dan menggunakan informasi koneksi untuk terhubung ke sesi game. Anda dapat menggunakan peta apa adanya atau memodifikasinya sesuai kebutuhan. Gunakan peta game startup dengan aset game lainnya, seperti proyek template Orang Ketiga yang disediakan oleh Unreal Engine. Aset ini tersedia di Browser Konten. Anda dapat menggunakannya untuk menguji alur kerja penerapan plugin, atau sebagai panduan untuk membuat layanan backend khusus untuk game Anda.

Peta startup memiliki karakteristik sebagai berikut:

  • Ini mencakup logika untuk armada Anywhere dan EC2 armada yang dikelola. Ketika Anda menjalankan klien Anda, Anda dapat memilih untuk terhubung ke salah satu armada.

  • Fungsionalitas klien termasuk menemukan sesi permainan (SearchGameSessions()), membuat sesi permainan baru (CreateGameSession()), dan bergabung dengan sesi permainan secara langsung.

  • Ini mendapat ID pemain unik dari kumpulan pengguna Amazon Cognito proyek Anda (ini adalah bagian dari solusi Anywhere yang diterapkan).

Untuk menggunakan peta game startup
  1. Di editor UE, buka halaman Pengaturan Proyek, Peta & Mode, dan perluas bagian Peta Default.

  2. Untuk Editor Startup Map, pilih "StartupMap" dari daftar dropdown. Anda mungkin perlu mencari file, yang terletak di... > Unreal Projects/[project-name]/Plugins/Amazon GameLift Plugin Content/Maps.

  3. Untuk Peta Default Game, pilih "StartupMap" yang sama dari daftar dropdown.

  4. Untuk Peta Default Server, pilih "ThirdPersonMap”. Ini adalah peta default yang disertakan dalam proyek game Anda. Peta ini dirancang untuk dua pemain dalam game.

  5. Buka panel detail untuk peta default server. Setel GameMode Override ke “None”.

  6. Perluas bagian Mode Default, dan atur Mode Game Server Default Global ke mode permainan yang Anda perbarui untuk integrasi server Anda.

Setelah Anda membuat perubahan ini pada proyek Anda, Anda siap untuk membangun komponen game Anda.

Package komponen game Anda

Untuk mengemas server game dan build klien game
  1. Buat file target server dan klien baru

    1. Di folder proyek game Anda, buka folder Sumber dan temukan Target.cs file.

    2. Salin file [project-name]Editor.Target.cs ke dua file baru bernama [project-name]Client.Target.cs dan[project-name]Server.Target.cs.

    3. Edit setiap file baru untuk memperbarui nama kelas dan nilai tipe target, seperti yang ditunjukkan:

    UnrealProjects > MyGame > Source > MyGameClient.Target.cs // Copyright Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; using System.Collections.Generic; public class MyGameClientTarget : TargetRules { public MyGameClientTarget(TargetInfo Target) : base(Target) { Type = TargetType.Client; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add("MyGame"); } }
    UnrealProjects > MyGame > Source > MyGameServer.Target.cs // Copyright Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; using System.Collections.Generic; public class MyGameServerTarget : TargetRules { public MyGameServerTarget(TargetInfo Target) : base(Target) { Type = TargetType.Server; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add("MyGame"); } }
  2. Perbarui .Build.cs file.

    1. Buka .Build.cs file untuk proyek Anda. File ini terletak di UnrealProjects/[project name]/Source/[project name]/[project name].Build.cs.

    2. Perbarui ModuleRules kelas seperti yang ditunjukkan pada contoh kode berikut.

      public class MyGame : ModuleRules { public GameLiftUnrealApp(TargetInfo Target) { PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); bEnableExceptions = true; if (Target.Type == TargetRules.TargetType.Server) { PublicDependencyModuleNames.AddRange(new string[] { "GameLiftServerSDK" }); PublicDefinitions.Add("WITH_GAMELIFT=1"); } else { PublicDefinitions.Add("WITH_GAMELIFT=0"); } } }
  3. Membangun kembali solusi proyek game Anda.

  4. Buka proyek game Anda dalam versi editor Unreal Engine yang dibuat sumber.

  5. Lakukan hal berikut untuk klien dan server Anda:

    1. Pilih target. Buka Platform, Windows dan pilih salah satu dari yang berikut ini:

      • Server: [your-application-name]Server

      • Klien: [your-application-name]Client

    2. Mulai membangun. Buka Platform, Windows, Package Project.

Setiap proses pengemasan menghasilkan executable: [your-application-name]Client.exe atau. [your-application-name]Server.exe

Di plugin, atur jalur ke klien dan server build executable di workstation lokal Anda.

Langkah 3: Connect ke armada Anywhere

Pada langkah ini, Anda menunjuk armada Anywhere untuk digunakan. Armada Anywhere mendefinisikan kumpulan sumber daya komputasi, yang dapat ditemukan di mana saja, untuk hosting server game.

  • Jika AWS akun yang saat ini Anda gunakan memiliki armada Anywhere yang sudah ada, buka bidang tarik-turun nama Armada dan pilih armada. Dropdown ini hanya menampilkan armada Anywhere di AWS Region untuk profil pengguna yang sedang aktif.

  • Jika tidak ada armada yang ada—atau Anda ingin membuat armada baru, pilih Create new Anywhere fleet dan berikan nama armada.

Setelah Anda memilih armada Anywhere untuk proyek Anda, Amazon GameLift memverifikasi bahwa status armada adalah iklan aktif menampilkan ID armada. Anda dapat melacak kemajuan permintaan ini di log keluaran editor Unreal.

Langkah 4: Daftarkan workstation Anda

Pada langkah ini, Anda mendaftarkan workstation lokal Anda sebagai sumber daya komputasi di armada Anywhere yang baru.

Untuk mendaftarkan workstation Anda sebagai komputasi Anywhere
  1. Masukkan nama komputasi untuk mesin lokal Anda. Jika Anda menambahkan lebih dari satu komputasi dalam armada, nama harus unik.

  2. Berikan alamat IP untuk mesin lokal Anda. Bidang ini default ke alamat IP publik mesin Anda. Anda juga dapat menggunakan localhost (127.0.0.1) selama Anda menjalankan klien dan server game Anda di mesin yang sama.

  3. Pilih Daftarkan komputasi. Anda dapat melacak kemajuan permintaan ini di log keluaran editor Unreal.

Menanggapi tindakan ini, Amazon GameLift memverifikasi bahwa ia dapat terhubung ke komputasi dan mengembalikan informasi tentang komputasi yang baru terdaftar. Ini juga menciptakan argumen konsol yang dibutuhkan executable game Anda saat menginisialisasi komunikasi dengan layanan Amazon. GameLift

Langkah 5: Hasilkan token autentikasi

Proses server game yang berjalan pada komputasi Anywhere Anda memerlukan token otentikasi untuk melakukan panggilan ke layanan. GameLift Plugin secara otomatis menghasilkan dan menyimpan token autentikasi untuk armada Anywhere setiap kali Anda meluncurkan server game dari plugin. Nilai token autentikasi disimpan sebagai argumen baris perintah, yang dapat diambil oleh kode server Anda saat runtime.

Anda tidak perlu mengambil tindakan apa pun dalam langkah ini.

Langkah 6: Luncurkan game

Pada titik ini, Anda telah menyelesaikan semua tugas yang diperlukan untuk meluncurkan dan memainkan game multipemain Anda di workstation lokal menggunakan Amazon. GameLift

Untuk memainkan game yang Anda host
  1. Luncurkan server game Anda. Server game akan memberi tahu Amazon GameLift ketika siap untuk menyelenggarakan sesi game.

  2. Luncurkan klien game Anda dan gunakan fungsionalitas baru untuk memulai sesi permainan baru. Permintaan ini dikirim ke Amazon GameLift melalui layanan backend baru. Sebagai tanggapan, Amazon GameLift, memanggil server game, berjalan di mesin lokal Anda, untuk memulai sesi permainan baru. Ketika sesi permainan siap menerima pemain, Amazon GameLift menyediakan informasi koneksi untuk klien game untuk bergabung dengan sesi permainan.