

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon GameLift Servers 플러그인으로 Unreal 또는 Unity 게임 준비
<a name="getting-started-plugin"></a>

Amazon GameLift Servers 플러그인은 Unreal 또는 Unity 게임 엔진에 대한 모든 기능을 갖춘 추가 기능입니다. Amazon GameLift Servers로 호스팅용 게임을 배포하기 위한 기본 단계를 안내합니다. 플러그인 도구 세트와 워크플로를 사용하면 게임 엔진 개발 환경에서 작업하여 게임 서버 호스팅을 준비하고, 테스트를 위해 로컬 머신에서 호스팅을 설정하며, 간단한 백엔드 서비스를 생성하고, 관리형 클라우드 기반 호스팅에 게임 서버를 배포할 수 있습니다.

플러그인을 사용하여 Amazon GameLift Servers 작업을 이해하고 게임 호스팅 솔루션을 빠르게 시작 및 실행할 수 있습니다. 샘플 게임 자산 또는 자체 게임 프로젝트로 작업할 수 있습니다. 플러그인은 간단한 작업 솔루션을 빠르게 구축할 수 있도록 여러 단계를 자동화합니다. 플러그인의 안내 워크플로를 완료하면 Amazon GameLift Servers를 통해 게임 클라이언트를 라이브 호스팅 게임 세션에 연결할 수 있습니다. 플러그인을 사용하여 간단한 호스팅 솔루션을 생성한 후 게임의 요구 사항에 맞게 솔루션을 사용자 지정할 수 있습니다.

플러그인은 다음 게임 엔진에 사용할 수 있습니다.
+ Unreal Engine
+ Unity

플러그인에는 각 게임 엔진에 대한 다음과 같은 구성 요소가 포함되어 있습니다.
+ 게임 엔진 편집기용 플러그인 모듈. 플러그인이 설치되면 새 기본 메뉴 버튼을 통해 Amazon GameLift Servers 기능에 액세스할 수 있습니다.
+ 클라이언트 측 기능을 갖춘 Amazon GameLift Servers 서비스 API용 라이브러리.
+ Amazon GameLift Servers 서버 SDK(버전 5)용 라이브러리.
+ 서버 통합 테스트에 사용할 샘플 자산
+ 게임 서버 솔루션을 정의하는 CloudFormation 템플릿 형태의 편집 가능한 구성입니다.

**Topics**
+ [플러그인 워크플로](#getting-started-plugin-workflow)
+ [Unreal Engine용 Amazon GameLift Servers 플러그인](unreal-plugin.md)
+ [Amazon GameLift Servers Unity용 플러그인(서버 SDK 5.x)](unity-plug-in.md)
+ [Unity용 Amazon GameLift Servers 플러그인(서버 SDK 4.x)](unity-plug-in-sdk4.md)

## 플러그인 워크플로
<a name="getting-started-plugin-workflow"></a>

다음 단계에서는 Amazon GameLift Servers에서 게임 프로젝트를 준비하고 배포하는 일반적인 경로를 설명합니다. 게임 엔진 편집기와 게임 코드에서 작업하여 이 단계를 완료합니다.

1.  AWS 계정 사용자에 연결하고 액세스 자격 증명에 사용 권한을 제공하는 사용자 프로필을 생성합니다Amazon GameLift Servers.

1. 플러그인이 호스팅 솔루션에서 사용하는 관련 AWS 리소스를 설정합니다("부트스트래핑"이라고 함).

1. 프로젝트에 서버 코드를 추가하여 실행 중인 게임 서버와 Amazon GameLift Servers 서비스 간의 통신을 설정합니다.

1. 프로젝트에 클라이언트 코드를 추가하면 게임 클라이언트가 Amazon GameLift Servers에 요청을 보내 새 게임 세션을 시작한 다음 해당 세션에 연결할 수 있습니다.

1. Anywhere 워크플로를 사용하여 로컬 워크스테이션을 게임 서버의 Anywhere 컴퓨팅으로 설정하고 게임 서버를 호스트합니다. 플러그인을 통해 게임 서버와 클라이언트를 로컬로 시작하고, 게임 세션에 연결하며 통합을 테스트합니다.

1. 관리형 EC2 워크플로를 사용하여 게임 서버를 Amazon GameLift Servers에 업로드하고 단순하지만 완전한 클라우드 호스팅 솔루션을 배포합니다. 플러그인을 통해 게임 서버와 클라이언트를 로컬로 시작하고, 게임 세션을 요청해 연결한 후 게임을 실행합니다.

플러그인에서 작업할 때 AWS 리소스를 생성하고 사용합니다. 이러한 작업에는 사용 중인 AWS 계정에 요금이 발생할 수 있습니다. 를 처음 사용하는 경우 AWS이러한 작업은 [AWS 프리 티](https://aws.amazon.com/free/)어에 포함될 수 있습니다.

# Unreal Engine용 Amazon GameLift Servers 플러그인
<a name="unreal-plugin"></a>

이 플러그인은 Amazon GameLift Servers C\$1\$1 Server SDK 및 도구를 UE 편집기에 추가합니다. 안내 UI 워크플로를 사용하여 서버 SDK 기능을 게임 프로젝트에 통합하고 게임 서버에 Amazon GameLift Servers 호스팅 솔루션을 배포합니다.

플러그인 기능을 사용하면 기본 작업 호스팅 솔루션을 빌드한 다음 필요에 따라 최적화하고 사용자 지정할 수 있습니다. 로컬 워크스테이션을 호스트로 사용하여 Amazon GameLift Servers Anywhere 플릿을 설정합니다. 관리형 EC2 또는 관리형 컨테이너 플릿을 사용한 클라우드 호스팅의 경우 게임 세션 요청 및 클라이언트 연결을 관리할 수 있는 완전한 솔루션으로 게임 서버를 배포합니다.

**Topics**
+ [Unreal 게임 프로젝트에 대한 플러그인 설치](#unreal-plugin-install)
+ [다음 단계: 게임 호스팅 솔루션 사용자 지정](#unreal-plugin-next-steps)
+ [Unreal용 플러그인: AWS 사용자 프로필 설정](unreal-plugin-profiles.md)
+ [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md)
+ [Unreal용 플러그인: Amazon GameLift Servers Anywhere를 사용하여 로컬에서 게임 호스팅](unreal-plugin-anywhere.md)
+ [Unreal용 플러그인: 관리형 EC2 플릿에 게임 배포](unreal-plugin-ec2.md)
+ [Unreal용 플러그인: 관리형 컨테이너 플릿에 게임 배포](unreal-plugin-container.md)

## Unreal 게임 프로젝트에 대한 플러그인 설치
<a name="unreal-plugin-install"></a>

**[GitHub에서 Unreal Engine용 Amazon GameLift Servers 플러그인 가져오기](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)**

게임 프로젝트의 Unreal Editor에 플러그인을 설치하는 방법에 대한 자세한 내용은 GitHub 리포지토리 Readme 파일을 참조하세요.

플러그인에는 다음과 같은 구성 요소가 포함됩니다.
+ UE 편집기용 플러그인 모듈. 플러그인이 설치되면 새 기본 메뉴 버튼을 통해 Amazon GameLift Servers 기능에 액세스할 수 있습니다.
+ Amazon GameLift Servers 서비스 API용 C\$1\$1 라이브러리입니다. 클라이언트 측 백엔드 서비스에서 API 기능을 사용하면 게임 클라이언트가 게임 세션을 요청하고 게임 세션 정보를 전송/검색하는 데 도움이 됩니다.
+ Amazon GameLift Servers Server SDK(버전 5)용 Unreal 라이브러리. 게임 서버 코드에서 서버 SDK를 사용하여 호스팅된 게임 서버 프로세스와 Amazon GameLift Servers 서비스 간의 통신을 관리합니다.
+ 서버 통합 테스트에 사용할 기본 블루프린트와 UI 요소가 포함된 스타트업 게임 맵과 테스트 맵 2개를 포함한 테스트용 콘텐츠.
+ 플러그인이 호스팅을 위해 게임 서버를 배포할 때 사용하는 CloudFormation 템플릿 형태의 편집 가능한 구성입니다.

이 플러그인은 AWS CloudFormation 템플릿을 사용하여 일반적인 게임 시나리오를 위한 호스팅 솔루션을 배포합니다. 이러한 솔루션은 제공된 대로 사용하거나 게임에 필요한 대로 사용자 지정합니다.

## 다음 단계: 게임 호스팅 솔루션 사용자 지정
<a name="unreal-plugin-next-steps"></a>

플러그인의 안내 워크플로를 사용하면 Amazon GameLift Servers 호스팅 솔루션을 빠르게 시작하고 실행할 수 있습니다. 플러그인을 사용하면 각 솔루션 구성 요소의 기본 버전을 설정할 수 있습니다.

준비가 되면 각 구성 요소를 사용자 지정하고 게임 시작을 준비할 때 솔루션을 미세 조정하여 이 기본 솔루션을 구축할 수 있습니다. 다음 옵션을 고려하세요.
+ 플릿 및 플릿 구성을 수정합니다. [리소스 사용자 지정 호스팅](fleets-design.md)을(를) 참조하세요.
+ 게임 세션 대기열 구성을 사용자 지정합니다. [게임 세션 대기열 사용자 지정](queues-design.md)을(를) 참조하세요.
+ 게임 서버 및 게임 클라이언트에 기능을 추가합니다. [Amazon GameLift Servers와 게임 서버 통합](gamelift-sdk-server.md) 및 [Amazon GameLift Servers 게임 클라이언트 기능 통합](gamelift-sdk-client-api.md) 섹션을 참조하세요.
+ 백엔드 서비스를 사용자 지정합니다. [Amazon GameLift Servers에 대한 백엔드 서비스 구축](gamelift_quickstart_customservers_designbackend.md)을(를) 참조하세요.
+ 예상 플레이어 수요에 맞게 자동 용량 조정을 설정합니다. [Amazon GameLift Servers를 사용하여 게임 호스팅 용량 확장](fleets-manage-capacity.md)을(를) 참조하세요.
+ 분석 및 로깅을 포함한 호스팅 관찰성 도구를 설정합니다. [Amazon GameLift Servers 모니터링](monitoring-overview.md)을(를) 참조하세요.
+ [코드형 인프라(IaC)](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)를 사용하여 배포를 자동화합니다. 관리형 솔루션에 대한 플러그인의 안내 워크플로는 AWS CloudFormation 템플릿을 사용합니다. 필요에 따라 이를 사용자 지정할 수 있습니다. [를 사용하여 Amazon GameLift Servers 호스팅 리소스 관리 CloudFormation](resources-cloudformation.md)을(를) 참조하세요.

**Topics**
+ [Unreal 게임 프로젝트에 대한 플러그인 설치](#unreal-plugin-install)
+ [다음 단계: 게임 호스팅 솔루션 사용자 지정](#unreal-plugin-next-steps)
+ [Unreal용 플러그인: AWS 사용자 프로필 설정](unreal-plugin-profiles.md)
+ [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md)
+ [Unreal용 플러그인: Amazon GameLift Servers Anywhere를 사용하여 로컬에서 게임 호스팅](unreal-plugin-anywhere.md)
+ [Unreal용 플러그인: 관리형 EC2 플릿에 게임 배포](unreal-plugin-ec2.md)
+ [Unreal용 플러그인: 관리형 컨테이너 플릿에 게임 배포](unreal-plugin-container.md)

# Unreal용 플러그인: AWS 사용자 프로필 설정
<a name="unreal-plugin-profiles"></a>

플러그인을 설치한 후 유효한 AWS 계정으로 사용자 프로필을 설정합니다. 프로필을 여러 개 유지할 수 있지만 한 번에 한 프로필만 선택할 수 있습니다. 플러그인에서 작업할 때마다 사용할 프로필을 선택합니다. 각 워크플로 페이지에는 현재 선택한 프로필이 표시됩니다.

프로필을 여러 개 유지하면 서로 다른 호스팅 배포 간에 전환할 수 있습니다. 예를 들어 동일한 AWS 계정을 사용하지만 다른 AWS 리전에 배포하는 프로필을 설정할 수 있습니다. 또는 다른 AWS 계정 또는 사용자 및 권한 세트로 프로필을 설정할 수 있습니다.

**참고**  
워크스테이션에 AWS CLI를 설치하고 프로필이 이미 구성된 경우 Amazon GameLift Servers 플러그인이 CLI를 감지하여 기존 프로필로 나열합니다. 플러그인은 `[default]` 이름이 지정된 프로필을 자동으로 선택합니다. 기존의 데이터 세트를 사용하거나 새 프로필을 생성할 수 있습니다.

계정 사용자 아래에 일부 필수 AWS 리소스를 설정하려면 모든 프로필을 부트스트래핑해야 합니다.

**AWS 프로필을 관리하려면**

1. Unreal 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **AWS 자격 증명 액세스**를 선택합니다. 이 작업을 수행하면 **사용자 프로필 설정** 페이지에 대한 Amazon GameLift Servers 플러그인이 열립니다.

1. 버튼을 사용하여 새 AWS 계정을 생성하거나 이미 보유한 AWS 계정에 대한 사용자 프로필을 설정합니다.

1. 사용자 프로필이 아직 없는 경우 프로필 세부 정보를 입력하고 새 프로필을 생성하라는 메시지가 표시됩니다. 다음 정보를 제공합니다.
   +  AWS 계정. 새 AWS 계정을 생성하는 경우에 대한 링크를 사용하고 프롬프트를 AWS Management Console 따릅니다. 자세한 내용은 [AWS 계정 생성](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html)을 참조하세요.
   + Amazon GameLift Servers 및 기타 필수 AWS 서비스를 사용할 권한이 있는 AWS 사용자입니다. 장기 자격 증명을 사용하여 Amazon GameLift Servers 권한 및 프로그래밍 방식으로 액세스할 수 있는 AWS Identity and Access Management (IAM) 사용자를 설정하는 방법에 [AWS 사용자 계정 설정](setting-up-aws-login.md) 대한 지침은 섹션을 참조하세요.
   +  AWS 사용자에 대한 자격 증명입니다. 이러한 자격 증명은 AWS 액세스 키 ID와 AWS 보안 키로 구성됩니다. 자세한 내용은 [액세스 키 가져오기](https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html#cli-authentication-user-get)를 참조하세요.
   + AWS region. 이는 호스팅용 AWS 리소스를 생성하려는 지리적 위치입니다. 개발 중에는 실제 위치와 가까운 리전을 사용하는 것이 좋습니다. [ 지원되는 리전 목록에서 AWS 리전](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)을 선택합니다.

1. 플러그인이 기존 프로필을 감지하면 사용 가능한 프로필 목록이 표시됩니다. 목록에서 기존 프로필을 선택하거나 **다른 프로필 추가**를 선택하여 새 프로필을 생성합니다.

## 사용자 프로필 부트스트랩
<a name="unreal-plugin-profiles-bootstrap"></a>

Amazon GameLift Servers 플러그인과 함께 사용하려면 모든 프로필을 부트스트랩해야 합니다. 부트스트래핑은 프로필과 관련된 Amazon S3 버킷을 생성합니다. 프로젝트 구성, 빌드 아티팩트 및 기타 종속성을 저장하는 데 사용됩니다. 버킷은 다른 프로필 간에 공유되지 않습니다.

부트스트래핑에는 새 AWS 리소스 생성이 포함되며 비용이 발생할 수 있습니다.

**프로필을 부트스트랩하려면**

1. **AWS 액세스 자격 증명** 페이지에서 사용하려는 사용자 프로필의 부트스트랩 상태를 확인합니다. 프로필의 부트스트랩 상태가 ‘비활성’이고 나열된 S3 버킷이 없는 경우 프로필을 부트스트랩해야 합니다.

1. 사용할 프로필을 선택하고 **프로필 부트스트랩**을 선택합니다.

1. 부트스트랩 상태가 “활성”으로 변경될 때까지 기다립니다. 몇 분 정도 소요될 수 있습니다.

# Unreal용 플러그인: 게임 코드 통합
<a name="unreal-plugin-integrate"></a>

게임 서버를 플릿에 배포하려면 먼저 Amazon GameLift Servers 서비스와 함께 사용할 게임 코드 및 패키지 게임 구성 요소에 대한 일련의 업데이트를 수행해야 합니다.

이 주제에서는 최소한의 통합을 수행하는 단계를 안내합니다. 서버 통합의 경우 제공된 코드 샘플을 사용하여 프로젝트의 게임 모드를 업데이트합니다.
+ [빌드 대상 및 모듈 규칙 설정](#unreal-plugin-anywhere-integrate-setup)
+ [게임 서버 코드 업데이트](#unreal-plugin-anywhere-integrate-simple-server)
+ [클라이언트 게임 맵 통합](#unreal-plugin-anywhere-integrate-simple-client)
+ [게임 구성 요소 패키징](#unreal-plugin-anywhere-integrate-build)

## 빌드 대상 및 모듈 규칙 설정
<a name="unreal-plugin-anywhere-integrate-setup"></a>

게임 프로젝트 파일을 수정하여 Amazon GameLift Servers에 사용할 빌드 구성 요소를 올바르게 생성합니다.

**클라이언트 및 서버 빌드 대상을 추가하려면:**

1. 게임 프로젝트의 코드 파일을 열고 `.../Games/[your application name]Source/[your application name]Target.cs` 파일을 찾습니다. 예시: `.../Source/GameLiftUnrealAppTarget.cs`. (Visual Studio를 사용하는 경우 프로젝트의 `.sln` 파일을 엽니다.)

1. 이 파일을 복사하여 `Source/` 디렉터리에 두 개의 새 대상 파일을 생성합니다.
   + 클라이언트 대상 - 새 파일의 이름을 `[your application name]Client.Target.cs`로 변경합니다. 다음 샘플 코드에 설명한 대로 콘텐츠를 편집하여 클래스 이름과 대상 유형 값을 업데이트합니다.

     ```
     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");
          }
      }
     ```
   + 서버 대상 - 새 파일의 이름을 `[your application name]Server.Target.cs`로 변경합니다. 다음 샘플 코드에 설명한 대로 콘텐츠를 편집하여 클래스 이름과 대상 유형 값을 업데이트합니다.

     ```
     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");
          }
      }
     ```

1. 프로젝트 파일을 다시 생성합니다. Visual Studio를 사용하는 경우 게임 프로젝트의 `.uproject` 파일을 마우스 오른쪽 버튼으로 클릭하고 **Visual Studio 프로젝트 파일 생성**을 선택할 수 있습니다.

**게임 프로젝트 모듈 규칙을 업데이트하려면:**

플러그인에 종속되도록 게임 프로젝트의 모듈 규칙을 업데이트합니다.

1. 게임 프로젝트의 코드 파일을 열고 `.../Games/[your application name]Source/[your application name].Build.cs` 파일을 찾습니다. 예시: `.../Source/GameLiftUnrealApp.Build.cs`. (Visual Studio를 사용하는 경우 프로젝트의 `.sln` 파일을 엽니다.)

1. `ModuleRules` 클래스를 찾고 다음 샘플 코드에 표시된 대로 업데이트합니다.

   ```
   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;
        }
    }
   ```

1. 새 대상 파일을 생성하고 모듈 규칙을 수정한 후 게임 프로젝트를 다시 빌드합니다.

## 게임 서버 코드 업데이트
<a name="unreal-plugin-anywhere-integrate-simple-server"></a>

게임 서버 코드를 업데이트하여 게임 서버 프로세스와 Amazon GameLift Servers 서비스 간에 통신할 수 있습니다. 게임 서버는 새 게임 세션을 시작하고 중지하는 등 Amazon GameLift Servers의 요청에 응답할 수 있어야 합니다.

**Amazon GameLift Servers에 대한 서버 코드를 추가하려면**

1. 코드 편집기에서 일반적으로 프로젝트 루트 폴더에 있는 게임 프로젝트의 솔루션(`.sln`) 파일을 엽니다. 예를 들어 `GameLiftUnrealApp.sln`입니다.

1. 솔루션이 열린 상태에서 프로젝트 게임 모드 헤더 파일인 `[project-name]GameMode.h` 파일을 찾습니다. 예를 들어 `GameLiftUnrealAppGameMode.h`입니다.

1. 헤더 파일을 다음 코드에 맞게 변경합니다. 반드시 ‘GameLiftServer’을 사용자 고유의 프로젝트 이름으로 변경해야 합니다. 이러한 업데이트는 게임 서버에만 적용되므로 클라이언트에서 사용할 수 있도록 원본 게임 모드 파일의 백업 복사본을 만드는 것이 좋습니다.

### gameMode.h 코드 예제
<a name="w2aab9c11b9c19c27c11b7b1"></a>

```
// 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;
};
```
+ 관련 소스 파일인 `[project-name]GameMode.cpp` 파일(예: `GameLiftUnrealAppGameMode.cpp`)을 엽니다. 코드를 다음 예제 코드에 맞게 변경합니다. 반드시 “GameLiftUnrealApp”을 사용자 고유의 프로젝트 이름으로 변경해야 합니다. 이러한 업데이트는 게임 서버에만 적용되므로 클라이언트에서 사용할 수 있도록 원본 파일의 백업 복사본을 만드는 것이 좋습니다.

  다음 예제 코드는 Amazon GameLift Servers와 서버 통합에 필요한 최소 요소를 추가하는 방법을 보여 줍니다.
  + Amazon GameLift Servers API 클라이언트를 초기화합니다. Amazon GameLift Servers Anywhere 플릿에는 서버 파라미터를 사용한 `InitSDK()` 호출이 필요합니다. Anywhere 플릿에 연결하면 플러그인은 서버 파라미터를 콘솔 인수로 저장합니다. 샘플 코드는 런타임 시 값에 액세스할 수 있습니다.
  + `OnStartGameSession`, `OnProcessTerminate`, `onHealthCheck`를 포함한 Amazon GameLift Servers 서비스의 요청에 응답하는 필수 콜백 함수를 구현합니다.
  + 지정된 포트와 함께 `ProcessReady()`를 호출하여 게임 세션을 호스팅할 준비가 되면 Amazon GameLift Servers 서비스에 알립니다.

### 게임 서버 코드 예제
<a name="w2aab9c11b9c19c27c11c11b1"></a>

```
// 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
}
```

## 클라이언트 게임 맵 통합
<a name="unreal-plugin-anywhere-integrate-simple-client"></a>

스타트업 게임 맵에는 게임 세션을 요청하고 연결 정보를 사용하여 게임 세션에 연결하는 기본 코드가 이미 포함되어 있는 블루프린트 로직과 UI 요소가 포함되어 있습니다. 맵을 그대로 사용하거나 필요에 따라 수정할 수 있습니다. 스타트업 게임 맵을 다른 게임 애셋(예: Unreal Engine에서 제공하는 3인칭 템플릿 프로젝트)과 함께 사용합니다. 이러한 애셋은 콘텐츠 브라우저에서 사용할 수 있습니다. 이를 사용하여 플러그인의 배포 워크플로를 테스트하거나 게임에 맞는 사용자 지정 백엔드 서비스를 만들기 위한 가이드로 사용할 수 있습니다.

스타트업 맵에는 다음과 같은 특성이 있습니다.
+ 여기에는 Anywhere 플릿과 관리형 EC2 플릿 모두에 대한 로직이 포함됩니다. 클라이언트를 실행할 때 두 플릿 중 하나에 연결하도록 선택할 수 있습니다.
+ 클라이언트 기능에는 게임 세션 찾기(`SearchGameSessions()`), 새 게임 세션 생성(`CreateGameSession()`), 게임 세션에 직접 참여 등이 포함됩니다.
+ 프로젝트의 Amazon Cognito 사용자 풀(배포된 Anywhere 솔루션의 일부)에서 고유한 플레이어 ID를 가져옵니다.

**스타트업 게임 맵을 사용하려면**

1. UE 편집기에서 **프로젝트 설정, 맵 및 모드** 페이지를 열고 **기본 맵** 섹션을 확장합니다.

1. **편집기 스타트업 맵**의 경우 드롭다운 목록에서 ‘StartupMap’을 선택합니다. `... > Unreal Projects/[project-name]/Plugins/Amazon GameLift Servers Plugin Content/Maps`에 있는 파일을 검색해야 할 수도 있습니다.

1. **게임 기본 맵**의 경우 드롭다운 목록에서 동일한 ‘StartupMap’을 선택합니다.

1. **서버 기본 맵**에서 Unreal Engine 5.6 이상의 경우 "Lv1\$1ThirdPerson"을 선택하고 이전 버전의 경우 "ThirdPersonMap"을 선택합니다. 이는 게임 프로젝트에 포함된 기본 맵입니다. 이 맵은 게임에 참여하는 두 명의 플레이어를 위해 설계되었습니다.

1. 서버 기본 맵의 세부 정보 패널을 엽니다. **GameMode 재정의**를 ‘없음’으로 설정합니다.

1. **기본 모드** 섹션을 확장하고 **전역 기본 서버 게임 모드**를 서버 통합을 위해 업데이트한 게임 모드로 설정합니다.

프로젝트를 이렇게 변경했으면 게임 구성 요소를 빌드할 준비가 된 것입니다.

**참고**  
Unreal Engine 5.6 이상의 경우 게임 서버에 연결한 후 캐릭터를 이동할 수 없는 경우 아래와 `IMC_MouseLook` 같이 BP\$1ThirdPersonCharacter 블루프린트를 업데이트하여 `IMC_Default` 및에 대한 입력 매핑 컨텍스트를 추가합니다.  

![\[alt text not found\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unreal-enhanced-input-blueprint.png)


## 게임 구성 요소 패키징
<a name="unreal-plugin-anywhere-integrate-build"></a>

**게임 서버 및 게임 클라이언트 빌드를 패키징하려면**

1. Unreal Engine 편집기의 소스 빌드 버전에서 게임 프로젝트를 엽니다.

1. Unreal Engine 5.6 이상을 사용하는 경우 **편집, 프로젝트 설정, 패키징**으로 이동합니다. **프로젝트 콘텐츠 디렉터리에서 모든 Cook을** 찾아 활성화합니다.

1. 편집기를 사용하여 게임 클라이언트 및 서버 빌드를 패키징합니다.

   1. 대상을 선택합니다. **플랫폼, Windows**로 이동하여 다음 중 하나를 선택합니다.
      + 서버: `[your-application-name]Server`
      + 클라이언트: `[your-application-name]Client`

   1. 빌드를 시작합니다. **플랫폼, Windows, 패키지 프로젝트**로 이동합니다.

각 패키징 프로세스는 실행 파일(`[your-application-name]Client.exe` 또는 `[your-application-name]Server.exe`)을 생성합니다.

플러그인에서 로컬 워크스테이션에 있는 클라이언트 및 서버 빌드 실행 파일의 경로를 설정합니다.

# Unreal용 플러그인: Amazon GameLift Servers Anywhere를 사용하여 로컬에서 게임 호스팅
<a name="unreal-plugin-anywhere"></a>

Anywhere 플릿을 사용하여 로컬 워크스테이션을 게임 서버 호스트로 설정하기 위해 이 워크플로를 사용합니다. 클라우드 기반 관리형 플릿에 배포하기 전에 이를 사용하여 게임 서버 통합을 테스트할 수 있습니다. 반복 게임 개발 중 로컬 테스트에 유용할 수도 있습니다.

**Amazon GameLift Servers Anywhere 워크플로를 시작하려면:**
+ Unreal 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **Anywhere와 호스트**를 선택합니다. 이 작업을 수행하면 **Anywhere 배포** 플러그인 페이지가 열리고 게임 구성 요소를 통합, 빌드 및 시작하는 6단계 프로세스를 제공합니다.

## 1단계: 프로필 설정
<a name="unreal-plugin-anywhere-profile"></a>

이 워크플로를 따를 때 사용할 프로필을 선택합니다. 선택한 프로필은 워크플로의 모든 단계에 영향을 줍니다. 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

**사용자 프로필을 설정하려면**

1. 사용 가능한 프로필 드롭다운 목록에서 프로필을 선택합니다. 아직 프로필이 없거나 새 프로필을 생성하려는 경우 **Amazon GameLift** 메뉴로 이동하여 ** AWS 사용자 프로필 설정**을 선택합니다.

1. 부트스트랩 상태가 ‘활성’이 아닌 경우, **프로필 부트스트랩**을 선택하고 상태가 ‘활성’으로 변경될 때까지 기다립니다.

## 2단계: 게임 코드 설정
<a name="unreal-plugin-anywhere-integrate"></a>

이 단계에서는 Amazon GameLift Servers와 함께 작동하도록 게임 서버 및 게임 클라이언트 빌드를 준비합니다. 게임 코드를 아직 통합하지 않은 경우 [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md) 섹션을 참조하세요. 로컬 워크스테이션에서 게임 실행 파일의 경로를 입력합니다.
+ 게임 서버: 게임 서버를 Amazon GameLift Servers용 서버 SDK와 통합하고 게임 서버 빌드를 패키징합니다. 지침은 [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md) 섹션을 참조하세요. Amazon GameLift Servers 서비스와의 통신을 설정하고 프롬프트에 응답하여 새 게임 세션을 시작하고 게임 클라이언트 연결을 수락하려면 게임 서버를 서버 SDK와 통합해야 합니다.
+ 게임 클라이언트: 최소한 IP 주소 및 포트 정보를 사용하여 게임 서버에 연결할 수 있는 게임 클라이언트가 필요합니다. 아직 게임 클라이언트 구성 요소를에 대해 설정하지 않은 경우 AWS CLI 도구를 사용하여 새 게임 세션을 수동으로 요청하고, 연결 정보를 가져오고, 해당 정보를 사용하여 게임 클라이언트를 연결할 Amazon GameLift Servers수 있습니다.

  어느 시점에 새 게임 세션 요청을 Amazon GameLift Servers 서비스에 보내고 연결 정보를 게임 클라이언트에 다시 전달하려면 백엔드 서비스가 있어야 합니다. 플러그인에 포함된 테스트 맵을 사용하여 클라이언트 Amazon GameLift Servers 기능을 게임 프로젝트에 추가할 수 있습니다. 사용자 지정 솔루션 구축에 대한 도움말은 [Amazon GameLift Servers 게임 클라이언트 기능 통합](gamelift-sdk-client-api.md) 섹션을 참조하세요.

## 3단계: Anywhere 플릿에 연결
<a name="unreal-plugin-anywhere-fleet"></a>

이 단계에서는 사용할 Anywhere 플릿을 지정합니다. Anywhere 플릿은 게임 서버 호스팅을 위해 어디에서나 배치할 수 있는 컴퓨팅 리소스 모음을 정의합니다.
+ 현재 사용 중인 AWS 계정에 기존 Anywhere 플릿이 있는 경우 플릿 이름 드롭다운 필드를 열고 플릿을 선택합니다. 이 드롭다운에는 현재 활성 사용자 프로필에 대한 AWS 리전의 Anywhere 플릿만 표시됩니다.
+ 기존 플릿이 없거나 새 플릿을 생성하려는 경우 새 Anywhere 플릿 생성을 선택하고 플릿 이름을 입력합니다.

프로젝트에 Anywhere 플릿을 선택하면 Amazon GameLift Servers는 플릿 상태가 활성 상태인지 확인하고 플릿 ID를 표시합니다. Unreal 편집기의 출력 로그에서 이 요청의 진행 상황을 추적할 수 있습니다.

## 4단계: 워크스테이션 등록
<a name="unreal-plugin-anywhere-register"></a>

이 단계에서는 로컬 워크스테이션을 새로운 Anywhere 플릿의 컴퓨팅 리소스로 등록합니다.

**워크스테이션을 Anywhere 컴퓨팅으로 등록하려면**

1. 로컬 시스템의 컴퓨팅 이름을 입력합니다. 플릿에 두 개 이상의 컴퓨팅을 추가하는 경우 이름은 고유해야 합니다.

1. 로컬 시스템의 IP 주소를 입력합니다. 이 필드의 기본값은 시스템의 퍼블릭 IP 주소입니다. 게임 클라이언트와 서버를 같은 시스템에서 실행하는 한 localhost(127.0.0.1)를 사용할 수도 있습니다.

1. 컴퓨팅 등록을 선택합니다. Unreal 편집기의 출력 로그에서 이 요청의 진행 상황을 추적할 수 있습니다.

이 작업에 대한 응답으로 Amazon GameLift Servers는 컴퓨팅에 연결할 수 있는지 확인하고 새로 등록된 컴퓨팅에 대한 정보를 반환합니다. 또한 Amazon GameLift Servers 서비스와의 통신을 초기화할 때 게임 실행 파일에 필요한 콘솔 인수를 생성합니다.

## 5단계: 인증 토큰 생성
<a name="unreal-plugin-anywhere-auth"></a>

Anywhere 컴퓨팅에서 실행되는 게임 서버 프로세스에는 Amazon GameLift Servers 서비스를 호출하기 위한 인증 토큰이 필요합니다. 플러그인에서 게임 서버를 실행할 때마다 플러그인은 Anywhere 플릿에 대한 인증 토큰을 자동으로 생성하고 저장합니다. 인증 토큰 값은 명령줄 인수로 저장되며, 서버 코드를 런타임 시 검색할 수 있습니다.

위에 제공된 코드 예제에서는 [AWS API 요청에 서명 버전 4(SigV4)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)을 사용할 수도 있습니다. SigV4는 API 요청에 인증 정보를 추가하기 위한 AWS 서명 프로토콜입니다.

이 단계에서는 어떤 조치도 취하지 않아도 됩니다.

## 6단계: 게임 실행
<a name="unreal-plugin-anywhere-launch"></a>

이제 Amazon GameLift Servers를 사용하여 로컬 워크스테이션에서 멀티플레이어 게임을 시작하고 플레이하는 데 필요한 모든 작업을 완료했습니다.

**호스팅 게임을 플레이하려면**

1. 게임 서버를 시작합니다. 게임 서버는 게임 세션을 호스팅할 준비가 되면 Amazon GameLift Servers에 알립니다.

1. 게임 클라이언트를 시작하고 새 기능을 사용하여 새 게임 세션을 시작합니다. 이 요청은 새 백엔드 서비스를 통해 Amazon GameLift Servers로 전송됩니다. 이에 대한 응답으로 Amazon GameLift Servers는 로컬 시스템에서 실행되는 게임 서버를 호출하여 새 게임 세션을 시작합니다. 게임 세션이 플레이어를 받아들일 준비가 되면 Amazon GameLift Servers는 게임 클라이언트가 게임 세션에 참여할 수 있도록 연결 정보를 제공합니다.

# Unreal용 플러그인: 관리형 EC2 플릿에 게임 배포
<a name="unreal-plugin-ec2"></a>

이 워크플로에서는 플러그인을 사용하여 Amazon GameLift Servers에서 관리하는 클라우드 기반 컴퓨팅 리소스에서 호스팅하도록 게임을 수정합니다. 배포를 위해 통합 게임 서버 빌드를 Amazon GameLift Servers 서비스에 업로드합니다. 게임 코드를 아직 통합하지 않은 경우 [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md) 섹션을 참조하세요. 이 워크플로가 완료되면 클라우드의 게임 서버에 연결할 수 있도록 작동하는 게임 클라이언트가 생깁니다.

**Amazon GameLift Servers 관리형 Amazon EC2 워크플로를 시작하려면**
+ Unreal 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **관리형 EC2와 호스트**를 선택합니다. 이 작업을 수행하면 **Amazon EC2 플릿 배포** 플러그인 페이지가 열리고 게임 구성 요소를 통합, 빌드, 배포 및 시작하는 6단계 프로세스를 제공합니다.

## 1단계: 프로필 설정
<a name="unreal-plugin-ec2-profile"></a>

이 워크플로를 따를 때 사용할 프로필을 선택합니다. 선택한 프로필은 워크플로의 모든 단계에 영향을 줍니다. 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

**사용자 프로필을 설정하려면**

1. 사용 가능한 프로필 드롭다운 목록에서 프로필을 선택합니다. 아직 프로필이 없거나 새 프로필을 생성하려면 **Amazon GameLift** 메뉴로 이동하여 ** AWS 사용자 프로필 설정을** 선택합니다.

1. 부트스트랩 상태가 ‘활성’이 아닌 경우, **프로필 부트스트랩**을 선택하고 상태가 ‘활성’으로 변경될 때까지 기다립니다.

## 2단계: 게임 코드 설정
<a name="unreal-plugin-ec2-integrate"></a>

이 단계에서는 Unreal용 Amazon GameLift Servers C\$1\$1 Server SDK와 함께 작동하도록 게임 서버 및 게임 클라이언트 빌드를 준비합니다. 게임 코드를 아직 통합하지 않고 게임 클라이언트 및 서버 실행 파일을 빌드하지 않은 경우 [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md) 섹션을 참조하세요. 로컬 워크스테이션에서 게임 실행 파일의 경로를 입력합니다.

이 워크플로우의 단계에서 플러그인은 소스 기반으로 빌드된 Unreal 편집기 버전을 설정하기 위한 지침과 소스 코드로의 링크를 제공합니다. 클라이언트 및 서버 구성 요소를 빌드할 때 소스 빌드 버전을 사용해야 합니다.

서버 SDK와 통합된 게임 서버를 빌드한 후 다음 작업을 완료하여 호스팅을 위해 Amazon GameLift Servers에 업로드할 준비를 합니다.

### 클라우드 배포를 위해 서버 빌드를 준비하려면(Windows)
<a name="w2aab9c11b9c19c35b9b9b1"></a>

Unreal 편집기가 기본적으로 서버 빌드 파일을 저장하는 `WindowsServer` 폴더에 다음을 추가합니다.

1. **서버 빌드 설치 스크립트를 `WindowsServer` 폴더의 루트에 복사합니다.** 설치 스크립트는 플러그인 다운로드에 포함되어 있습니다. `[project-name]/Plugins/Resources/CloudFormation/extra_server_resources/install.bat` 파일을 찾습니다. Amazon GameLift Servers는 이 파일을 사용하여 호스팅 컴퓨팅에 서버 빌드를 설치합니다.

1. **`VC_redist.x64.exe` 파일을 `WindowsServer` 폴더 루트로 복사합니다.** Unreal Engine 버전 5.6 이상을 사용하는 경우 이 단계를 건너뛸 수 있습니다. 이 파일은 Visual Studio 설치에 포함되어 있습니다. 일반적으로 `C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Redist/MSVC/v142`에 있습니다.

1. **OpenSSL 라이브러리 파일을 게임 서버 빌드에 추가합니다.** 게임 서버가 서버 SDK 5.3 이상과 통합된 경우 이 단계를 건너뛸 수 있습니다. 이 버전은 Unreal용 Amazon GameLift Servers 플러그인 버전 3.0 이상에 포함되어 있습니다.

   OpenSSL 라이브러리를 수동으로 찾아 `<YourGame>/Binaries/Win64`의 게임 빌드 패키지 디렉터리에 복사합니다. Unreal Engine 5 버전에서 사용하는 것과 동일한 OpenSSL 버전을 **반드시** 사용해야 합니다. 잘못된 OpenSSL 라이브러리와 함께 배포된 게임 빌드는 Amazon GameLift Servers 서비스와 통신할 수 없습니다.

   게임 엔진 소스에서 OpenSSL 라이브러리를 찾습니다. 위치는 개발 환경에 따라 다릅니다.

   Windows의 경우: 
   + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll`
   + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll` 

   Linux의 경우:
   + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1`
   + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1`

### 클라우드 배포를 위해 서버 빌드를 준비하려면(Linux)
<a name="w2aab9c11b9c19c35b9c11b1"></a>

Linux용으로 빌드된 게임 서버를 준비하는 방법에 대한 자세한 지침은 [Amazon Linux에서 Unreal Engine 5 Amazon GameLift Servers용 서버 SDK 빌드](https://github.com/aws/amazon-gamelift-toolkit/tree/main/building-gamelift-server-sdk-for-unreal-engine-and-amazon-linux)를 참조하세요.

1. **작업 디렉터리를 지정하여 빌드 파일을 구성합니다.** 작업 디렉터리의 구조는 각 호스팅 컴퓨팅에 있는 그대로 배포됩니다. Linux 빌드 게임 서버와 모든 종속 파일을 추가합니다.

1. **작업 디렉터리의 루트에 서버 빌드 설치 스크립트를 생성합니다.** 필요한 경우 `install.sh` 파일을 생성하고 게임 서버 빌드를 올바르게 설치하는 데 필요한 명령을 추가합니다. Amazon GameLift Servers는 이 파일을 사용하여 각 EC2 호스팅 리소스에 서버 빌드를 설치합니다.

1. **OpenSSL 라이브러리 파일을 게임 서버 빌드에 추가합니다.** 게임 서버가 서버 SDK 5.3 이상과 통합된 경우 이 단계를 건너뛸 수 있습니다.

   라이브러리를 수동으로 찾아 복사합니다. Unreal Engine 5 버전에서 사용하는 것과 동일한 OpenSSL 버전을 **반드시** 사용해야 합니다. 잘못된 OpenSSL 라이브러리와 함께 배포된 게임 빌드는 Amazon GameLift Servers 서비스와 통신할 수 없습니다.

   1. 게임 엔진 소스에서 OpenSSL 라이브러리를 찾습니다. 위치는 개발 환경에 따라 다릅니다.

      Windows의 경우: 
      + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll`
      + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll` 

      Linux의 경우:
      + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1`
      + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1`

   1. OpenSSL 라이브러리를 찾은 경우 `<YourGame>/Binaries/Linux`의 게임 빌드 패키지 디렉터리에 복사합니다.

## 3단계: 배포 시나리오 선택
<a name="unreal-plugin-ec2-scenarios"></a>

이 단계에서는 지금 배포하려는 게임 호스팅 솔루션을 선택합니다. 어떤 시나리오로든 게임을 여러 번 배포할 수 있습니다.
+ 단일 리전 플릿: 활성 프로파일의 기본 AWS 리전에 있는 단일 호스팅 리소스 플릿에 게임 서버를 배포합니다. 처음에는 이 시나리오로 AWS 와의 서버 통합 및 서버 빌드 구성을 테스트를 시작하는 것이 좋습니다. 다음과 같은 리소스를 배포합니다.
  + 게임 서버 빌드가 설치되어 실행 중인AWS 플릿(온디맨드).
  + 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
  + 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
  + API 게이트웨이에 대한 과도한 플레이어 호출을 제한하기 위한 WebACl.
  + API 게이트웨이 \$1 플레이어가 게임 슬롯을 요청할 수 있는 Lambda 함수. 이 함수는 사용할 수 없는 경우 `CreateGameSession()`을 호출합니다.
  + API 게이트웨이 \$1 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 Lambda 함수.
+ FlexMatch 플릿: 게임 서버를 플릿 세트에 배포하고 플레이어 매치를 생성하는 규칙이 포함된 FlexMatch 매치메이커를 설정합니다. 이 시나리오에서는 다중 플릿, 다중 위치 구조와 함께 저비용 스팟 호스팅을 사용하여 가용성을 지속적으로 유지합니다. 이 방식은 호스팅 솔루션용 매치메이커 구성 요소 설계를 시작할 준비가 되었을 때 유용합니다. 이 시나리오에서는 이 솔루션의 기본 리소스를 만들고 필요에 따라 나중에 사용자 지정할 수 있습니다. 다음과 같은 리소스를 배포합니다.
  + FlexMatch 매치메이킹 구성 및 매치메이킹 규칙은 플레이어 요청을 수락하고 매치를 구성하도록 설정됩니다.
  + 게임 서버 빌드가 여러 위치에 설치되어 실행 중인 AWS 플릿 3대. 백업용으로 스팟 플릿 2개와 온디맨드 플릿 1개가 포함됩니다.
  + AWS 게임 세션 배치 대기열은 (실행 가능성, 비용, 플레이어 지연 시간 등을) 기반으로 가능한 최상의 호스팅 리소스를 찾고 게임 세션을 시작하여 제안된 매치에 대한 요청을 충족시켜 줍니다.
  + 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
  + 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
  + API 게이트웨이에 대한 과도한 플레이어 호출을 제한하기 위한 WebACl.
  + API 게이트웨이 \$1 플레이어가 게임 슬롯을 요청할 수 있는 Lambda 함수. `StartMatchmaking()` 함수를 호출합니다.
  + API 게이트웨이 \$1 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 Lambda 함수.
  + 플레이어용 매치메이킹 티켓과 게임 세션 정보를 저장하는 Amazon DynamoDB 테이블.
  + SNS 주제 \$1 GameSessionQueue 이벤트를 처리하는 Lambda 함수.

## 4단계: 게임 파라미터 설정
<a name="unreal-plugin-ec2-parameters"></a>

이 단계에서는에 업로드하기 위한 게임을 설명합니다 AWS.
+ 서버 빌드 이름: 게임 서버 빌드에 의미 있는 이름을 입력합니다. AWS 는 업로드되어 배포에 사용되는 서버 빌드의 사본을 가리킬 때 이 이름을 사용합니다.
+ 서버 빌드 OS: 서버가 실행되도록 빌드된 운영 체제를 입력합니다. 이는 게임을 호스팅하는 데 사용할 컴퓨팅 리소스 유형을 AWS 에 알려줍니다.
+ 게임 서버 폴더: 로컬 서버 빌드 폴더의 경로를 식별합니다.
+ 게임 서버 빌드: 게임 서버 실행 파일의 경로를 식별합니다.
+ 게임 클라이언트 경로: 게임 클라이언트 실행 파일의 경로를 식별합니다.
+ 클라이언트 구성 출력:이 필드는 AWS 구성이 포함된 클라이언트 빌드의 폴더를 가리켜야 합니다. 다음 위치에서 찾습니다. `[client-build]/[project-name]/Content/CloudFormation` 

## 5단계: 배포 시나리오
<a name="unreal-plugin-ec2-deploy"></a>

이 단계에서는 선택한 배포 시나리오에 따라 게임을 클라우드 호스팅 솔루션에 배포합니다. 이 프로세스는 AWS 가 서버 빌드를 검증하고, 호스팅 리소스를 프로비저닝하며, 게임 서버를 설치하고, 서버 프로세스를 시작하며, 게임 세션을 호스팅할 준비를 하는 데 몇 분 정도 소요될 수 있습니다.

배포를 시작하려면 **CloudFormation 배포**를 선택합니다. 여기에서 게임 호스팅 상태를 추적할 수 있습니다. 자세한 내용을 알아보려면에 대한 AWS AWS 관리 콘솔에 로그인하고 이벤트 알림을 볼 수 있습니다. 플러그인의 활성 사용자 프로필과 동일한 계정, 사용자 및 AWS 리전을 사용하여 로그인해야 합니다.

배포가 완료되면 게임 서버가 AWS EC2 인스턴스에 설치됩니다. 하나 이상의 서버 프로세스가 실행 중이며 게임 세션을 시작할 준비가 되었습니다.

## 6단계: 클라이언트 시작
<a name="unreal-plugin-ec2-launch"></a>

이제 Amazon GameLift Servers로 호스팅된 멀티플레이어 게임을 시작하고 플레이하는 데 필요한 모든 작업을 완료했습니다. 게임을 플레이하려면 게임 클라이언트의 인스턴스를 시작합니다.

단일 플릿 시나리오를 배포한 경우 한 명의 플레이어가 있는 단일 클라이언트 인스턴스를 열고 서버 맵을 입력 및 이동할 수 있습니다. 게임 클라이언트의 추가 인스턴스를 열어 동일한 서버 게임 맵에 두 번째 플레이어를 추가합니다.

FlexMatch 시나리오를 배포한 경우 솔루션은 플레이어가 서버 맵에 들어가기 전에 게임 세션 배치를 위해 최소 두 개의 클라이언트가 대기할 때까지 기다립니다.

# Unreal용 플러그인: 관리형 컨테이너 플릿에 게임 배포
<a name="unreal-plugin-container"></a>

이 안내 플러그인 워크플로를 사용하여 게임 서버의 컨테이너 이미지를 생성하고 컨테이너 기반 호스팅 솔루션에 배포합니다. 게임 코드를 아직 통합하지 않은 경우 [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md) 섹션을 참조하세요. 이 워크플로를 성공적으로 완료하면 컨테이너화된 게임 서버가 클라우드에서 실행되며 플러그인을 사용하여 게임 클라이언트를 시작하고, 게임 세션에 연결하며, 게임을 플레이할 수 있습니다.

## 시작하기 전에
<a name="unreal-plugin-container-prereqs"></a>

이 워크플로는 다음 작업을 완료했다고 가정합니다.
+ **Amazon GameLift Servers Server SDK를 게임 서버 코드에 통합합니다.** 호스팅하는 게임 서버는 새 게임 세션을 시작하고 게임 세션 상태를 보고하라는 요청에 응답할 수 있도록 Amazon GameLift Servers 서비스와 통신할 수 있어야 합니다. 이 작업을 완료하지 않은 경우 먼저 플러그인 워크플로우인 Anywhere로 호스팅을 따르는 것이 좋습니다. 게임 서버 코드 준비에 대한 지침은 [게임 서버 코드 업데이트](unreal-plugin-integrate.md#unreal-plugin-anywhere-integrate-simple-server) 섹션을 참조하세요. 관리형 컨테이너 플릿의 경우 게임을 서버 SDK 버전 5.2 이상과 통합해야 합니다.
**참고**  
스타트업 게임 맵을 사용하는 경우 이 작업이 이미 완료되었습니다.
+ **Linux에서 실행할 게임 서버 실행 파일을 패키징합니다.** Windows에서 개발하고 C\$1\$1 서버 SDK 버전 5.2.x 이하 버전을 통합하는 경우 [Unreal 크로스 컴파일 툴킷](http://cross-compile toolkit for your UE version)으로 작업해야 합니다. 또는 별도의 Linux 워크스페이스를 설정하거나 Linux용 Windows 하위 시스템(WSL)과 같은 도구를 사용할 수 있습니다.
+ **게임 서버 빌드와 함께 배포할 파일을 수집합니다.** 로컬 시스템에서 작업 디렉터리를 생성하여 파일을 구성합니다. 해당 파일은 게임 서버 컨테이너 이미지로 구축됩니다. 여기에는 게임 종속성, 컨테이너 시작 시 게임 서버 및 기타 프로세스를 실행하는 스크립트 등을 포함할 수 있습니다.
+ **게임 서버 빌드를 위해 OpenSSL 라이브러리 파일을 추가합니다.** 게임 서버가 서버 SDK 5.3 이상과 통합된 경우 이 단계를 건너뛸 수 있습니다.

  OpenSSL 라이브러리를 수동으로 찾아 `<YourGame>/Binaries/Win64`의 게임 빌드 패키지 디렉터리에 복사합니다. Unreal Engine 5 버전에서 사용하는 것과 동일한 OpenSSL 버전을 **반드시** 사용해야 합니다. 잘못된 OpenSSL 라이브러리와 함께 배포된 게임 빌드는 Amazon GameLift Servers 서비스와 통신할 수 없습니다.

  OpenSSL 라이브러리를 찾으려면 게임 엔진 소스를 검색합니다. 위치는 개발 환경에 따라 다릅니다.

  Windows의 경우: 
  + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll`
  + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll` 

  Linux의 경우:
  + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1`
  + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1`
+ **Amazon GameLift Servers를 사용한 게임 클라이언트 코드를 통합합니다.** 이 작업을 완료하는 한 가지 방법은 이미 통합된 샘플 자산(플러그인에 포함됨)을 추가하는 것입니다. 게임 클라이언트 코드 준비에 대한 지침은 [클라이언트 게임 맵 통합](unreal-plugin-integrate.md#unreal-plugin-anywhere-integrate-simple-client) 섹션을 참조하세요.
+ **로컬 컴퓨터에 Docker를 설치합니다.** 플러그인이 컨테이너 이미지를 생성하여 ECR 리포지토리로 푸시하도록 하려면 이 도구를 설치해야 합니다. 또는 이러한 작업을 수동으로 수행하고 플러그인에 기존 컨테이너 이미지를 사용하도록 지시할 수 있습니다. 이미지를 수동으로 빌드하는 방법에 대한 자세한 내용은 [Amazon GameLift Servers용 컨테이너 이미지 빌드](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/containers-prepare-images.html)를 참조하세요.

**Amazon GameLift Servers 관리형 컨테이너 워크플로를 시작하려면:**
+ Unreal 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **관리형 컨테이너**를 선택합니다. 이 작업을 수행하면 **관리형 컨테이너가 있는 호스트** 플러그인 페이지가 열립니다. 이 페이지는 게임 서버 빌드로 컨테이너 이미지를 생성하고, 컨테이너 플릿에 배포하며, 게임을 시작하는 단계별 프로세스를 제공합니다.

## 0단계: 프로필 설정
<a name="unreal-plugin-container-profile"></a>

이 섹션에는 현재 선택한 사용자 프로필이 표시됩니다. 현재 사용자 프로필이 이 워크플로에 사용할 프로필인지 확인합니다. 이 워크플로에서 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

다음과 같은 경우 선택한 사용자 프로필을 수정해야 할 수 있습니다.
+ 현재 선택된 프로필이 없습니다.
+ 다른 프로필을 선택하거나 새 프로필을 생성하려고 합니다.
+ 선택한 프로필을 부트스트랩해야 합니다(부트스트랩 상태가 비활성인 경우).

**선택한 사용자 프로필을 설정하거나 변경하려면**
+ Amazon GameLift Servers 메뉴에서 ** AWS 액세스 자격 증명 열기를** 선택합니다.

## 1단계: 컨테이너 준비 상태 평가
<a name="unreal-plugin-container-assess"></a>

게임 서버를 컨테이너 플릿에 배포하기 전에 컨테이너 이미지에 패키징하고 Amazon ECR 리포지토리에 저장해야 합니다. 플러그인은 이러한 작업을 사용자를 대신하여 완료할 수 있으며 이러한 작업을 수동으로 수행할 수 있습니다. 이 단계에서는 컨테이너 이미지 및 ECR 리포지토리의 상태에 대한 정보를 제공합니다.

평가 질문을 사용하여 플러그인에 수행해야 할 단계를 알려줍니다.
+ **새 컨테이너 이미지를 생성합니다.** 이 옵션을 선택하면 다음 단계에서 게임 서버 빌드 디렉터리의 위치와 빌드 실행 파일을 묻는 메시지가 표시됩니다. 플러그인은 Dockerfile 템플릿(Amazon GameLift Servers에서 제공)을 사용하고 게임에 맞게 자동으로 구성합니다. [Amazon GameLift Servers용 컨테이너 이미지 빌드](containers-prepare-images.md)에서 템플릿을 확인할 수 있습니다. 이 옵션을 선택한 후 플러그인이 새 이미지를 저장할 위치를 지정합니다.
  + 새 Amazon ECR 리포지토리를 생성하고 여기에 컨테이너 이미지를 푸시합니다. 플러그인은 선택한 사용자 프로필 AWS 리전 에서 AWS 계정 및 기본값을 사용하여 프라이빗 ECR 리포지토리를 생성합니다.
  + 이전에 생성된 Amazon ECR 리포지토리에 컨테이너 이미지를 푸시합니다. 이 옵션을 선택하면 다음 단계에서 목록에서 기존 Amazon ECR 리포지토리를 선택하라는 메시지가 표시됩니다. 목록에는 선택한 사용자 프로필의 AWS 계정 및 기본값 AWS 리전 에 대한 모든 Amazon ECR 리포지토리가 포함됩니다. 퍼블릭 또는 프라이빗 리포지토리를 선택할 수 있습니다.
+ **기존 컨테이너 이미지를 사용합니다.** 이미지를 수동으로 빌드한 경우 Amazon GameLift Servers에서 제공하는 Dockerfile 템플릿을 사용하는 것이 좋으며, 이 템플릿은 [Amazon GameLift Servers용 컨테이너 이미지 빌드](containers-prepare-images.md)에서 사용할 수 있습니다. 이 옵션을 선택한 후 이미지의 위치를 지정합니다.
  + 로컬에 저장된 Docker 생성 이미지입니다. 이 옵션을 선택하면 플러그인이 새 Amazon ECR 프라이빗 리포지토리를 생성하고 로컬 이미지 파일을 푸시합니다. 다음 단계에서는 플러그인이 이미지 파일을 찾는 데 사용하는 이미지 ID를 묻는 메시지가 표시됩니다.
  + Amazon ECR 리포지토리에 이미 저장된 컨테이너 이미지입니다. 이 옵션을 선택하면 다음 단계에서 목록의 기존 Amazon ECR 리포지토리 및 이미지를 선택하라는 메시지가 표시됩니다. 목록에는 선택한 사용자 프로필의 AWS 계정 및 기본값 AWS 리전 에 대한 모든 Amazon ECR 리포지토리가 포함됩니다. 퍼블릭 또는 프라이빗 리포지토리를 선택할 수 있습니다.

## 2단계: 이미지 배포 구성
<a name="unreal-plugin-container-configure"></a>

이 단계에서는 플러그인이 컨테이너 플릿에 컨테이너 이미지를 배포하는 데 필요한 정보를 제공합니다. 이 단계에서는 다음 정보를 요청합니다.
+ 1단계에서 선택한 항목을 기반으로 한 게임 서버 빌드, 컨테이너 이미지 또는 Amazon ECR 리포지토리의 위치입니다.
+ 관리형 컨테이너 배포에 사용할 시나리오입니다.
+ 클라이언트 구성 출력 경로입니다. 클라이언트 빌드에서 AWS 구성이 포함된 폴더를 선택합니다. 다음 위치에서 찾습니다. `[client-build]/[project-name]/Content/CloudFormation` 
+ 선택적 배포 설정. 이 섹션에는 플러그인이 기본적으로 사용하는 구성 설정이 있습니다. 이를 수정하거나 기본값을 유지할 수 있습니다.
  + 기본적으로 게임 이름은 게임 프로젝트 이름으로 설정됩니다. 플러그인이 생성하는 모든 AWS 리소스는 게임 이름 값을 참조합니다.
  + 포트 범위, 메모리 제한, vCPU 제한은 컨테이너 플릿의 구성 설정입니다. 이러한 값을 사용자 지정하는 방법에 대한 자세한 내용은 연결 포트 범위는 [네트워크 연결 구성](containers-design-fleet.md#containers-custom-network) 섹션을 참조하고 리소스 제한은 [리소스 제한 설정](containers-design-fleet.md#containers-design-fleet-limits) 섹션을 참조하세요.
  + 컨테이너 이미지 태그는 Amazon ECR에서 컨테이너 이미지를 분류하는 데 사용됩니다. 기본값은 `unreal-gamelift-plugin`입니다.
  + Amazon ECR 리포지토리의 이름입니다. 플러그인이 ECR 리포지토리를 생성하는 경우에만 사용자 지정 이름을 제안하도록 이 필드를 편집할 수 있습니다. 기본값은 `unreal-game lift-plugin-ecr-repository`입니다.

### 배포 시나리오 옵션
<a name="unreal-plugin-container-configure-scenarios"></a>

#### 단일 리전 컨테이너 플릿
<a name="w2aab9c11b9c19c39c13b7b3b1"></a>

이 시나리오에서는 게임 서버를 단일 컨테이너 플릿에 배포합니다. 이는 AWS 및 컨테이너 구성과의 서버 통합을 테스트하기 위한 좋은 시작점입니다. 다음과 같은 리소스를 배포합니다.
+ Amazon GameLift Servers 컨테이너 그룹 정의는 컨테이너 플릿에서 컨테이너 이미지를 배포하고 실행하는 방법을 설명합니다.
+ 별칭을 사용하여 게임 서버 컨테이너가 설치되고 실행 중인 Amazon GameLift Servers 컨테이너 플릿(온디맨드).
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
+ 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
+ API Gateway에 대한 과도한 플레이어 호출을 스로틀링하기 위한 웹 액세스 제어 목록(ACL).
+ 게임 세션을 요청하고 게임에 참여하는 등 게임 클라이언트를 대신하여 Amazon GameLift Servers 서비스에 요청하는 백엔드 서비스: 
  + 플레이어가 게임 세션 슬롯을 요청할 수 있는 API Gateway \$1 Lambda 함수. 이 함수는 슬롯이 확보되지 않는 경우 `CreateGameSession()`을 호출합니다.
  + 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 API Gateway \$1 Lambda 함수.

#### FlexMatch가 있는 단일 리전 컨테이너 플릿
<a name="w2aab9c11b9c19c39c13b7b3b3"></a>

이 시나리오에서는 게임 서버를 컨테이너 플릿에 배포하고, 게임 세션 배치를 구성하며, FlexMatch 매치메이킹을 설정합니다. 이 시나리오는 호스팅 솔루션용 사용자 지정 매치메이커 설계를 시작할 준비가 되었을 때 유용합니다. 이 시나리오를 사용하여 이 솔루션의 기본 리소스를 만들고 필요에 따라 나중에 사용자 지정할 수 있습니다. 다음과 같은 리소스를 배포합니다.
+ Amazon GameLift Servers 컨테이너 그룹 정의는 컨테이너 플릿에서 컨테이너 이미지를 배포하고 실행하는 방법을 설명합니다.
+ 별칭을 사용하여 게임 서버 컨테이너가 설치되고 실행 중인 Amazon GameLift Servers 컨테이너 플릿(온디맨드).
+ FlexMatch 매치메이킹 구성 및 매치메이킹 규칙은 플레이어 요청을 수락하고 매치를 구성하도록 설정.
+ Amazon GameLift Servers 게임 세션 대기열은 (실행 가능성, 비용, 플레이어 지연 시간 등을 기반으로) 가능한 최상의 호스팅 리소스를 찾고 게임 세션을 시작하여 제안된 매치에 대한 요청을 충족시켜 줌.
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
+ 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
+ API Gateway에 대한 과도한 플레이어 호출을 스로틀링하기 위한 웹 액세스 제어 목록(ACL).
+ 게임 세션을 요청하고 게임에 참여하는 등 게임 클라이언트를 대신하여 Amazon GameLift Servers 서비스에 요청하는 백엔드 서비스: 
  + 플레이어가 게임 세션 슬롯을 요청할 수 있는 API Gateway \$1 Lambda 함수. 이 함수는 슬롯이 확보되지 않는 경우 `StartMatchmaking()`을 호출합니다.
  + 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 API Gateway \$1 Lambda 함수.
+ 플레이어용 매치메이킹 티켓과 게임 세션 정보를 저장하는 DynamoDB 테이블.
+ GameSessionQueue 이벤트를 처리하는 Amazon SNS 주제 \$1 Lambda 함수.

## 컨테이너 플릿 배포
<a name="unreal-plugin-container-deploy"></a>

플릿 구성이 완료되면 **컨테이너 플릿 배포** 버튼을 선택하여 배포를 시작합니다. 플러그인이 컨테이너 이미지를 생성하여 ECR에 푸시하고, 컨테이너 플릿에 대한 호스팅 리소스를 프로비저닝하며, 선택한 호스팅 솔루션 시나리오에 대해 플릿 및 기타 AWS 리소스를 배포하는 동안 이 프로세스는 몇 분 정도 소요될 수 있습니다.

배포를 시작하면 각 단계의 진행 상황을 추적할 수 있습니다. 구성에 따라 단계에 다음이 포함될 수 있습니다.
+ 컨테이너 이미지 구성
+ Amazon ECT 리포지토리 생성 
+ 이미지 빌드 및 Amazon ECR로 푸시
+ 컨테이너 그룹 정의 생성
+ 컨테이너 플릿 생성

자세한 배포 정보를 보려면 ** AWS Management Console에서 보기**를 선택합니다. 컨테이너 플릿이 활성 상태에 도달하면 플릿은 게임 세션을 호스팅할 준비가 된 서버 프로세스로 컨테이너를 적극적으로 실행하고 있습니다.

배포가 완료되면 게임 세션을 호스팅하고 플레이어 연결을 수락할 준비가 된 작동 컨테이너 플릿이 있습니다.

진행 중인 배포는 중지할 수 없습니다. 배포가 잘못된 상태가 되거나 실패하는 경우 **배포 재설정** 옵션을 사용하여 다시 시작할 수 있습니다.

## 클라이언트 시작
<a name="unreal-plugin-container-launch"></a>

이제 Amazon GameLift Servers로 호스팅된 멀티플레이어 게임을 시작하고 플레이하는 데 모든 작업을 완료했습니다. 게임을 플레이하려면 **클라이언트 시작**을 선택하여 게임 클라이언트의 로컬 인스턴스를 시작합니다.
+ 단일 플릿 시나리오를 배포한 경우 한 명의 플레이어가 있는 게임 클라이언트의 하나의 인스턴스를 열고 서버 맵을 입력하여 이동할 수 있습니다. 또한 게임 클라이언트의 두 번째 인스턴스를 열어 동일한 서버 게임 맵에 두 번째 플레이어를 추가할 수 있습니다.
+ FlexMatch 시나리오를 배포한 경우 호스팅 솔루션은 두 개 이상의 게임 클라이언트가 매치메이킹 요청을 할 때까지 기다립니다. 플레이어 한 명과 함께 게임 클라이언트의 인스턴스를 두 개 이상 엽니다. 두 플레이어가 매칭되고 매치를 위해 게임 세션에 참여하라는 메시지가 표시됩니다.

## 컨테이너 플릿 업데이트
<a name="unreal-plugin-container-update"></a>

관리형 컨테이너 호스팅 솔루션을 성공적으로 배포한 경우 **배포 업데이트** 기능을 사용할 수 있습니다. 이 옵션을 사용하면 새 플릿을 생성할 필요 없이 배포된 컨테이너 플릿의 구성 설정을 업데이트할 수 있습니다.

배포를 업데이트할 때 다른 게임 서버 빌드로 컨테이너 이미지를 배포하고, Amazon ECR 리포지토리를 변경하며, 다른 배포 시나리오를 선택하고, 선택적 구성 설정을 사용자 지정할 수 있습니다.

변경사항을 배포할 준비가 되면 업데이트를 선택합니다. 배포 업데이트에 필요한 시간은 전체 배포와 유사합니다. 자세한 배포 정보를 보려면 ** AWS 관리 콘솔에서 보기를** 선택합니다.

## 배포된 리소스를 정리합니다.
<a name="unreal-plugin-container-cleanup"></a>

더 이상 필요하지 않은 관리형 컨테이너 솔루션의 AWS 리소스를 정리하는 것이 가장 좋습니다. 리소스를 제거하지 않으면 이러한 리소스에 대한 비용이 계속 발생할 수 있습니다.

다음 리소스를 삭제합니다.
+ 관리형 컨테이너 리소스 스택. 이 스택의 리소스는 선택한 배포 시나리오에 따라 달라집니다. 전체 스택을 삭제하려면 CloudFormation 콘솔을 사용합니다. Amazon GameLift Servers 플러그인에서 생성된 스택은 다음 명명 규칙을 사용합니다. `GameLiftPluginForUnreal-{GameName}-Containers`. 플러그인에서 새 관리형 컨테이너 배포를 시작하기 전에 스택 삭제 프로세스가 완료될 때까지 기다립니다. 자세한 내용은 [CloudFormation 콘솔에서 스택 삭제](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)를 참조하세요.
+ Amazon ECR 리포지토리. 플러그인을 사용하여 컨테이너 이미지에 대한 리포지토리를 생성한 경우 더 이상 필요하지 않은 저장소는 삭제하는 것이 좋습니다. 관리형 컨테이너 배포를 재설정하기 전에는 리포지토리를 삭제할 필요가 없습니다. 배포를 업데이트하거나 재설정하면 플러그인은 다른 리포지토리를 사용하도록 지시되지 않는 한 동일한 리포지토리를 자동으로 사용합니다. 자세한 내용은 [Amazon ECR에서 프라이빗 리포지토리 삭제](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-delete.html)를 참조하세요.

# Amazon GameLift Servers Unity용 플러그인(서버 SDK 5.x)
<a name="unity-plug-in"></a>

이 플러그인은 Unity 편집기에 Amazon GameLift Servers C\$1 서버 SDK 및 도구를 추가합니다. 안내 UI 워크플로를 사용하여 서버 SDK 기능을 게임 프로젝트에 통합하고 게임 서버에 Amazon GameLift Servers 호스팅 솔루션을 배포합니다.

플러그인 기능을 사용하면 기본 작업 호스팅 솔루션을 빌드한 다음 필요에 따라 최적화하고 사용자 지정할 수 있습니다. 로컬 워크스테이션을 호스트로 사용하여 Amazon GameLift Servers Anywhere 플릿을 설정합니다. 관리형 EC2 또는 관리형 컨테이너 플릿을 사용한 클라우드 호스팅의 경우 게임 세션 요청 및 클라이언트 연결을 관리할 수 있는 완전한 솔루션으로 게임 서버를 배포합니다.

**Topics**
+ [Unity 게임 프로젝트에 대한 플러그인 설치](#unity-plugin-install)
+ [Unity용 플러그인: AWS 사용자 프로필 설정](unity-plug-in-profiles.md)
+ [Unity용 플러그인: Amazon GameLift Servers Anywhere를 사용하여 로컬 테스트 설정](unity-plug-in-anywhere.md)
+ [Unity용 플러그인: 관리형 EC2 플릿에 게임 배포](unity-plug-in-ec2.md)
+ [Unity용 플러그인: 관리형 컨테이너 플릿에 게임 배포](unity-plug-in-container.md)

## Unity 게임 프로젝트에 대한 플러그인 설치
<a name="unity-plugin-install"></a>

**[GitHub에서 Unity용 Amazon GameLift Servers 플러그인 가져오기](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unity)**

게임 프로젝트의 플러그인을 설치하는 방법에 대한 자세한 내용은 GitHub 리포지토리 Readme 파일을 참조하세요.

플러그인에는 다음과 같은 구성 요소가 포함됩니다.
+ Unity 편집기용 플러그인 모듈 플러그인이 설치되면 새 기본 메뉴 아이템을 통해 Amazon GameLift Servers 기능에 액세스할 수 있습니다.
+ 클라이언트 측 기능을 갖춘 Amazon GameLift Servers 서비스 API용 C\$1 라이브러리.
+ Amazon GameLift Servers 서버 SDK(버전 5.x)용 C\$1 라이브러리.
+ 에셋 및 씬을 포함한 게임 콘텐츠를 샘플링하여 빌드 지원 멀티플레이어 게임이 없더라도 Amazon GameLift Servers를 사용해볼 수 있습니다.
+ 플러그인이 호스팅을 위해 게임 서버를 클라우드에 배포할 때 사용하는 CloudFormation 템플릿으로 제공되는 솔루션 구성입니다.

이 플러그인은 AWS CloudFormation 템플릿을 사용하여 일반적인 게임 시나리오를 위한 호스팅 솔루션을 배포합니다. 이러한 솔루션은 제공된 대로 사용하거나 게임에 필요한 대로 사용자 지정합니다.

# Unity용 플러그인: AWS 사용자 프로필 설정
<a name="unity-plug-in-profiles"></a>

플러그인을 설치한 후 유효한 AWS 계정으로 사용자 프로필을 설정합니다. 프로필을 여러 개 유지할 수 있지만 한 번에 한 프로필만 선택할 수 있습니다. 플러그인에서 작업할 때마다 사용할 프로필을 선택합니다. 각 워크플로 페이지에는 현재 선택한 프로필이 표시됩니다.

프로필을 여러 개 유지하면 서로 다른 호스팅 배포 간에 전환할 수 있습니다. 예를 들어 동일한 AWS 계정을 사용하지만 다른 AWS 리전에 배포하는 프로필을 설정할 수 있습니다. 또는 AWS 계정이나 사용자 및 권한 세트가 다른 프로필을 설정할 수 있습니다.

**참고**  
워크스테이션에 AWS CLI를 설치하고 프로필이 이미 구성된 경우 Amazon GameLift Servers 플러그인이 CLI를 감지하여 기존 프로필로 나열합니다. 플러그인은 `[default]` 이름이 지정된 프로필을 자동으로 선택합니다. 기존의 데이터 세트를 사용하거나 새 프로필을 생성할 수 있습니다.

계정 사용자 아래에 일부 필수 AWS 리소스를 설정하려면 모든 프로필을 부트스트래핑해야 합니다.

**AWS 프로필을 관리하려면**

1. Unity 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **AWS 자격 증명 액세스**를 선택합니다. 이 작업을 수행하면 **사용자 프로필 설정** 페이지에 대한 Amazon GameLift Servers 플러그인이 열립니다.

1. 버튼을 사용하여 새 AWS 계정을 생성하거나 이미 보유한 AWS 계정에 대한 사용자 프로필을 설정합니다.

1. 사용자 프로필이 아직 없는 경우 프로필 세부 정보를 입력하고 새 프로필을 생성하라는 메시지가 표시됩니다. 다음 정보를 제공합니다.
   +  AWS 계정. 새 AWS 계정을 생성하는 경우에 대한 링크를 사용하고 프롬프트를 AWS Management Console 따릅니다. 자세한 내용은 [AWS 계정 생성](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html)을 참조하세요.
   + Amazon GameLift Servers 및 기타 필수 AWS 서비스를 사용할 권한이 있는 AWS 사용자입니다. 장기 자격 증명을 사용하여 Amazon GameLift Servers 권한 및 프로그래밍 방식으로 액세스할 수 있는 AWS Identity and Access Management (IAM) 사용자를 설정하는 방법에 [AWS 사용자 계정 설정](setting-up-aws-login.md) 대한 지침은 섹션을 참조하세요.
   +  AWS 사용자에 대한 자격 증명입니다. 이러한 자격 증명은 AWS 액세스 키 ID와 AWS 보안 키로 구성됩니다. 자세한 내용은 [액세스 키 가져오기](https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html#cli-authentication-user-get)를 참조하세요.
   + AWS region. 호스팅을 위해 AWS 리소스를 생성하려는 지리적 위치입니다. 개발 중에는 실제 위치와 가까운 리전을 사용하는 것이 좋습니다. [ 지원되는 리전 목록에서 AWS 리전](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)을 선택합니다.

1. 플러그인이 기존 프로필을 감지하면 사용 가능한 프로필 목록이 표시됩니다. 목록에서 기존 프로필을 선택하거나 **다른 프로필 추가**를 선택하여 새 프로필을 생성합니다.

## 사용자 프로필 부트스트랩
<a name="unity-plug-in-profiles-bootstrap"></a>

Amazon GameLift Servers 플러그인과 함께 사용하려면 모든 프로필을 부트스트랩해야 합니다. 부트스트래핑은 프로필과 관련된 Amazon S3 버킷을 생성합니다. 프로젝트 구성, 빌드 아티팩트 및 기타 종속성을 저장하는 데 사용됩니다. 버킷은 다른 프로필 간에 공유되지 않습니다.

부트스트래핑에는 새 AWS 리소스 생성이 포함되며 비용이 발생할 수 있습니다.

**프로필을 부트스트랩하려면**

1. **AWS 액세스 자격 증명** 페이지에서 사용하려는 사용자 프로필의 부트스트랩 상태를 확인합니다. 프로필의 부트스트랩 상태가 ‘비활성’이고 나열된 S3 버킷이 없는 경우 프로필을 부트스트랩해야 합니다.

1. 사용할 프로필을 선택하고 **프로필 부트스트랩**을 선택합니다.

1. 부트스트랩 상태가 “활성”으로 변경될 때까지 기다립니다. 몇 분 정도 소요될 수 있습니다.

# Unity용 플러그인: Amazon GameLift Servers Anywhere를 사용하여 로컬 테스트 설정
<a name="unity-plug-in-anywhere"></a>

이 워크플로에서는 Amazon GameLift Servers 기능을 위한 클라이언트 및 서버 게임 코드를 추가하고 플러그인을 사용하여 로컬 워크스테이션을 테스트 게임 서버 호스트로 지정합니다. 통합 작업을 완료하면 플러그인을 사용하여 게임 클라이언트 및 서버 구성 요소를 빌드합니다.

**Amazon GameLift Servers Anywhere 워크플로를 시작하려면:**
+ Unity 편집기 기본 도구 모음에서 **Amazon GameLift Servers** > **Anywhere와 호스트**를 선택합니다. 이 작업을 수행하면 @Anywhere 플릿으로 게임을 설정할 수 있는 플러그인 페이지가 열립니다. 이 페이지에는 게임 구성 요소를 통합, 빌드 및 시작하는 5단계 프로세스가 나와 있습니다.

## 프로필 설정
<a name="unity-plug-in-anywhere-profile"></a>

이 워크플로를 따를 때 사용할 프로필을 선택합니다. 선택한 프로필은 워크플로의 모든 단계에 영향을 줍니다. 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

1. 사용 가능한 프로필 드롭다운 목록에서 프로필을 선택합니다. 아직 프로필이 없거나 새 프로필을 생성하려면 **Amazon GameLift Servers** 메뉴로 이동하여 ** AWS 계정 프로필 설정을** 선택합니다.

1. 부트스트랩 상태가 “활성”이 아닌 경우, **프로필 부트스트랩**을 선택하고 상태가 “활성”으로 변경될 때까지 기다립니다.

## C\$1 서버 SDK를 게임 코드에 통합
<a name="unity-plug-in-anywhere-integrate"></a>

**참고**  
샘플 게임을 가져온 경우 이 단계를 건너뛸 수 있습니다. 샘플 게임 에셋에는 이미 필요한 서버 및 클라이언트 코드가 있습니다.

워크플로의 이 단계에서는 게임 프로젝트의 클라이언트 및 서버 코드를 업데이트합니다.
+ 게임 서버는 Amazon GameLift Servers 서비스와 통신하여 게임 세션을 시작하고, 게임 세션 연결 정보를 제공하고, 상태를 보고하라는 프롬프트를 받을 수 있어야 합니다.
+ 게임 클라이언트는 게임 세션에 대한 정보를 얻고, 게임 세션에 연결하거나 시작하고, 게임에 연결하기 위한 연결 정보를 얻을 수 있어야 합니다.

### 서버 코드 통합
<a name="unity-plug-in-anywhere-integrate-server"></a>

사용자 지정 씬에서 자체 게임 프로젝트를 사용하는 경우 제공된 샘플 코드를 사용하여 게임 프로젝트에 필요한 서버 코드를 추가합니다.

1. 게임 프로젝트 파일에서 `Assets/Scripts/Server` 폴더를 엽니다. 파일이 없으면 새로 생성합니다.

1. GitHub 리포지토리 [aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity)로 이동하여 `Samples~/SampleGame/Assets/Scripts/Server` 경로를 엽니다.

1. `GameLiftServer.cs` 파일을 찾아 게임 프로젝트의 `Server` 폴더에 복사합니다. 서버 실행 파일을 빌드할 때 이 파일을 빌드 대상으로 사용합니다.

샘플 코드에는 Amazon GameLift Servers C\$1 서버 SDK(버전 5)를 사용하는 다음과 같은 최소 필수 요소가 포함됩니다.
+ Amazon GameLift Servers API 클라이언트를 초기화합니다. Amazon GameLift Servers Anywhere 플릿에는 서버 파라미터를 사용한 `InitSDK()` 호출이 필요합니다. 이러한 설정은 플러그인에서 사용하도록 자동으로 설정됩니다.
+ `OnStartGameSession`, `OnProcessTerminate`, `onHealthCheck`를 포함한 Amazon GameLift Servers 서비스의 요청에 응답하는 필수 콜백 함수를 구현합니다.
+ 지정된 포트와 함께 `ProcessReady()`를 호출하여 서버 프로세스가 게임 세션을 호스팅할 준비가 되면 Amazon GameLift Servers 서비스에 알립니다.

샘플 서버 코드를 사용자 지정하려면 다음 리소스를 참조하세요.
+ [서버 SDK를 사용하여 게임 서버에 Amazon GameLift Servers를 추가합니다.](gamelift-sdk-server-api.md)
+ [Amazon GameLift Servers용 C\$1 서버 SDK 5.x - 작업](integration-server-sdk5-csharp-actions.md)

### 클라이언트 코드 통합
<a name="unity-plug-in-anywhere-integrate-client"></a>

사용자 지정 씬과 함께 자체 게임 프로젝트를 사용하는 경우 기본 기능을 게임 클라이언트에 통합해야 합니다. 또한 플레이어가 게임 세션에 로그인하고 연결할 수 있도록 UI 요소를 추가해야 합니다. Amazon GameLift Servers ( AWS SDK에서)용 서비스 API를 사용하여 게임 세션 정보를 가져오거나, 새 게임 세션을 생성하거나, 기존 게임 세션에 참여합니다.

Anywhere 플릿을 사용하여 로컬 테스트를 위한 클라이언트를 구축할 때 Amazon GameLift Servers 서비스에 직접 호출을 추가할 수 있습니다. 클라우드 호스팅을 위한 게임을 개발할 때 또는 프로덕션 호스팅을 위해 Anywhere 플릿을 사용할 계획인 경우 게임 클라이언트와 Amazon GameLift Servers 서비스 간의 모든 통신을 처리하기 위해 클라이언트 측 백엔드 서비스를 생성해야 합니다.

Amazon GameLift Servers를 클라이언트 코드에 통합하려면 다음 리소스를 가이드로 사용하세요.
+ GitHub 리포지토리 aws/amazon-gamelift-plugin-unity에서 클라이언트를 GameLiftCoreApi 클래스와 통합합니다. 이 클래스는 플레이어 인증 및 게임 세션 정보 검색에 대한 제어를 제공합니다.
+ GitHub 리포지토리 aws/amazon-gamelift-plugin-unity, `Samples~/SampleGame/Assets/Scripts/Client/GameLiftClient.cs`에서 사용할 수 있는 샘플 게임 통합을 봅니다.
+ Unity 게임 클라이언트에 Amazon GameLift Servers 추가의 지침을 따릅니다.

Anywhere 플릿에 연결하는 게임 클라이언트의 경우 게임 클라이언트에 다음 정보가 필요합니다. 플러그인은 플러그인에서 생성한 리소스를 사용하도록 게임 프로젝트를 자동으로 업데이트합니다.
+ FleetId - Anywhere 플릿의 고유 식별자입니다.
+ FleetLocation - Anywhere 플릿의 사용자 지정 위치입니다.
+ AwsRegion - Anywhere 플릿이 호스팅되는 AWS 리전입니다. 사용자 프로필에 설정한 리전입니다.
+ ProfileName - 용 AWS SDK에 대한 액세스를 허용하는 로컬 시스템의 AWS 자격 증명 프로파일Amazon GameLift Servers입니다. 게임 클라이언트는 이러한 자격 증명을 사용하여 Amazon GameLift Servers 서비스에 대한 요청을 인증합니다.

**참고**  
자격 증명 프로필은 플러그인에서 생성되어 로컬 시스템에 저장됩니다. 따라서 로컬 시스템(또는 프로필이 동일한 시스템)에서 클라이언트를 실행해야 합니다.

## Anywhere 플릿 연결
<a name="unity-plug-in-anywhere-fleet"></a>

이 단계에서는 사용할 Anywhere 플릿을 지정합니다. Anywhere 플릿은 게임 서버 호스팅을 위해 어디에서나 배치할 수 있는 컴퓨팅 리소스 모음을 정의합니다.
+ 현재 사용 중인 AWS 계정에 기존 Anywhere 플릿이 있는 경우 **플릿 이름** 드롭다운 필드를 열고 플릿을 선택합니다. 이 드롭다운에는 현재 활성 사용자 프로필에 대한 AWS 리전의 Anywhere 플릿만 표시됩니다.
+ 기존 플릿이 없거나 새 플릿을 생성하려는 경우 **새 Anywhere 플릿 생성**을 선택하고 플릿 이름을 입력합니다.

프로젝트에 Anywhere 플릿을 선택하면 Amazon GameLift Servers는 플릿 상태가 활성 상태인지 확인하고 플릿 ID를 표시합니다. Unity 편집기의 출력 로그에서 이 요청의 진행 상황을 추적할 수 있습니다.

## 컴퓨팅 등록
<a name="unity-plug-in-anywhere-register"></a>

이 단계에서는 로컬 워크스테이션을 새로운 Anywhere 플릿의 컴퓨팅 리소스로 등록합니다.

1. 로컬 시스템의 컴퓨팅 이름을 입력합니다. 플릿에 두 개 이상의 컴퓨팅을 추가하는 경우 이름은 고유해야 합니다.

1. **컴퓨팅 등록**을 선택합니다. Unity 편집기의 출력 로그에서 이 요청의 진행 상황을 추적할 수 있습니다.

플러그인이 IP 주소가 localhost(127.0.0.1)로 설정된 로컬 워크스테이션을 등록합니다. 이 설정은 동일한 시스템에서 게임 클라이언트와 서버를 실행한다고 가정합니다.

이 작업에 대한 응답으로 Amazon GameLift Servers는 컴퓨팅에 연결할 수 있는지 확인하고 새로 등록된 컴퓨팅에 대한 정보를 반환합니다.

## 게임 시작
<a name="unity-plug-in-anywhere-launch"></a>

이 단계에서는 게임 구성 요소를 빌드하고 시작하여 게임을 플레이합니다. 다음 단계를 완료합니다.

1. 게임 클라이언트를 구성합니다. 이 단계에서는 플러그인에 게임 프로젝트의 `GameLiftClientSettings` 에셋을 업데이트하라는 메시지를 표시합니다. 플러그인은 이 에셋을 사용하여 게임 클라이언트가 Amazon GameLift Servers 서비스에 연결하는 데 필요한 특정 정보를 저장합니다.

   1. 샘플 게임을 가져오고 초기화하지 않은 경우 새 `GameLiftClientSettings` 에셋을 생성합니다. Unity 편집기 기본 메뉴에서 **Assets, Create, Amazon GameLift, Client Settings**를 선택합니다. 프로젝트에 `GameLiftClientSettings` 사본을 여러 개 생성하면 플러그인이 이를 자동으로 감지하고 플러그인이 업데이트할 에셋을 알려줍니다.

   1. **게임 시작**에서 **클라이언트 구성: Anywhere 설정 적용**을 선택합니다. 이 작업은 방금 설정한 Anywhere 플릿을 사용하도록 게임 클라이언트 설정을 업데이트합니다.

1. 게임 클라이언트를 빌드하고 실행합니다.

   1. 표준 Unity 빌드 프로세스를 사용하여 클라이언트 실행 파일을 빌드합니다. **File, Build Settings**에서 플랫폼을 **Windows, Mac, Linux**로 전환합니다. 샘플 게임을 가져와 설정을 초기화하면 빌드 목록과 빌드 대상이 자동으로 업데이트됩니다.

   1. 새로 빌드된 게임 클라이언트 실행 파일의 인스턴스를 하나 이상 시작합니다.

1. Anywhere 플릿에서 게임 서버를 시작합니다. Editor에서 **서버: 서버 시작**을 선택합니다. 이 작업은 Unity 편집기가 열려 있는 한 클라이언트가 연결할 수 있는 라이브 서버를 시작합니다.

1. 게임 세션을 시작하거나 연결합니다. 게임 클라이언트 인스턴스에서 UI를 사용하여 각 클라이언트가 게임 세션에 연결합니다. 클라이언트에 기능을 추가한 방법에 따라 작동 방식은 달라집니다.

샘플 게임 클라이언트를 사용하는 경우 다음과 같은 특성이 있습니다.
+ 플레이어 로그인 구성 요소 Anywhere 플릿의 게임 서버에 연결할 때는 플레이어 검증이 없습니다. 아무 값이나 입력하여 게임 세션에 연결할 수 있습니다.
+ 간단한 게임 연결 UI 클라이언트가 게임에 연결하려고 하면 클라이언트가 사용 가능한 플레이어 슬롯이 있는 활성 게임 세션을 자동으로 찾습니다. 게임 세션을 사용할 수 없는 경우 클라이언트가 새 게임 세션을 요청합니다. 게임 세션을 사용할 수 있는 경우 클라이언트가 사용 가능한 게임 세션에 연결하도록 요청합니다. 동시에 여러 클라이언트로 게임을 테스트할 때 첫 번째 클라이언트는 게임 세션을 시작하고 나머지 클라이언트는 자동으로 기존 게임 세션에 연결합니다.
+ 플레이어 슬롯 4개가 있는 게임 세션 최대 4개의 게임 클라이언트 인스턴스를 동시에 시작할 수 있으며 동일한 게임 세션에 연결합니다.

**서버 실행 파일에서 시작(선택 사항)**

Anywhere 플릿에서 테스트할 게임 서버 실행 파일을 빌드하고 시작할 수 있습니다.

1. 표준 Unity 빌드 프로세스를 사용하여 서버 실행 파일을 빌드합니다. **파일, 빌드 설정**에서 플랫폼을 **전용 서버**로 전환하고 빌드합니다.

1. Anywhere 플릿 ID 및 AWS 리전을 사용하여 AWS CLI 명령 [get-compute-auth-token](https://docs.aws.amazon.com/cli/latest/reference/gamelift/get-compute-auth-token.html)을 호출하여 단기 인증 토큰을 가져옵니다. 플릿을 생성할 때 플릿 ID가 **Connect to a Anywhere Fleet**에 표시됩니다. 활성 프로필을 선택하면 AWS 리전이 프로필 설정에 표시됩니다. **** 

   ```
   aws gamelift get-compute-auth-token --fleet-id [your anywhere fleet ID] --region [your AWS region]
   ```

1. 명령줄에서 새로 빌드된 게임 서버 실행 파일을 시작하고 유효한 인증 토큰을 전달합니다.

   ```
   my_project.exe --authToken [token]
   ```

# Unity용 플러그인: 관리형 EC2 플릿에 게임 배포
<a name="unity-plug-in-ec2"></a>

이 워크플로에서는 플러그인을 사용하여 Amazon GameLift Servers에서 관리하는 클라우드 기반 컴퓨팅 리소스에서 호스팅하도록 게임을 준비합니다. Amazon GameLift Servers 기능을 위한 클라이언트 및 서버 게임 코드를 추가한 다음, 서버 빌드를 Amazon GameLift Servers 서비스에 업로드하여 호스팅합니다. 이 워크플로가 완료되면 클라우드에서 실행하는 게임 서버가 생기고 서버를 연결할 게임 클라이언트가 작동합니다.

**Amazon GameLift Servers 관리형 Amazon EC2 워크플로를 시작하려면**
+ Unity 편집기 기본 도구 모음에서 **Amazon GameLift Servers** > **관리형 EC2와 호스트**를 선택합니다. 이 워크플로는 게임 구성 요소를 통합, 빌드 및 시작하는 6단계 프로세스로 이루어집니다.

## 프로필 설정
<a name="unity-plug-in-ec2-profile"></a>

이 워크플로를 따를 때 사용할 프로필을 선택합니다. 선택한 프로필은 워크플로의 모든 단계에 영향을 줍니다. 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

1. 사용 가능한 프로필 드롭다운 목록에서 프로필을 선택합니다. 아직 프로필이 없거나 새 프로필을 생성하려면 Amazon GameLift Servers 메뉴로 이동하여 ** AWS 계정 프로필 설정을** 선택합니다.

1. 부트스트랩 상태가 “활성”이 아닌 경우, **프로필 부트스트랩**을 선택하고 상태가 “활성”으로 변경될 때까지 기다립니다.

## 게임을 Amazon GameLift Servers에 통합
<a name="unity-plug-in-ec2-integrate"></a>

이 작업에서는 게임 프로젝트의 클라이언트 및 서버 코드를 업데이트합니다.
+ 게임 서버는 Amazon GameLift Servers 서비스와 통신하여 게임 세션을 시작하고, 게임 세션 연결 정보를 제공하고, 상태를 보고하라는 프롬프트를 받을 수 있어야 합니다.
+ 게임 클라이언트는 게임 세션에 대한 정보를 얻고, 게임 세션에 연결하거나 시작하고, 게임에 연결하기 위한 연결 정보를 얻을 수 있어야 합니다.

**참고**  
샘플 게임을 가져온 경우 이 단계를 건너뛸 수 있습니다. 샘플 게임 에셋에는 이미 필요한 서버 및 클라이언트 코드가 있습니다.

### 서버 코드 통합
<a name="unity-plug-in-ec2-integrate-server"></a>

사용자 지정 씬에서 자체 게임 프로젝트 사용 시 제공된 샘플 코드를 사용하여 게임 프로젝트에 필요한 서버 코드를 추가합니다. Anywhere 플릿을 사용하여 테스트할 게임 프로젝트를 통합한 경우 이 단계의 지침은 이미 완료된 상태입니다.

1. 게임 프로젝트 파일에서 `Assets/Scripts/Server` 폴더를 엽니다. 파일이 없으면 새로 생성합니다.

1. GitHub 리포지토리 [aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity)로 이동하여 `Samples~/SampleGame/Assets/Scripts/Server` 경로를 엽니다.

1. `GameLiftServer.cs` 파일을 찾아 게임 프로젝트의 `Server` 폴더에 복사합니다. 서버 실행 파일을 빌드할 때 이 파일을 빌드 대상으로 사용합니다.

샘플 코드에는 Amazon GameLift Servers C\$1 서버 SDK(버전 5)를 사용하는 다음과 같은 최소 필수 요소가 포함됩니다.
+ Amazon GameLift Servers API 클라이언트를 초기화합니다. Amazon GameLift Servers Anywhere 플릿에는 서버 파라미터를 사용한 InitSDK() 호출이 필요합니다. 이러한 설정은 플러그인에서 사용하도록 자동으로 설정됩니다.
+ `OnStartGameSession`, `OnProcessTerminate`, `onHealthCheck`를 포함한 Amazon GameLift Servers 서비스의 요청에 응답하는 필수 콜백 함수를 구현합니다.
+ 지정된 포트와 함께 `ProcessReady()`를 호출하여 서버 프로세스가 게임 세션을 호스팅할 준비가 되면 Amazon GameLift Servers 서비스에 알립니다.

샘플 서버 코드를 사용자 지정하려면 다음 리소스를 참조하세요.
+ [서버 SDK를 사용하여 게임 서버에 Amazon GameLift Servers를 추가합니다.](gamelift-sdk-server-api.md)
+ [Amazon GameLift Servers용 C\$1 서버 SDK 5.x - 작업](integration-server-sdk5-csharp-actions.md)

### 클라이언트 코드 통합
<a name="unity-plug-in-ec2-integrate-client"></a>

클라우드 기반 게임 서버에 연결하는 게임 클라이언트의 경우 게임 클라이언트에서 직접 호출하는 대신 클라이언트 측 백엔드 서비스를 사용하여 Amazon GameLift Servers 서비스에 직접 호출하는 것이 가장 좋습니다.

관리형 EC2 플릿에서 호스팅하기 위한 플러그인 워크플로에서 각 배포 시나리오에는 다음 구성 요소를 포함하는 사전 구축된 백엔드 서비스가 포함됩니다.
+ 게임 세션을 요청하고 게임 세션 정보를 검색하는 데 사용되는 Lambda 함수 및 DynamoDB 테이블 세트 이러한 구성 요소는 API 게이트웨이를 프록시로 사용합니다.
+ 고유한 플레이어 ID를 생성하고 플레이어 연결을 인증하는 Amazon Cognito 사용자 풀

이러한 구성 요소를 사용하려면 게임 클라이언트가 다음을 수행하기 위해 백엔드 서비스에 요청을 보내는 기능이 필요합니다.
+  AWS Cognito 사용자 풀에서 플레이어 사용자를 생성하고 인증합니다.
+ 게임 세션에 연결하고 연결 정보를 수신합니다.
+ 매치메이킹을 사용하여 게임에 연결합니다.

다음 리소스를 가이드로 사용합니다.
+ GitHub 리포지토리 [aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity)에서 클라이언트를 [GameLiftCoreApi](https://github.com/aws/amazon-gamelift-plugin-unity/blob/main/Runtime/GameLiftCoreApi.cs) 클래스와 통합합니다. 이 클래스는 플레이어 인증 및 게임 세션 정보 검색에 대한 제어를 제공합니다.
+ 샘플 게임 통합에 대한 내용은 GitHub 리포지토리 [aws/amazon-gamelift-plugin-unity ](https://github.com/aws/amazon-gamelift-plugin-unity), `Samples~/SampleGame/Assets/Scripts/Client/GameLiftClient.cs`에서 확인하세요.
+ [Amazon GameLift Servers 게임 클라이언트 기능 통합](gamelift-sdk-client-api.md).

### (Unity 6.3 이상만 해당) install.sh 스크립트 통합
<a name="unity-plug-in-ec2-integrate-install-script"></a>

Linux의 Unity 6.3에는 glibc 2.35가 필요합니다. Amazon Linux 2023에는 glibc 2.34가 포함되어 있습니다. 소스에서 glibc 2.35를 빌드하고 glibc 2.35를 사용하도록 Unity 바이너리를 구성하는 작업을 처리하는 install.sh 스크립트가 제공됩니다.

1. GitHub 리포지토리 [aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity)로 이동하여 `ExtraServerResources` 경로를 엽니다.

1. 파일을 찾아 서버 빌드가 포함된 폴더에 `install.sh` 복사합니다.

1.  기존가 있는 경우 두 스크립트의 내용을 단일 로 `install.sh`병합합니다`install.sh`.

## 배포 시나리오 선택
<a name="unity-plug-in-ec2-scenarios"></a>

이 단계에서는 지금 배포하려는 게임 호스팅 솔루션을 선택합니다. 어떤 시나리오로든 게임을 여러 번 배포할 수 있습니다.
+ **단일 리전 플릿:** 활성 프로파일의 기본 AWS 리전에 있는 단일 호스팅 리소스 플릿에 게임 서버를 배포합니다. 이 시나리오는 AWS 및 서버 빌드 구성과의 서버 통합을 테스트하기 위한 좋은 출발점입니다. 다음과 같은 리소스를 배포합니다.
  + 게임 서버 빌드가 설치되어 실행 중인AWS 플릿(온디맨드).
  + 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
  + 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
  + API 게이트웨이에 대한 과도한 플레이어 호출을 제한하기 위한 WebACl.
  + API 게이트웨이 \$1 플레이어가 게임 슬롯을 요청할 수 있는 Lambda 함수. 이 함수는 사용할 수 없는 경우 `CreateGameSession()`을 호출합니다.
  + API 게이트웨이 \$1 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 Lambda 함수.
+ **FlexMatch 플릿:** 게임 서버를 플릿 세트에 배포하고 플레이어 매치를 생성하는 규칙이 포함된 FlexMatch 매치메이커를 설정합니다. 이 시나리오에서는 다중 플릿, 다중 위치 구조와 함께 저비용 스팟 호스팅을 사용하여 가용성을 지속적으로 유지합니다. 이 방식은 호스팅 솔루션용 매치메이커 구성 요소 설계를 시작할 준비가 되었을 때 유용합니다. 이 시나리오에서는 이 솔루션의 기본 리소스를 만들고 필요에 따라 나중에 사용자 지정할 수 있습니다. 다음과 같은 리소스를 배포합니다.
  + FlexMatch 매치메이킹 구성 및 매치메이킹 규칙은 플레이어 요청을 수락하고 매치를 구성하도록 설정됩니다.
  + 게임 서버 빌드가 여러 위치에 설치되어 실행 중인 AWS 플릿 3대. 백업용으로 스팟 플릿 2개와 온디맨드 플릿 1개가 포함됩니다.
  + AWS 게임 세션 배치 대기열은 (실행 가능성, 비용, 플레이어 지연 시간 등을) 기반으로 가능한 최상의 호스팅 리소스를 찾고 게임 세션을 시작하여 제안된 매치에 대한 요청을 충족시켜 줍니다.
  + 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
  + 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
  + API 게이트웨이에 대한 과도한 플레이어 호출을 제한하기 위한 WebACl.
  + API 게이트웨이 \$1 플레이어가 게임 슬롯을 요청할 수 있는 Lambda 함수. `StartMatchmaking()` 함수를 호출합니다.
  + API 게이트웨이 \$1 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 Lambda 함수.
  + 플레이어용 매치메이킹 티켓과 게임 세션 정보를 저장하는 Amazon DynamoDB 테이블.
  + SNS 주제 \$1 GameSessionQueue 이벤트를 처리하는 Lambda 함수.

## 게임 파라미터 설정
<a name="unity-plug-in-ec2-parameters"></a>

이 단계에서는에 업로드할 게임을 설명합니다 AWS.
+ **게임 이름:** 게임 프로젝트에 유의미한 이름을 제공합니다. 이 이름은 플러그인 내에서 사용됩니다.
+ **플릿 이름:** 관리형 EC2 플릿에 의미 있는 이름을 제공합니다. Amazon GameLift Servers는 AWS 콘솔에 리소스를 나열할 때 이 이름(플릿 ID와 함께)을 사용합니다.
+ **빌드 이름:** 서버 빌드에 의미 있는 이름을 제공합니다.이 이름을 AWS 사용하여에 업로드Amazon GameLift Servers되고 배포에 사용되는 서버 빌드의 사본을 참조합니다.
+ **시작 파라미터:** 관리형 EC2 플릿 인스턴스에서 서버 실행 파일을 시작할 때 실행할 선택적 지침을 입력합니다. 최대 길이는 1024자입니다.
+ **게임 서버 폴더:** 서버 빌드를 포함하는 로컬 폴더의 경로를 제공합니다.
+ **게임 서버 파일:** 서버 실행 파일 이름을 지정합니다.

## 시나리오 배포
<a name="unity-plug-in-ec2-deploy"></a>

이 단계에서는 선택한 배포 시나리오에 따라 게임을 클라우드 호스팅 솔루션에 배포합니다. 이 프로세스는 AWS 가 서버 빌드를 검증하고, 호스팅 리소스를 프로비저닝하며, 게임 서버를 설치하고, 서버 프로세스를 시작하며, 게임 세션을 호스팅할 준비를 하는 데 몇 분 정도 소요될 수 있습니다.

배포를 시작하려면 **CloudFormation 배포**를 선택합니다. 여기에서 게임 호스팅 상태를 추적할 수 있습니다. 자세한 내용을 알아보려면에 대한 AWS AWS 관리 콘솔에 로그인하고 이벤트 알림을 볼 수 있습니다. 플러그인의 활성 사용자 프로필과 동일한 계정, 사용자 및 AWS 리전을 사용하여 로그인해야 합니다.

배포가 완료되면 게임 서버가 AWS EC2 인스턴스에 설치됩니다. 하나 이상의 서버 프로세스가 실행 중이며 게임 세션을 시작할 준비가 되었습니다.

## 게임 클라이언트 실행
<a name="unity-plug-in-ec2-launch"></a>

플릿이 성공적으로 배포되면 이제 게임 서버를 실행하고 게임 세션을 호스팅할 수 있습니다. 이제 클라이언트를 빌드하고 시작하여 게임 세션을 할 수 있습니다.

1. 게임 클라이언트를 구성합니다. 이 단계에서는 플러그인에 게임 프로젝트의 `GameLiftClientSettings` 에셋을 업데이트하라는 메시지를 표시합니다. 플러그인은 이 에셋을 사용하여 게임 클라이언트가 Amazon GameLift Servers 서비스에 연결하는 데 필요한 특정 정보를 저장합니다.

   1. 샘플 게임을 가져오고 초기화하지 않은 경우 새 `GameLiftClientSettings` 에셋을 생성합니다. Unity 편집기 기본 메뉴에서 **Assets, Create, Amazon GameLift, Client Settings**를 선택합니다. 프로젝트에 `GameLiftClientSettings` 사본을 여러 개 생성하면 플러그인이 이를 자동으로 감지하고 플러그인이 업데이트할 에셋을 알려줍니다.

   1. **게임 시작**에서 **클라이언트 구성: 관리형 EC2 설정 적용**을 선택합니다. 이 작업은 방금 배포한 관리형 EC2 플릿을 사용하도록 게임 클라이언트 설정을 업데이트합니다.

1. 게임 클라이언트를 빌드합니다. 표준 Unity 빌드 프로세스를 사용하여 클라이언트 실행 파일을 빌드합니다. File, Build Settings에서 플랫폼을 Windows, Mac, Linux로 전환합니다. 샘플 게임을 가져와 설정을 초기화하면 빌드 목록과 빌드 대상이 자동으로 업데이트됩니다.

1. 새로 빌드된 게임 클라이언트 실행 파일을 시작합니다. 게임 플레이를 시작하려면 2\$14개의 클라이언트 인스턴스를 시작하고 각각의 UI로 게임 세션에 연결합니다.

샘플 게임 클라이언트를 사용하는 경우 다음과 같은 특성이 있습니다.
+ 플레이어 로그인 구성 요소 Anywhere 플릿의 게임 서버에 연결할 때는 플레이어 검증이 없습니다. 아무 값이나 입력하여 게임 세션에 연결할 수 있습니다.
+ 간단한 게임 연결 UI 클라이언트가 게임에 연결하려고 하면 클라이언트가 사용 가능한 플레이어 슬롯이 있는 활성 게임 세션을 자동으로 찾습니다. 게임 세션을 사용할 수 없는 경우 클라이언트가 새 게임 세션을 요청합니다. 게임 세션을 사용할 수 있는 경우 클라이언트가 사용 가능한 게임 세션에 연결하도록 요청합니다. 동시에 여러 클라이언트로 게임을 테스트할 때 첫 번째 클라이언트는 게임 세션을 시작하고 나머지 클라이언트는 자동으로 기존 게임 세션에 연결합니다.
+ 플레이어 슬롯 4개가 있는 게임 세션 최대 4개의 게임 클라이언트 인스턴스를 동시에 시작할 수 있으며 동일한 게임 세션에 연결합니다.

# Unity용 플러그인: 관리형 컨테이너 플릿에 게임 배포
<a name="unity-plug-in-container"></a>

이 안내 플러그인 워크플로를 사용하여 게임 서버의 컨테이너 이미지를 생성하고 컨테이너 기반 호스팅 솔루션에 배포합니다. 이 워크플로를 성공적으로 완료하면 컨테이너화된 게임 서버가 클라우드에서 실행되며 플러그인을 사용하여 게임 클라이언트를 시작하고, 게임 세션에 연결하며, 게임을 플레이할 수 있습니다.

## 시작하기 전에
<a name="unity-plug-in-container-prereqs"></a>

이 워크플로는 다음 작업을 완료했다고 가정합니다.
+ **게임 서버 코드를 Amazon GameLift Servers 서버 SDK와 통합합니다.** 호스팅하는 게임 서버는 새 게임 세션을 시작하고 게임 세션 상태를 보고하라는 요청에 응답할 수 있도록 Amazon GameLift Servers 서비스와 통신할 수 있어야 합니다. 이 작업을 완료하지 않은 경우 먼저 플러그인 워크플로우인 Anywhere로 호스팅을 따르는 것이 좋습니다. 게임 서버 코드 준비에 대한 지침은 [서버 코드 통합](unity-plug-in-anywhere.md#unity-plug-in-anywhere-integrate-server) 섹션을 참조하세요. 관리형 컨테이너 플릿의 경우 게임을 서버 SDK 버전 5.2 이상과 통합해야 합니다.
**참고**  
샘플 게임을 가져온 경우이 작업이 이미 완료됩니다.
+ **Linux에서 실행할 게임 서버 실행 파일을 패키징합니다.**
+ **게임 서버 빌드와 함께 배포할 파일을 수집합니다.** 로컬 시스템에서 작업 디렉터리를 생성하여 파일을 구성합니다. 해당 파일은 게임 서버 컨테이너 이미지로 구축됩니다. 여기에는 게임 종속성, 컨테이너 시작 시 게임 서버 및 기타 프로세스를 실행하는 스크립트 등을 포함할 수 있습니다.
+ **Amazon GameLift Servers를 사용한 게임 클라이언트 코드를 통합합니다.** 이 작업을 완료하는 한 가지 방법은 이미 통합된 샘플 자산(플러그인에 포함됨)을 추가하는 것입니다. 게임 클라이언트 코드 준비에 대한 지침은 [클라이언트 코드 통합](unity-plug-in-anywhere.md#unity-plug-in-anywhere-integrate-client) 섹션을 참조하세요.
+ **로컬 컴퓨터에 Docker를 설치합니다.** 플러그인이 컨테이너 이미지를 생성하여 ECR 리포지토리로 푸시하도록 하려면 이 도구를 설치해야 합니다. 또는 이러한 작업을 수동으로 수행하고 플러그인에 기존 컨테이너 이미지를 사용하도록 지시할 수 있습니다. 이미지를 수동으로 빌드하는 방법에 대한 자세한 내용은 [Amazon GameLift Servers용 컨테이너 이미지 빌드](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/containers-prepare-images.html)를 참조하세요.

**Amazon GameLift Servers 관리형 컨테이너 워크플로를 시작하려면:**
+ Unity 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **관리형 컨테이너**를 선택합니다. 이 작업을 수행하면 **관리형 컨테이너가 있는 호스트** 플러그인 페이지가 열립니다. 이 페이지는 게임 서버 빌드로 컨테이너 이미지를 생성하고, 컨테이너 플릿에 배포하며, 게임을 시작하는 단계별 프로세스를 제공합니다.

## 0단계: 프로필 설정
<a name="unity-plug-in-container-profile"></a>

이 섹션에는 현재 선택한 사용자 프로필이 표시됩니다. 현재 사용자 프로필이 이 워크플로에 사용할 프로필인지 확인합니다. 이 워크플로에서 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

다음과 같은 경우 선택한 사용자 프로필을 수정해야 할 수 있습니다.
+ 현재 선택된 프로필이 없습니다.
+ 다른 프로필을 선택하거나 새 프로필을 생성하려고 합니다.
+ 선택한 프로필을 부트스트랩해야 합니다(부트스트랩 상태가 비활성인 경우).

**선택한 사용자 프로필을 설정하거나 변경하려면**
+ Amazon GameLift Servers 메뉴에서 ** AWS 액세스 자격 증명 열기를** 선택합니다.

## 1단계: 컨테이너 준비 상태 평가
<a name="unity-plug-in-container-assess"></a>

게임 서버를 컨테이너 플릿에 배포하기 전에 컨테이너 이미지에 패키징하고 Amazon ECR 리포지토리에 저장해야 합니다. 플러그인은 이러한 작업을 사용자를 대신하여 완료할 수 있으며 이러한 작업을 수동으로 수행할 수 있습니다. 이 단계에서는 컨테이너 이미지 및 ECR 리포지토리의 상태에 대한 정보를 제공합니다.

평가 질문을 사용하여 플러그인에 수행해야 할 단계를 알려줍니다.
+ **새 컨테이너 이미지를 생성합니다.** 이 옵션을 선택하면 다음 단계에서 게임 서버 빌드 디렉터리의 위치와 빌드 실행 파일을 묻는 메시지가 표시됩니다. 플러그인은 Dockerfile 템플릿(Amazon GameLift Servers에서 제공)을 사용하고 게임에 맞게 자동으로 구성합니다. [Amazon GameLift Servers용 컨테이너 이미지 빌드](containers-prepare-images.md)에서 템플릿을 확인할 수 있습니다. 이 옵션을 선택한 후 플러그인이 새 이미지를 저장할 위치를 지정합니다.
  + 새 Amazon ECR 리포지토리를 생성하고 여기에 컨테이너 이미지를 푸시합니다. 플러그인은 선택한 사용자 프로필 AWS 리전 에서 AWS 계정 및 기본값을 사용하여 프라이빗 ECR 리포지토리를 생성합니다.
  + 이전에 생성된 Amazon ECR 리포지토리에 컨테이너 이미지를 푸시합니다. 이 옵션을 선택하면 다음 단계에서 목록에서 기존 Amazon ECR 리포지토리를 선택하라는 메시지가 표시됩니다. 목록에는 선택한 사용자 프로필의 AWS 계정 및 기본값 AWS 리전 에 대한 모든 Amazon ECR 리포지토리가 포함됩니다. 퍼블릭 또는 프라이빗 리포지토리를 선택할 수 있습니다.
+ **기존 컨테이너 이미지를 사용합니다.** 이미지를 수동으로 빌드한 경우 Amazon GameLift Servers에서 제공하는 Dockerfile 템플릿을 사용하는 것이 좋으며, 이 템플릿은 [Amazon GameLift Servers용 컨테이너 이미지 빌드](containers-prepare-images.md)에서 사용할 수 있습니다. 이 옵션을 선택한 후 이미지의 위치를 지정합니다.
  + 로컬에 저장된 Docker 생성 이미지입니다. 이 옵션을 선택하면 플러그인이 새 Amazon ECR 프라이빗 리포지토리를 생성하고 로컬 이미지 파일을 푸시합니다. 다음 단계에서는 플러그인이 이미지 파일을 찾는 데 사용하는 이미지 ID를 묻는 메시지가 표시됩니다.
  + Amazon ECR 리포지토리에 이미 저장된 컨테이너 이미지입니다. 이 옵션을 선택하면 다음 단계에서 목록의 기존 Amazon ECR 리포지토리 및 이미지를 선택하라는 메시지가 표시됩니다. 목록에는 선택한 사용자 프로필의 AWS 계정 및 기본값 AWS 리전 에 대한 모든 Amazon ECR 리포지토리가 포함됩니다. 퍼블릭 또는 프라이빗 리포지토리를 선택할 수 있습니다.
  +  Linux의 Unity 6.3에는 glibc 2.35가 필요합니다. Amazon Linux 2023에는 glibc 2.34가 포함되어 있습니다. 소스에서 glibc 2.35를 빌드하고 glibc 2.35를 사용하도록 Unity 바이너리를 구성하는 작업을 처리하는 Dockerfile 템플릿이 아래에 제공됩니다.

### Unity 6.3 게임 서버 컨테이너 이미지용 Dockerfile 템플릿
<a name="w2aab9c11b9c21c27c11c11b1"></a>

이 템플릿은 Amazon GameLift Servers 플릿에서 게임 서버 컨테이너를 사용하는 데 필요한 최소 지침을 포함합니다. 게임 서버의 필요에 따라 콘텐츠를 수정합니다.

```
# Base image
# ----------
  # Add the base image that you want to use over here,
  # Make sure to use an image with the same architecture as the
  # Instance type you are planning to use on your fleets.
FROM public.ecr.aws/amazonlinux/amazonlinux

# Game build directory
# --------------------
  # Add your game build directory in the 'GAME_BUILD_DIRECTORY' env variable below.
  #
# Game executable
# ---------------
  # Add the relative path to your executable in the 'GAME_EXECUTABLE' env variable below.
  # The game build provided over here needs to be integrated with gamelift server sdk.
  # This template assumes that the executable path is relative to the game build directory.
  #
# Launch parameters
# -----------------
  # Add any launch parameters to pass into your executable in the 'LAUNCH_PARAMS' env variable below.
  #
# Default directory
# -----------------
  # The value provided in 'HOME_DIR' below will be where the game executable and logs exist.
  #
ARG GAME_BUILD_DIRECTORY
ARG GAME_EXECUTABLE
ARG LAUNCH_PARAMS

ENV GAME_BUILD_DIRECTORY=$GAME_BUILD_DIRECTORY \
    GAME_EXECUTABLE=$GAME_EXECUTABLE \
    LAUNCH_PARAMS=$LAUNCH_PARAMS \
    HOME_DIR="/local/game"

# install dependencies as necessary
RUN yum install -y shadow-utils bison wget gcc make patchelf tar gzip && \
    yum clean all && rm -fr /var/cache

RUN mkdir -p $HOME_DIR
COPY .$GAME_BUILD_DIRECTORY/ $HOME_DIR

# Change directory to home
WORKDIR $HOME_DIR

# Build glibc 2.35 and patch Unity binaries
RUN GLIBC_VERSION="2.35" && \
    INSTALL_PREFIX="/opt/glibc-${GLIBC_VERSION}" && \
    ARCH=$(uname -m) && \
    if [ "$ARCH" = "x86_64" ]; then \
        INTERPRETER="${INSTALL_PREFIX}/lib/ld-linux-x86-64.so.2"; \
        MONO_ARCH="x86_64"; \
    elif [ "$ARCH" = "aarch64" ]; then \
        INTERPRETER="${INSTALL_PREFIX}/lib/ld-linux-aarch64.so.1"; \
        MONO_ARCH="aarch64"; \
    else \
        echo "ERROR: Unsupported architecture: $ARCH"; exit 1; \
    fi && \
    cd /tmp && \
    wget -q "https://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_VERSION}.tar.gz" && \
    tar -xzf "glibc-${GLIBC_VERSION}.tar.gz" && \
    cd "glibc-${GLIBC_VERSION}" && mkdir glibc-build && cd glibc-build && \
    touch /etc/ld.so.conf && \
    ../configure --prefix="${INSTALL_PREFIX}" && \
    make -s all && make -s install && \
    cd / && rm -rf /tmp/glibc-* && \
    GLIBC_LIB="${INSTALL_PREFIX}/lib" && \
    EXECUTABLE_NAME=$(echo "$GAME_EXECUTABLE" | sed 's/\.[^.]*$//') && \
    DATA_DIR="$HOME_DIR/${EXECUTABLE_NAME}_Data" && \
    patchelf --set-interpreter "$INTERPRETER" "$HOME_DIR/$GAME_EXECUTABLE" && \
    patchelf --set-rpath "$GLIBC_LIB:$HOME_DIR:/lib64:$DATA_DIR/MonoBleedingEdge/$MONO_ARCH" "$HOME_DIR/$GAME_EXECUTABLE" && \
    patchelf --set-rpath "$GLIBC_LIB:/lib64" "$HOME_DIR/UnityPlayer.so" && \
    MONO_LIB="$DATA_DIR/MonoBleedingEdge/$MONO_ARCH/libmonobdwgc-2.0.so" && \
    if [ -f "$MONO_LIB" ]; then patchelf --set-rpath "$GLIBC_LIB:/lib64" "$MONO_LIB"; fi && \
    GAME_ASSEMBLY="$HOME_DIR/GameAssembly.so" && \
    if [ -f "$GAME_ASSEMBLY" ]; then patchelf --set-rpath "$GLIBC_LIB:/lib64" "$GAME_ASSEMBLY"; fi

RUN useradd -m gamescale && \
    echo "gamescale ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
    chown -R gamescale:gamescale $HOME_DIR

# Add permissions to game build
RUN chmod +x ./$GAME_EXECUTABLE

USER gamescale

# Check directory before starting the container
RUN ls -lhrt .

# Check path before starting the container
RUN echo $PATH

# Start the game build
ENTRYPOINT ["/bin/sh", "-c", "./$GAME_EXECUTABLE $LAUNCH_PARAMS"]
```

## 2단계: 이미지 배포 구성
<a name="unity-plug-in-container-configure"></a>

이 단계에서는 플러그인이 컨테이너 플릿에 컨테이너 이미지를 배포하는 데 필요한 정보를 제공합니다. 이 단계에서는 다음 정보를 요청합니다.
+ 1단계에서 선택한 항목을 기반으로 한 게임 서버 빌드, 컨테이너 이미지 또는 Amazon ECR 리포지토리의 위치입니다.
+ 관리형 컨테이너 배포에 사용할 시나리오입니다.
+ 선택적 배포 설정. 이 섹션에는 플러그인이 기본적으로 사용하는 구성 설정이 있습니다. 이를 수정하거나 기본값을 유지할 수 있습니다.
  + 기본적으로 게임 이름은 게임 프로젝트 이름으로 설정됩니다. 플러그인이 생성하는 모든 AWS 리소스는 게임 이름 값을 참조합니다.
  + 포트 범위, 메모리 제한, vCPU 제한은 컨테이너 플릿의 구성 설정입니다. 이러한 값을 사용자 지정하는 방법에 대한 자세한 내용은 연결 포트 범위는 [네트워크 연결 구성](containers-design-fleet.md#containers-custom-network) 섹션을 참조하고 리소스 제한은 [리소스 제한 설정](containers-design-fleet.md#containers-design-fleet-limits) 섹션을 참조하세요.
  + 컨테이너 이미지 태그는 Amazon ECR에서 컨테이너 이미지를 분류하는 데 사용됩니다. 기본값은 `unity-gamelift-plugin`입니다.

### 배포 시나리오 옵션
<a name="unity-plug-in-container-configure-scenarios"></a>

#### 단일 리전 컨테이너 플릿
<a name="w2aab9c11b9c21c27c13b7b3b1"></a>

이 시나리오에서는 게임 서버를 단일 컨테이너 플릿에 배포합니다. 이는 AWS 및 컨테이너 구성과의 서버 통합을 테스트하기 위한 좋은 시작점입니다. 다음과 같은 리소스를 배포합니다.
+ Amazon GameLift Servers 컨테이너 그룹 정의는 컨테이너 플릿에서 컨테이너 이미지를 배포하고 실행하는 방법을 설명합니다.
+ 별칭을 사용하여 게임 서버 컨테이너가 설치되고 실행 중인 Amazon GameLift Servers 컨테이너 플릿(온디맨드).
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
+ 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
+ API Gateway에 대한 과도한 플레이어 호출을 스로틀링하기 위한 웹 액세스 제어 목록(ACL).
+ 게임 세션을 요청하고 게임에 참여하는 등 게임 클라이언트를 대신하여 Amazon GameLift Servers 서비스에 요청하는 백엔드 서비스: 
  + 플레이어가 게임 세션 슬롯을 요청할 수 있는 API Gateway \$1 Lambda 함수. 이 함수는 슬롯이 확보되지 않는 경우 `CreateGameSession()`을 호출합니다.
  + 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 API Gateway \$1 Lambda 함수.

#### FlexMatch가 있는 단일 리전 컨테이너 플릿
<a name="w2aab9c11b9c21c27c13b7b3b3"></a>

이 시나리오에서는 게임 서버를 컨테이너 플릿에 배포하고, 게임 세션 배치를 구성하며, FlexMatch 매치메이킹을 설정합니다. 이 시나리오는 호스팅 솔루션용 사용자 지정 매치메이커 설계를 시작할 준비가 되었을 때 유용합니다. 이 시나리오를 사용하여 이 솔루션의 기본 리소스를 만들고 필요에 따라 나중에 사용자 지정할 수 있습니다. 다음과 같은 리소스를 배포합니다.
+ Amazon GameLift Servers 컨테이너 그룹 정의는 컨테이너 플릿에서 컨테이너 이미지를 배포하고 실행하는 방법을 설명합니다.
+ 별칭을 사용하여 게임 서버 컨테이너가 설치되고 실행 중인 Amazon GameLift Servers 컨테이너 플릿(온디맨드).
+ FlexMatch 매치메이킹 구성 및 매치메이킹 규칙은 플레이어 요청을 수락하고 매치를 구성하도록 설정.
+ Amazon GameLift Servers 게임 세션 대기열은 (실행 가능성, 비용, 플레이어 지연 시간 등을 기반으로) 가능한 최상의 호스팅 리소스를 찾고 게임 세션을 시작하여 제안된 매치에 대한 요청을 충족시켜 줌.
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
+ 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
+ API Gateway에 대한 과도한 플레이어 호출을 스로틀링하기 위한 웹 액세스 제어 목록(ACL).
+ 게임 세션을 요청하고 게임에 참여하는 등 게임 클라이언트를 대신하여 Amazon GameLift Servers 서비스에 요청하는 백엔드 서비스: 
  + 플레이어가 게임 세션 슬롯을 요청할 수 있는 API Gateway \$1 Lambda 함수. 이 함수는 슬롯이 확보되지 않는 경우 `StartMatchmaking()`을 호출합니다.
  + 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 API Gateway \$1 Lambda 함수.
+ 플레이어용 매치메이킹 티켓과 게임 세션 정보를 저장하는 DynamoDB 테이블.
+ GameSessionQueue 이벤트를 처리하는 Amazon SNS 주제 \$1 Lambda 함수.

## 컨테이너 플릿 배포
<a name="unity-plug-in-container-deploy"></a>

플릿 구성이 완료되면 **컨테이너 플릿 배포** 버튼을 선택하여 배포를 시작합니다. 플러그인이 컨테이너 이미지를 생성하여 ECR에 푸시하고, 컨테이너 플릿에 대한 호스팅 리소스를 프로비저닝하며, 선택한 호스팅 솔루션 시나리오에 대해 플릿 및 기타 AWS 리소스를 배포하는 동안 이 프로세스는 몇 분 정도 소요될 수 있습니다.

배포를 시작하면 각 단계의 진행 상황을 추적할 수 있습니다. 구성에 따라 단계에 다음이 포함될 수 있습니다.
+ 컨테이너 이미지 구성
+ Amazon ECT 리포지토리 생성 
+ 이미지 빌드 및 Amazon ECR로 푸시
+ 컨테이너 그룹 정의 생성
+ 컨테이너 플릿 생성

자세한 배포 정보를 보려면 ** AWS Management Console에서 보기**를 선택합니다. 컨테이너 플릿이 활성 상태에 도달하면 플릿은 게임 세션을 호스팅할 준비가 된 서버 프로세스로 컨테이너를 적극적으로 실행하고 있습니다.

배포가 완료되면 게임 세션을 호스팅하고 플레이어 연결을 수락할 준비가 된 작동 컨테이너 플릿이 있습니다.

진행 중인 배포는 중지할 수 없습니다. 배포가 잘못된 상태가 되거나 실패하는 경우 **배포 재설정** 옵션을 사용하여 다시 시작할 수 있습니다.

## 클라이언트 시작
<a name="unity-plug-in-container-launch"></a>

이제 Amazon GameLift Servers로 호스팅된 멀티플레이어 게임을 시작하고 플레이하는 데 모든 작업을 완료했습니다. 게임을 플레이하려면 **클라이언트 시작**을 선택하여 게임 클라이언트의 로컬 인스턴스를 시작합니다.
+ 단일 플릿 시나리오를 배포한 경우 한 명의 플레이어가 있는 게임 클라이언트의 하나의 인스턴스를 열고 서버 맵을 입력하여 이동할 수 있습니다. 또한 게임 클라이언트의 두 번째 인스턴스를 열어 동일한 서버 게임 맵에 두 번째 플레이어를 추가할 수 있습니다.
+ FlexMatch 시나리오를 배포한 경우 호스팅 솔루션은 두 개 이상의 게임 클라이언트가 매치메이킹 요청을 할 때까지 기다립니다. 플레이어 한 명과 함께 게임 클라이언트의 인스턴스를 두 개 이상 엽니다. 두 플레이어가 매칭되고 매치를 위해 게임 세션에 참여하라는 메시지가 표시됩니다.

## 컨테이너 플릿 업데이트
<a name="unity-plug-in-container-update"></a>

관리형 컨테이너 호스팅 솔루션을 성공적으로 배포한 경우 **배포 업데이트** 기능을 사용할 수 있습니다. 이 옵션을 사용하면 새 플릿을 생성할 필요 없이 배포된 컨테이너 플릿의 구성 설정을 업데이트할 수 있습니다.

배포를 업데이트할 때 다른 게임 서버 빌드로 컨테이너 이미지를 배포하고, Amazon ECR 리포지토리를 변경하며, 다른 배포 시나리오를 선택하고, 선택적 구성 설정을 사용자 지정할 수 있습니다.

변경사항을 배포할 준비가 되면 업데이트를 선택합니다. 배포 업데이트에 필요한 시간은 전체 배포와 유사합니다. 자세한 배포 정보를 보려면 ** AWS 관리 콘솔에서 보기를** 선택합니다.

## 배포된 리소스를 정리합니다.
<a name="unity-plug-in-container-cleanup"></a>

더 이상 필요하지 않은 관리형 컨테이너 솔루션의 AWS 리소스를 정리하는 것이 가장 좋습니다. 리소스를 제거하지 않으면 이러한 리소스에 대한 비용이 계속 발생할 수 있습니다.

다음 리소스를 삭제합니다.
+ 관리형 컨테이너 리소스 스택. 이 스택의 리소스는 선택한 배포 시나리오에 따라 달라집니다. 전체 스택을 삭제하려면 CloudFormation 콘솔을 사용합니다. Amazon GameLift Servers 플러그인에서 생성된 스택은 다음 명명 규칙을 사용합니다. `GameLiftPluginForUnity-{GameName}-Containers`. 플러그인에서 새 관리형 컨테이너 배포를 시작하기 전에 스택 삭제 프로세스가 완료될 때까지 기다립니다. 자세한 내용은 [CloudFormation 콘솔에서 스택 삭제](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)를 참조하세요.
+ Amazon ECR 리포지토리. 플러그인을 사용하여 컨테이너 이미지에 대한 리포지토리를 생성한 경우 더 이상 필요하지 않은 저장소는 삭제하는 것이 좋습니다. 관리형 컨테이너 배포를 재설정하기 전에는 리포지토리를 삭제할 필요가 없습니다. 배포를 업데이트하거나 재설정하면 플러그인은 다른 리포지토리를 사용하도록 지시되지 않는 한 동일한 리포지토리를 자동으로 사용합니다. 자세한 내용은 [Amazon ECR에서 프라이빗 리포지토리 삭제](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-delete.html)를 참조하세요.

# Unity용 Amazon GameLift Servers 플러그인(서버 SDK 4.x)
<a name="unity-plug-in-sdk4"></a>

**참고**  
이 주제에서는 이전 버전의 Unity용 Amazon GameLift Servers 플러그인에 대한 정보를 제공합니다. 버전 1.x는 Amazon GameLift Servers 4.x 이하용 서버 SDK를 사용합니다. 서버 SDK 5.x를 사용하고 Amazon GameLift Servers Anywhere 및 관리형 컨테이너 호스팅과 같은 최신 기능을 지원하는 최신 플러그인 버전에 대한 설명서는 [Amazon GameLift Servers Unity용 플러그인(서버 SDK 5.x)](unity-plug-in.md) 섹션을 참조하세요.

Amazon GameLift Servers에는 멀티플레이어와 게임 서버를 Amazon GameLift Servers에서 실행하도록 준비할 때 필요한 도구가 갖추어져 있습니다. Unity용 Amazon GameLift Servers 플러그인을 사용하면 간편하게 Amazon GameLift Servers를 Unity 게임에 통합하고 클라우드 호스팅용 Amazon GameLift Servers 리소스를 배포할 수 있습니다. Unity용 플러그인을 사용하여 Amazon GameLift Servers API에 액세스하고 일반적인 게임 시나리오에 맞는 AWS CloudFormation 템플릿을 배포할 수 있습니다.

플러그인을 설정한 후에는 GitHub에서 [Amazon GameLift Servers Unity 샘플](https://github.com/aws-samples/amazon-gamelift-unity)을 사용해 볼 수 있습니다.

**Topics**
+ [Unity 게임 서버 프로젝트와 Amazon GameLift Servers 통합](integration-unity-server-sdk4.md)
+ [Unity 게임 클라이언트 프로젝트와 Amazon GameLift Servers 통합](integration-unity-client-sdk4.md)
+ [플러그인 설치 및 설정](#unity-plug-in-sdk4-install)
+ [로컬에서 게임 테스트](#unity-plug-in-sdk4-test)
+ [시나리오 배포](#unity-plug-in-sdk4-scenario)
+ [Unity에서 Amazon GameLift Servers와 게임 통합](#unity-plug-in-sdk4-integration-intro)
+ [샘플 게임 가져오기 및 실행](#unity-plug-in-sdk4-sample-game)

# Unity 게임 서버 프로젝트와 Amazon GameLift Servers 통합
<a name="integration-unity-server-sdk4"></a>

**참고**  
이 주제에서는 이전 버전의 Unity용 Amazon GameLift Servers 플러그인에 대한 정보를 제공합니다. 버전 1.x는 Amazon GameLift Servers 4.x 이하용 서버 SDK를 사용합니다. 서버 SDK 5.x를 사용하고 Amazon GameLift Servers Anywhere 및 관리형 컨테이너 호스팅과 같은 최신 기능을 지원하는 최신 플러그인 버전에 대한 설명서는 [Amazon GameLift Servers Unity용 플러그인(서버 SDK 5.x)](unity-plug-in.md) 섹션을 참조하세요.

이 주제는 Amazon GameLift Servers에서 호스팅하기 위한 사용자 지정 게임 서버를 준비하는 데 도움을 줍니다. 게임 서버가 해당 상태를 Amazon GameLift Servers에 알려, 메시지가 표시될 때 게임 세션을 시작 및 중지하고, 다른 작업을 수행할 수 있어야 합니다. 자세한 정보는 [서버 SDK를 사용하여 게임 서버에 Amazon GameLift Servers를 추가합니다.](gamelift-sdk-server-api.md)을 참조하십시오.

## 사전 조건
<a name="integration-unity-server-sdk4-prereq"></a>

게임 서버를 통합하기 전에 먼저 다음 작업을 완료합니다.
+ [Amazon GameLift Servers의 IAM 서비스 역할 설정](setting-up-role.md)
+ [플러그인 설치 및 설정](unity-plug-in-sdk4.md#unity-plug-in-sdk4-install)

## 새로운 서버 프로세스 설정
<a name="integration-unity-server-sdk4-server-process"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Amazon GameLift Servers와의 통신을 설정하고 서버 프로세스가 게임 세션을 호스팅할 준비가 되었음을 보고합니다.

1. `InitSDK()`를 호출하여 서버 SDK를 초기화합니다.

1. 서버가 게임 세션을 수락할 수 있도록 준비하려면 연결 포트 및 게임 세션 위치 세부 정보를 포함하여 `ProcessReady()`를 호출합니다. `OnGameSession()`, `OnGameSessionUpdate()`, `OnProcessTerminate()`, `OnHealthCheck()`와 같이 Amazon GameLift Servers 서비스가 간접 호출하는 콜백 함수의 이름을 포함합니다. Amazon GameLift Servers가 콜백을 제공하는 데 몇 분 정도 소요될 수 있습니다.

1. Amazon GameLift Servers는 서버 프로세스의 상태를 `ACTIVE`으로 업데이트합니다.

1. Amazon GameLift Servers는 `onHealthCheck`를 주기적으로를 호출합니다.

다음 코드 예에서는 Amazon GameLift Servers를 사용하여 간단한 서버 프로세스를 설정하는 방법에 대해 보여줍니다.

```
//initSDK
var initSDKOutcome = GameLiftServerAPI.InitSDK();
           
//processReady
// Set parameters and call ProcessReady
var processParams = new ProcessParameters(
    this.OnGameSession,
    this.OnProcessTerminate,
    this.OnHealthCheck,
    this.OnGameSessionUpdate,
    port,
    // Examples of log and error files written by the game server
    new LogParameters(new List<string>()          
        {
            "C:\\game\\logs",
            "C:\\game\\error"
        })
);
               
var processReadyOutcome = GameLiftServerAPI.ProcessReady(processParams);
               
// Implement callback functions
void OnGameSession(GameSession gameSession)
{
    // game-specific tasks when starting a new game session, such as loading map
    // When ready to receive players
    var activateGameSessionOutcome = GameLiftServerAPI.ActivateGameSession();
}
               
void OnProcessTerminate()
{
    // game-specific tasks required to gracefully shut down a game session, 
    // such as notifying players, preserving game state data, and other cleanup
    var ProcessEndingOutcome = GameLiftServerAPI.ProcessEnding();
}
               
bool OnHealthCheck()
{
    bool isHealthy;
    // complete health evaluation within 60 seconds and set health
    return isHealthy;
}
```

## 게임 세션 시작
<a name="integration-unity-server-sdk4-start-game-session"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

게임 초기화가 완료된 후 게임 세션을 시작할 수 있습니다.

1. `onStartGameSession` 콜백 함수를 구현합니다. Amazon GameLift Servers는 이 메서드를 호출하여 서버 프로세스에서 새 게임 세션을 시작하고 플레이어 연결을 수신합니다.

1. 게임 세션을 활성화하려면 `ActivateGameSession()`을 호출합니다. SDK에 대한 자세한 내용은 [Amazon GameLift Servers 4.x용 C\$1 서버 SDK - 작업](integration-server-sdk-csharp-ref-actions.md) 섹션을 참조하세요.

다음 코드 예에서는 Amazon GameLift Servers로 게임 세션을 시작하는 방법에 대해 보여줍니다.

```
void OnStartGameSession(GameSession gameSession)
{
    // game-specific tasks when starting a new game session, such as loading map   
    ...
    // When ready to receive players   
    var activateGameSessionOutcome = GameLiftServerAPI.ActivateGameSession();
}
```

## 게임 세션 종료
<a name="integration-unity-server-sdk4-end-game-session"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

게임 세션이 종료되면 Amazon GameLift Servers에 알립니다. 호스팅 리소스를 재활용하고 새로 고치려면 게임 세션이 완료된 후 서버 프로세스를 종료하는 것이 가장 좋습니다.

1. Amazon GameLift Servers로부터 요청을 수신하도록 `onProcessTerminate`로 이름이 지정된 함수를 설정하고 `ProcessEnding()`을 호출합니다.

1. 프로세스 상태가 `TERMINATED`로 변경됩니다.

다음 예에서는 게임 세션의 프로세스 종료하는 방법에 대해 설명합니다.

```
var processEndingOutcome = GameLiftServerAPI.ProcessEnding();

if (processReadyOutcome.Success)
   Environment.Exit(0);

// otherwise, exit with error code
Environment.Exit(errorCode);
```

## 서버 빌드 생성 및 Amazon GameLift Servers에 업로드
<a name="integration-unity-server-sdk4-gamelift-connection"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

게임 서버를 Amazon GameLift Servers와 통합한 후 Amazon GameLift Servers가 게임 호스팅에 배포할 수 있도록 빌드 파일을 플릿에 업로드합니다. 서버를 Amazon GameLift Servers에 업로드하는 방법에 대한 자세한 내용은 [Amazon GameLift Servers의 게임 서버 빌드 생성](gamelift-build-cli-uploading.md) 섹션을 참조하세요.

# Unity 게임 클라이언트 프로젝트와 Amazon GameLift Servers 통합
<a name="integration-unity-client-sdk4"></a>

**참고**  
이 주제에서는 이전 버전의 Unity용 Amazon GameLift Servers 플러그인에 대한 정보를 제공합니다. 버전 1.x는 Amazon GameLift Servers 4.x 이하용 서버 SDK를 사용합니다. 서버 SDK 5.x를 사용하고 Amazon GameLift Servers Anywhere 및 관리형 컨테이너 호스팅과 같은 최신 기능을 지원하는 최신 플러그인 버전에 대한 설명서는 [Amazon GameLift Servers Unity용 플러그인(서버 SDK 5.x)](unity-plug-in.md) 섹션을 참조하세요.

이 주제는 백엔드 서비스를 통해 Amazon GameLift Servers 호스팅 게임 세션에 연결하도록 게임 클라이언트를 설정하는 데 도움이 됩니다. Amazon GameLift Servers API를 사용하여 매치메이킹을 시작하고 게임 세션 배치를 요청하는 등의 작업을 수행할 수 있습니다.

Amazon GameLift Servers 서비스와의 통신을 허용하는 코드를 백엔드 서비스 프로젝트에 추가합니다. 백엔드 서비스는 GameLift 서비스와의 모든 게임 클라이언트 통신을 처리합니다. 백엔드 서비스에 대한 자세한 내용은 섹션을 참조하세요.

 백엔드 서버는 다음 게임 클라이언트 작업을 처리합니다.
+ 플레이어에 맞게 인증을 사용자 지정할 수 있습니다.
+ Amazon GameLift Servers 서비스에 활성 게임 세션에 대한 정보를 요청합니다.
+ 새 게임 세션을 생성합니다.
+ 기존 게임 세션에 플레이어를 추가합니다.
+ 기존 게임 세션에서 플레이어를 제거합니다.

**Topics**
+ [사전 조건](#integration-unity-client-sdk4-prereq)
+ [게임 클라이언트 초기화](#integration-unity-client-sdk4-initialize)
+ [특정 플릿에서 게임 세션 생성](#integration-unity-client-sdk4-game-session)
+ [게임 세션에 플레이어 추가](#integration-unity-client-sdk4-add-player)
+ [게임 세션에서 플레이어를 제거합니다.](#integration-unity-client-sdk4-remove-player)

## 사전 조건
<a name="integration-unity-client-sdk4-prereq"></a>

Amazon GameLift Servers 클라이언트와의 게임 서버 통신을 설정하기 전에. 먼저 다음 작업을 완료해야 합니다.
+ [AWS 사용자 계정 설정](setting-up-aws-login.md)
+ [플러그인 설치 및 설정](unity-plug-in-sdk4.md#unity-plug-in-sdk4-install)
+ [Unity 게임 서버 프로젝트와 Amazon GameLift Servers 통합](integration-unity-server-sdk4.md)
+ [Amazon GameLift Servers용 호스팅 플릿 배포](fleets-intro.md)

## 게임 클라이언트 초기화
<a name="integration-unity-client-sdk4-initialize"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

게임 클라이언트를 초기화하는 코드를 추가합니다. 시작 시 이 코드를 실행하며, 이 코드는 다른 Amazon GameLift Servers 함수에 필요합니다.

1. `AmazonGameLiftClient`를 초기화합니다. 기본 클라이언트 구성 또는 사용자 지정 구성으로 `AmazonGameLiftClient`를 호출합니다. 클라이언트를 구성하는 방법에 대한 자세한 내용은 [Amazon GameLift Servers API를 설정합니다.](gamelift-sdk-client-api.md#gamelift-sdk-client-api-initialize) 섹션을 참조하세요.

1. 각 플레이어가 게임 세션에 연결할 수 있도록 고유한 플레이어 ID를 생성합니다. 자세한 내용은 [플레이어 ID 생성](player-sessions-player-identifiers.md)을 참조하세요.

   다음 예제에서는 Amazon GameLift Servers 클라이언트를 설정하는 방법을 보여줍니다.

   ```
   public class GameLiftClient
   {
       private GameLift gl;
       //A sample way to generate random player IDs. 
       bool includeBrackets = false;
       bool includeDashes = true;
       string playerId = AZ::Uuid::CreateRandom().ToString<string>(includeBrackets, includeDashes);
   		
       
       private Amazon.GameLift.Model.PlayerSession psession = null;
       public AmazonGameLiftClient aglc = null;
   
       public void CreateGameLiftClient()
       {
           //Access Amazon GameLift Servers service by setting up a configuration. 
           //The default configuration specifies a location. 
           var config = new AmazonGameLiftConfig();
           config.RegionEndpoint = Amazon.RegionEndpoint.USEast1;
      
           CredentialProfile profile = null;
           var nscf = new SharedCredentialsFile();
           nscf.TryGetProfile(profileName, out profile);
           AWSCredentials credentials = profile.GetAWSCredentials(null); 
           //Initialize Amazon GameLift Servers Client with default client configuration.
           aglc = new AmazonGameLiftClient(credentials, config); 
           
       }
   }
   ```

## 특정 플릿에서 게임 세션 생성
<a name="integration-unity-client-sdk4-game-session"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

코드를 추가하여 배포된 플릿에서 새 게임 세션을 시작하고 플레이어가 사용할 수 있게 허용합니다. Amazon GameLift Servers가 새 게임 세션을 만들고 `GameSession`을 반환한 후에는 플레이어를 참여시킬 수 있습니다.
+ 새 게임 세션에 대한 요청을 배치합니다.
  + 게임에서 플릿을 사용하는 경우 플릿 또는 별칭 ID, 세션 이름, 게임의 최대 동시 플레이어 수를 포함하여 `CreateGameSession()`을 호출합니다.
  + 게임에서 대기열을 사용하는 경우 `StartGameSessionPlacement()`를 호출합니다.

 다음 예제는 게임 세션을 만드는 방법을 보여줍니다.

```
public Amazon.GameLift.Model.GameSession()
{
    var cgsreq = new Amazon.GameLift.Model.CreateGameSessionRequest();
    //A unique identifier for the alias with the fleet to create a game session in.
    cgsreq.AliasId = aliasId; 
    //A unique identifier for a player or entity creating the game session 
    cgsreq.CreatorId = playerId; 
    //The maximum number of players that can be connected simultaneously to the game session.
    cgsreq.MaximumPlayerSessionCount = 4; 
						
    //Prompt an available server process to start a game session and retrieves connection information for the new game session
    Amazon.GameLift.Model.CreateGameSessionResponse cgsres = aglc.CreateGameSession(cgsreq);
    string gsid = cgsres.GameSession != null ? cgsres.GameSession.GameSessionId : "N/A";
    Debug.Log((int)cgsres.HttpStatusCode + " GAME SESSION CREATED: " + gsid);
    return cgsres.GameSession;
}
```

## 게임 세션에 플레이어 추가
<a name="integration-unity-client-sdk4-add-player"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Amazon GameLift Servers가 새 게임 세션을 만들고 `GameSession` 객체를 반환한 후에는 플레이어를 참여시킬 수 있습니다.

1. 새 플레이어 세션을 생성하여 게임 세션에서 플레이어 슬롯을 예약합니다. `CreatePlayerSession` 또는 게임 세션 ID와 각 플레이어의 고유 ID와 함께 `CreatePlayerSessions`을 사용합니다.

1. 게임 세션에 연결합니다. `PlayerSession` 객체를 검색하여 게임 세션의 연결 정보를 가져옵니다. 이 정보를 사용하여 서버 프로세스에 직접 연결을 설정합니다.

   1. 지정된 포트 및 서버 프로세스의 DNS 이름이나 IP 주소를 사용합니다.

   1. 플릿의 DNS 이름과 포트를 사용합니다. 플릿에 TLS 인증서 생성이 활성화된 경우 DNS 이름과 포트가 필요합니다.

   1. 플레이어 세션 ID를 참조합니다. 게임 서버가 들어오는 플레이어 연결을 검증하는 경우 플레이어 세션 ID가 필요합니다.

다음 예는 게임 세션에서 플레이어 스팟을 예약하는 방법에 대해 보여줍니다.

```
public Amazon.GameLift.Model.PlayerSession CreatePlayerSession(Amazon.GameLift.Model.GameSession gsession)
{
    var cpsreq = new Amazon.GameLift.Model.CreatePlayerSessionRequest();
    cpsreq.GameSessionId = gsession.GameSessionId; 
    //Specify game session ID.
    cpsreq.PlayerId = playerId; 
    //Specify player ID.
    Amazon.GameLift.Model.CreatePlayerSessionResponse cpsres = aglc.CreatePlayerSession(cpsreq);
    string psid = cpsres.PlayerSession != null ? cpsres.PlayerSession.PlayerSessionId : "N/A";
    return cpsres.PlayerSession;  
}
```

다음 코드는 플레이어를 게임 세션과 연결하는 방법을 보여줍니다.

```
public bool ConnectPlayer(int playerIdx, string playerSessionId)
{
    //Call ConnectPlayer with player ID and player session ID. 
    return server.ConnectPlayer(playerIdx, playerSessionId);
}
```

## 게임 세션에서 플레이어를 제거합니다.
<a name="integration-unity-client-sdk4-remove-player"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

플레이어가 게임을 떠나면 게임 세션에서 플레이어를 제거할 수 있습니다.

1. 플레이어가 서버 프로세스와의 연결이 끊겼음을 Amazon GameLift Servers에 알립니다. 플레이어의 세션 ID로 `RemovePlayerSession`을 호출합니다.

1. `RemovePlayerSession`이 `Success`를 반환하는지 확인합니다. Amazon GameLift Servers는 Amazon GameLift Servers가 새 플레이어에 할당할 수 있도록 플레이어 슬롯을 사용 가능하도록 변경합니다.

 다음 예는 플레이어 세션을 제거하는 방법을 보여줍니다.

```
public void DisconnectPlayer(int playerIdx)
{
    //Receive the player session ID. 
    string playerSessionId = playerSessions[playerIdx];
    var outcome = GameLiftServerAPI.RemovePlayerSession(playerSessionId);
    if (outcome.Success)
    {
        Debug.Log (":) PLAYER SESSION REMOVED");
    }
    else
    {
        Debug.Log(":(PLAYER SESSION REMOVE FAILED. RemovePlayerSession()
        returned " + outcome.Error.ToString());
    }
}
```

## 플러그인 설치 및 설정
<a name="unity-plug-in-sdk4-install"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

이 섹션에서는 Unity용 Amazon GameLift Servers 플러그인 버전 1.0.0을 다운로드, 설치 및 설정하는 방법을 설명합니다.

**사전 조건**
+ Windows 2019.4 LTS, Windows 2020.3 LTS,용 Unity 또는 MacOS Unity
+ Java의 최신 버전
+ .NET 4.x의 현재 버전

**Unity용 플러그인을 다운로드하고 설치하려면**

1. Unity용 Amazon GameLift Servers 플러그인을 다운로드합니다. [Unity 리포지토리용 Amazon GameLift Servers 플러그인](https://github.com/aws/amazon-gamelift-plugin-unity/releases) 페이지에서 최신 버전을 찾을 수 있습니다. [최신 릴리스](https://github.com/aws/amazon-gamelift-plugin-unity/releases)에서 **자산**을 선택한 다음 `com.amazonaws.gamelift-version.tgz` 파일을 다운로드합니다.

1. Unity를 시작하고 프로젝트를 선택합니다.

1. 상단 탐색 모음의 **창**에서 **패키지 관리자**를 선택합니다.  
![\[패키지 관리자가 선택된 창 아래의 Unity 메뉴입니다.\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unitypi_install_pkgmgr.png)

1. **패키지 관리자** 탭에서 **\$1**를 선택한 다음 **tarball에서 패키지 추가...**를 선택합니다.  
![\[패키지 관리자 탭의 + 아이콘 아래에 강조 표시된 tarball에서 패키지를 추가합니다.\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unitypi_install_tarball.png)

1. **디스크의 패키지 선택** 창에서 `com.amazonaws.gamelift` 폴더로 이동하여 `com.amazonaws.gamelift-version.tgz ` 파일을 선택한 다음 **열기**를 선택합니다.  
![\[디스크의 패키지 선택 창에서 tarball 파일을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unitypi_install_tarballselect.png)

1. Unity가 플러그인을 로드한 후, **Amazon GameLift Servers**가 Unity 메뉴에 새 항목으로 표시됩니다. 스크립트를 설치하고 다시 컴파일하는 데 몇 분 정도 걸릴 수 있습니다. **Amazon GameLift Servers 플러그인 설정** 탭이 자동으로 열립니다.  
![\[Unity 플러그인 설정 메뉴용 Amazon GameLift Servers 플러그인입니다.\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unitypi_install_done_ui.png)

1. **SDK** 창에서 **.NET 4.x 사용**을 선택합니다.

   구성되면 상태가 **구성되지 않음**에서 **구성됨**으로 변경됩니다.

## 로컬에서 게임 테스트
<a name="unity-plug-in-sdk4-test"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Amazon GameLift Servers Local을 사용하여 로컬 디바이스에서 Amazon GameLift Servers를 실행합니다. Amazon GameLift Servers Local을 사용하면 네트워크 연결 없이 몇 초 만에 코드 변경을 확인할 수 있습니다.

### 로컬 테스트 구성
<a name="unity-plug-in-sdk4-test-cfgtesting"></a>

1. Unity용 플러그인 창에서 **테스트** 탭을 선택합니다.

1. **테스트** 창에서 **Amazon GameLift Servers Local 다운로드**를 선택합니다. Unity용 플러그인은 브라우저 창을 열고 `GameLift_06_03_2021.zip` 파일을 다운로드 폴더로 다운로드합니다.

   다운로드에는 C\$1 Server SDK, .NET 소스 파일 및 Unity와 호환되는.NET 구성 요소가 포함됩니다.

1. 다운로드한 `GameLift_06_03_2021.zip` 파일의 압축을 풉니다.

1. **Amazon GameLift Servers 플러그인 설정** 창에서 **Amazon GameLift Servers Local 경로**를 선택하고 압축이 풀린 폴더로 이동하여 `GameLiftLocal.jar` 파일을 선택한 다음 **열기**를 선택합니다.

   구성되면 로컬 테스트 상태가 **구성되지 않음**에서 **구성됨**으로 변경됩니다.

1. JRE의 상태를 확인합니다. 상태가 **구성되지 않음**인 경우 **JRE 다운로드**를 선택하고 권장 Java 버전을 설치합니다.

   Java 환경을 설치하고 구성한 후에는 상태가 **구성됨**으로 변경됩니다.

### 로컬 게임 실행
<a name="unity-plug-in-sdk4-test-cfgrunning"></a>

1. Unity용 플러그인 탭에서 **테스트** 탭을 선택합니다.

1. **테스트** 창에서 **로컬 테스트 UI 열기**를 선택합니다.

1. **로컬 테스트** 창에서 **서버 실행 파일 경로**를 지정합니다. **...**를 선택하여 서버 애플리케이션의 경로와 실행 파일 이름을 선택합니다.

1. **로컬 테스트** 창에서 **GL 로컬 포트**를 지정합니다.

1. **배포 및 실행**을 선택하여 서버를 배포하고 실행합니다.

1. 게임 서버를 중지하려면 **중지**를 선택하거나 게임 서버 창을 닫습니다.

## 시나리오 배포
<a name="unity-plug-in-sdk4-scenario"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

시나리오는 CloudFormation 템플릿을 사용하여 게임에 클라우드 호스팅 솔루션을 배포하는 데 필요한 리소스를 생성합니다. 이 섹션에서는 Amazon GameLift Servers가 제공하는 시나리오와 이를 사용하는 방법에 대해 설명합니다.

**사전 조건**  
시나리오를 배포하려면 Amazon GameLift Servers 서비스에 대한 IAM 역할이 필요합니다. Amazon GameLift Servers의 역할 생성 방법에 대한 자세한 내용은 [AWS 사용자 계정 설정](setting-up-aws-login.md) 섹션을 참조하세요.

각 시나리오에는 다음 리소스에 대한 권한이 필요합니다.
+ Amazon GameLift Servers
+ Amazon S3
+ CloudFormation
+ API Gateway
+ AWS Lambda
+ AWS WAFV2
+ Amazon Cognito

### 시나리오
<a name="unity-plug-in-sdk4-scenario-examples"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Unity용 Amazon GameLift Servers 플러그인에는 다음과 같은 시나리오가 포함됩니다.

**인증 전용**  
이 시나리오는 게임 서버 기능 없이 플레이어 인증을 수행하는 게임 백엔드 서비스를 생성합니다. 이 템플릿은 계정에 다음 리소스를 생성합니다.
+ 플레이어 인증 정보를 저장하는 Amazon Cognito 사용자 풀입니다.
+ 게임을 시작하고 게임 연결 정보를 보는 Amazon API Gateway REST 엔드포인트 지원 AWS Lambda 핸들러입니다.

**단일 리전 플릿**  
이 시나리오에서는 단일 Amazon GameLift Servers 플릿으로 게임 백엔드 서비스를 생성합니다. 다음 리소스를 생성합니다.
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀입니다.
+ 플릿에 열린 플레이어 슬롯이 있는 기존 게임 세션을 검색하는 AWS Lambda 핸들러입니다. 열린 슬롯을 찾을 수 없는 경우 새 게임 세션이 생성됩니다.

**대기열 및 사용자 지정 매치메이커가 있는 다중 리전 플릿**  
이 시나리오에서는 Amazon GameLift Servers 대기열과 사용자 지정 매치메이커를 사용하여 대기 중인 풀에서 가장 오래된 플레이어를 그룹화하여 매치를 구성합니다. 다음 리소스를 생성합니다.
+ Amazon GameLift Servers가 메시지를 게시하는 Amazon Simple Notification Service 주제입니다. SNS 주제와 알림에 대한 자세한 내용은 [게임 세션 배치의 이벤트 알림 설정](queue-notification.md) 섹션을 참조하세요.
+ 배치 및 게임 연결 세부 정보를 전달하는 메시지에 의해 호출되는 Lambda 함수입니다.
+ 배치 및 게임 연결 세부 정보를 저장하는 Amazon DynamoDB 테이블입니다. `GetGameConnection` 호출은 이 테이블에서 읽은 후 연결 정보를 게임 클라이언트에 반환합니다.

**대기열 및 사용자 지정 매치메이커가 있는 스팟 플릿**  
이 시나리오에서는 Amazon GameLift Servers 대기열과 사용자 지정 매치메이커를 사용하여 매치를 구성하고 플릿 3개를 구성합니다. 다음 리소스를 생성합니다.
+ 스팟 가용성 손실에 대한 지속성을 제공하기 위해 서로 다른 인스턴스 유형을 포함하는 두 개의 스팟 플릿입니다.
+ 다른 스팟 플릿의 백업 역할을 하는 온디맨드 플릿입니다. 플릿 설계에 대한 자세한 내용은 [리소스 사용자 지정 호스팅](fleets-design.md) 섹션을 참조하세요.
+ 서버 가용성을 높게 유지하고 비용을 낮게 유지하는 Amazon GameLift Servers 대기열입니다. 대기열에 대한 자세한 내용과 모범 사례에 대해서는 [게임 세션 대기열 사용자 지정](queues-design.md) 섹션을 참조하세요.

**FlexMatch**  
이 시나리오에서는 관리형 매치메이킹 서비스인 FlexMatch를 사용하여 게임 플레이어를 매칭합니다. FlexMatch에 대한 자세한 정보는 [Amazon GameLift Servers FlexMatch란 무엇입니까?](https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-intro.html)를 참조하세요. 이 시나리오에서는 다음 리소스를 생성합니다.
+ `StartGame` 요청을 받은 후 매치메이킹 티켓을 생성하는 Lambda 함수입니다.
+ FlexMatch 매치 이벤트를 수신하기 위한 별도의 Lambda 함수입니다.

에 불필요한 요금이 부과되지 않도록 각 시나리오에서 생성한 리소스를 사용한 후 AWS 계정제거합니다. 해당 CloudFormation 스택을 삭제합니다.

### AWS 자격 증명 업데이트
<a name="unity-plug-in-sdk4-configure-creds"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Unity용 Amazon GameLift Servers 플러그인을 사용하려면 시나리오를 배포하기 위해 보안 자격 증명이 필요합니다. 새 자격 증명을 생성하거나 기존 자격 증명을 사용할 수 있습니다.

자격 증명 구성에 대한 자세한 내용은 [AWS 자격 증명 이해 및 가져오기를 참조하세요](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html).

**AWS 자격 증명을 업데이트하려면**

1. Unity용 플러그인 탭에서 **배포** 탭을 선택합니다.

1. **배포** 창에서 **AWS 자격 증명**을 선택합니다.

1. 새 AWS 자격 증명을 생성하거나 기존 자격 증명을 선택할 수 있습니다.
   + 자격 증명을 생성하려면 **새 자격 증명 프로필 생성**을 선택한 다음 **새 프로필 이름**, **AWS 액세스 키 ID**, **AWS 보안 키** 및 **AWS 리전**을 지정합니다.
   + 기존 자격 증명을 선택하려면 **기존 자격 증명 프로필 선택**을 선택한 다음 프로필 이름 및 **AWS 리전**을 선택합니다.

1. ** AWS 자격 증명 업데이트** 창에서 자격 **증명 프로필 업데이트를** 선택합니다.

### 계정 부트스트랩 업데이트
<a name="unity-plug-in-sdk4-scenario-boot"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

부트스트랩 위치는 배포 중에 사용되는 Amazon S3 버킷입니다. 게임 서버 애셋 및 기타 종속 항목을 저장하는 데 사용됩니다. 버킷에 대해 AWS 리전 선택한는 시나리오 배포에 사용할 리전과 동일해야 합니다.

Amazon S3 버킷에 대한 자세한 내용은 [Amazon Simple Storage Service 버킷 생성, 구성, 작업](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html)을 참조하세요.

**계정 부트스트랩 위치를 업데이트하려면**

1. Unity용 플러그인 탭에서 **배포** 탭을 선택합니다.

1. **배포** 창에서 **계정 부트스트랩 업데이트**를 선택합니다.

1. **계정 부트스트래핑** 창에서 기존 Amazon S3 버킷을 선택하거나 새 Amazon S3 버킷을 생성합니다.
   + 기존 버킷을 선택하려면 **기존 Amazon S3 버킷 선택** 및 **업데이트**를 선택하여 선택 사항을 저장합니다.
   + **새 Amazon S3 버킷 생성**을 선택하여 새 Amazon Simple Storage Service 버킷을 생성한 다음 **정책**을 선택합니다. 이 정책은 Amazon S3 버킷의 만료 시기를 지정합니다. **생성**을 선택하여 버킷을 생성합니다.

### 게임 시나리오 배포
<a name="unity-plug-in-sdk4-scenario-deploy"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

시나리오를 사용하여 Amazon GameLift Servers에서 게임을 테스트할 수 있습니다. 각 시나리오는 CloudFormation 템플릿을 사용하여 필요한 리소스로 스택을 생성합니다. 대부분의 시나리오에는 게임 서버 실행 파일과 빌드 경로가 필요합니다. 시나리오를 배포할 때 Amazon GameLift Servers는 배포의 일환으로 게임 애셋을 부트스트랩 위치에 복사합니다.

시나리오를 배포하려면 AWS 자격 증명과 AWS 계정 부트스트랩을 구성해야 합니다.

**시나리오를 배포하려면**

1. Unity용 플러그인 탭에서 **배포** 탭을 선택합니다.

1. **배포** 창에서 **배포 UI 열기**를 선택합니다.

1. **배포** 창에서 시나리오를 선택합니다.

1. **게임 이름**을 입력합니다. 이름은 고유해야 합니다. 게임 이름은 시나리오를 배포할 때 CloudFormation 스택 이름의 일부입니다.

1. **게임 서버 빌드 폴더 경로**를 선택합니다. 빌드 폴더 경로는 서버 실행 파일 및 종속 파일이 들어 있는 폴더를 가리킵니다.

1. **게임 서버 빌드 .exe 파일 경로**를 선택합니다. 빌드 실행 파일 경로는 게임 서버 실행 파일을 가리킵니다.

1. **배포 시작**을 선택하여 시나리오 배포를 시작합니다. **배포** 창의 **현재 상태**에서 업데이트 상태를 확인할 수 있습니다. 시나리오를 배포하는 데 최대 몇 분이 소요될 수 있습니다.  
![\[시나리오 배포 상태 업데이트\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unitypi_deploy_statex.png)

1. 시나리오 배포가 완료되면 **현재 상태**가 업데이트되어 게임에 복사하여 붙여넣을 수 있는 **Cognito 클라이언트 ID** 및 **API Gateway 엔드포인트**가 포함됩니다.  
![\[시나리오 배포 상태 업데이트\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unitypi_deploy_statedone.png)

1. 게임 설정을 업데이트하려면 Unity 메뉴에서 **클라이언트 연결 설정으로 이동**을 선택합니다. 그러면 Unity 화면 오른쪽에 **Inspector** 탭이 표시됩니다.

1. **로컬 테스트 모드**를 선택 해제합니다.

1. **API Gateway 엔드포인트** 및 **Coginito 클라이언트 ID**를 입력합니다. 시나리오 배포에 AWS 리전 사용한 것과 동일한 항목을 선택합니다. 그런 다음 배포된 시나리오 리소스를 사용하여 게임 클라이언트를 다시 빌드하고 실행할 수 있습니다.

### 시나리오에서 생성된 리소스 삭제
<a name="unity-plug-in-sdk4-scenario-delete"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

시나리오용으로 생성된 리소스를 삭제하려면 해당 CloudFormation 스택을 삭제합니다.

**시나리오에서 생성된 리소스를 삭제하려면**

1. Unity **배포**용 Amazon GameLift Servers 플러그인 창에서 ** AWS CloudFormation 콘솔 보기를** 선택하여 CloudFormation 콘솔을 엽니다.

1.  CloudFormation 콘솔에서 **스택을** 선택한 다음 배포 중에 지정된 게임 이름이 포함된 스택을 선택합니다.

1. 스택을 삭제하려면 **삭제**를 선택합니다. 스택을 삭제하는 데 몇 분 정도 걸립니다. 가 시나리오에서 사용하는 스택을 CloudFormation 삭제하면 상태가 로 변경됩니다`ROLLBACK_COMPLETE`.

## Unity에서 Amazon GameLift Servers와 게임 통합
<a name="unity-plug-in-sdk4-integration-intro"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

다음 작업을 완료하여 Unity 게임을 Amazon GameLift Servers와 통합합니다.
+ [Unity 게임 서버 프로젝트와 Amazon GameLift Servers 통합](integration-unity-server-sdk4.md)
+ [Unity 게임 클라이언트 프로젝트와 Amazon GameLift Servers 통합](integration-unity-client-sdk4.md)

다음 다이어그램은 게임을 통합하는 흐름의 예를 보여 줍니다. 다이어그램에서는 게임 서버가 있는 플릿이 Amazon GameLift Servers에 배포되어 있습니다. 게임 클라이언트는 게임 서버와 통신하며, 게임 서버는 Amazon GameLift Servers와 통신합니다.

![\[Unity와 Amazon GameLift Servers를 통합하는 아키텍처 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/gameliftservers/latest/developerguide/images/unity_diagram.png)


## 샘플 게임 가져오기 및 실행
<a name="unity-plug-in-sdk4-sample-game"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Unity용 Amazon GameLift Servers 플러그인에는 게임을 Amazon GameLift Servers와 통합하는 데 필요한 기본 사항을 탐색하는 데 사용할 수 있는 샘플 게임이 포함되어 있습니다. 이 섹션에서는 게임 클라이언트와 게임 서버를 구축한 다음 Amazon GameLift Servers Local을 사용하여 로컬에서 테스트합니다.

### 사전 조건
<a name="unity-plug-in-sdk4-sample-game-prereq"></a>
+ [AWS 사용자 계정 설정](setting-up-aws-login.md)
+ [플러그인 설치 및 설정](#unity-plug-in-sdk4-install)

### 샘플 게임 서버 빌드 및 실행
<a name="unity-plug-in-sdk4-sample-game-build"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

샘플 게임의 게임 서버 파일을 설정합니다.

1. Unity의 메뉴에서 **Amazon GameLift Servers**를 선택한 다음 **샘플 게임 가져오기**를 선택합니다.

1. **샘플 게임 가져오기** 창에서 **가져오기**를 선택하여 게임, 애셋, 종속 항목을 가져옵니다.

1. 게임 서버를 빌드합니다. Unity의 메뉴에서 **Amazon GameLift Servers**를 선택한 다음 **Windows 샘플 서버 빌드 설정 적용** 또는 **MacOS 샘플 서버 빌드 설정 적용**을 선택합니다. 게임 서버 설정을 구성한 후 Unity는 애셋을 다시 컴파일합니다.

1. Unity의 메뉴에서 **파일**을 선택한 다음 **빌드**를 선택합니다. **서버 빌드**를 선택하고 **빌드**를 선택한 다음 서버 파일용 빌드 폴더를 선택합니다.

   Unity는 샘플 게임 서버를 빌드하고 실행 파일과 필수 애셋을 지정된 빌드 폴더에 저장합니다.

### 샘플 게임 클라이언트 빌드 및 실행
<a name="unity-plug-in-sdk4-sample-game-client"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

샘플 게임의 게임 클라이언트 파일을 설정합니다.

1. Unity의 메뉴에서 **Amazon GameLift Servers**를 선택한 다음 **Windows 샘플 클라이언트 빌드 설정 적용** 또는 **MacOS 샘플 클라이언트 빌드 설정 적용**을 선택합니다. 게임 클라이언트 설정이 구성된 후 Unity는 애셋을 다시 컴파일합니다.

1. Unity의 메뉴에서 **클라이언트 설정으로 이동**을 선택합니다. 그러면 Unity 화면 오른쪽에 **Inspector** 탭이 표시됩니다. **Amazon GameLift Servers 클라이언트 설정** 탭에서 **로컬 테스트 모드**를 선택합니다.

1. 게임 클라이언트를 빌드합니다. Unity의 메뉴에서 **파일**을 선택합니다. **서버 빌드**가 선택하지 않았는지 확인하고 **빌드**를 선택한 다음, 클라이언트 파일용 빌드 폴더를 선택합니다.

   Unity는 샘플 게임 클라이언트를 빌드하고 실행 파일과 필수 애셋을 지정된 클라이언트 빌드 폴더에 저장합니다.

1. 게임 서버와 클라이언트는 아직 빌드하지 않았습니다. 다음 단계에서는 게임을 실행하고 Amazon GameLift Servers와 어떻게 상호 작용하는지 확인합니다.

### 로컬에서 샘플 게임 테스트
<a name="unity-plug-in-sdk4-sample-game-test"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

Amazon GameLift Servers Local을 사용하여 가져온 샘플 게임을 실행합니다.

1. 게임 서버를 시작합니다. Unity용 플러그인 탭에서 **배포** 탭을 선택합니다.

1. **테스트** 창에서 **로컬 테스트 UI 열기**를 선택합니다.

1. **로컬 테스트** 창에서 **게임 서버 .exe 파일 경로**를 지정합니다. 경로에는 실행 파일 이름을 포함해야 합니다. 예를 들어 `C:/MyGame/GameServer/MyGameServer.exe`입니다.

1. **배포 및 실행**을 선택합니다. Unity용 플러그인은 게임 서버를 시작하고 Amazon GameLift Servers 로컬 로그 창을 엽니다. 창에는 게임 서버와 Amazon GameLift Servers Local 간에 전송된 메시지를 비롯한 로그 메시지가 포함되어 있습니다.

1. 게임 클라이언트를 실행합니다. 샘플 게임 클라이언트로 빌드 위치를 찾고 실행 파일을 선택합니다.

1. **Amazon GameLift Servers 샘플 게임**에서 이메일과 암호를 입력한 다음 **로그인**을 선택합니다. 이메일과 암호는 검증되거나 사용되지 않습니다.

1. **Amazon GameLift Servers 샘플 게임**에서 **시작**을 선택합니다. 게임 클라이언트가 게임 세션을 찾습니다. 세션을 찾을 수 없는 경우 세션을 생성합니다. 그러면 게임 클라이언트가 게임 세션을 시작합니다. 로그에서 게임 활동을 볼 수 있습니다.

#### 샘플 게임 서버 로그
<a name="unity-plug-in-sdk4-example-logs"></a>

```
...
2021-09-15T19:55:3495 PID:20728 Log :) GAMELIFT AWAKE 
2021-09-15T19:55:3512 PID:20728 Log :) I AM SERVER 
2021-09-15T19:55:3514 PID:20728 Log :) GAMELIFT StartServer at port 33430. 
2021-09-15T19:55:3514 PID:20728 Log :) SDK VERSION: 4.0.2 
2021-09-15T19:55:3556 PID:20728 Log :) SERVER IS IN A GAMELIFT FLEET 
2021-09-15T19:55:3577 PID:20728 Log :) PROCESSREADY SUCCESS. 
2021-09-15T19:55:3577 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)
...
2021-09-15T19:55:3634 PID:20728 Log :) GAMELOGIC AWAKE 
2021-09-15T19:55:3635 PID:20728 Log :) GAMELOGIC START 
2021-09-15T19:55:3636 PID:20728 Log :) LISTENING ON PORT 33430 
2021-09-15T19:55:3636 PID:20728 Log SERVER: Frame: 0 HELLO WORLD! 
...
2021-09-15T19:56:2464 PID:20728 Log :) GAMELIFT SESSION REQUESTED
2021-09-15T19:56:2468 PID:20728 Log :) GAME SESSION ACTIVATED
2021-09-15T19:56:3578 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)
2021-09-15T19:57:3584 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)
2021-09-15T19:58:0334 PID:20728 Log SERVER: Frame: 8695 Connection accepted: playerIdx 0 joined
2021-09-15T19:58:0335 PID:20728 Log SERVER: Frame: 8696 Connection accepted: playerIdx 1 joined 
2021-09-15T19:58:0338 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from playerIdx 0 Msg: CONNECT: server IP localhost 
2021-09-15T19:58:0338 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from player 0:CONNECT: server IP localhost 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 CONNECT: player index 0 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from playerIdx 1 Msg: CONNECT: server IP localhost 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from player 1:CONNECT: server IP localhost 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 CONNECT: player index 1
```

#### Amazon GameLift Servers Local 로그 샘플
<a name="unity-plug-in-sdk4-example-locallogs"></a>

```
12:55:26,000  INFO || - [SocketIOServer] main - Session store / pubsub factory used: MemoryStoreFactory (local session store only)
12:55:28,092  WARN || - [ServerBootstrap] main - Unknown channel option 'SO_LINGER' for channel '[id: 0xe23d0a14]'
12:55:28,101  INFO || - [SocketIOServer] nioEventLoopGroup-2-1 - SocketIO server started at port: 5757
12:55:28,101  INFO || - [SDKConnection] main - GameLift SDK server (communicates with your game server) has started on http://localhost:5757
12:55:28,120  INFO || - [SdkWebSocketServer] WebSocketSelector-20 - WebSocket Server started on address localhost/127.0.0.1:5759
12:55:28,166  INFO || - [StandAloneServer] main - GameLift Client server (listens for GameLift client APIs) has started on http://localhost:8080
12:55:28,179  INFO || - [StandAloneServer] main - GameLift server sdk http listener has started on http://localhost:5758
12:55:35,453  INFO || - [SdkWebSocketServer] WebSocketWorker-12 - onOpen socket: /?pID=20728&sdkVersion=4.0.2&sdkLanguage=CSharp and handshake /?pID=20728&sdkVersion=4.0.2&sdkLanguage=CSharp
12:55:35,551  INFO || - [HostProcessManager] WebSocketWorker-12 - client connected with pID 20728
12:55:35,718  INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: ProcessReady for pId 20728
12:55:35,718  INFO || - [ProcessReadyHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for processReady from 20728
12:55:35,738  INFO || - [ProcessReadyHandler] GameLiftSdkHttpHandler-thread-0 - onProcessReady data: port: 33430
 12:55:35,739  INFO || - [HostProcessManager] GameLiftSdkHttpHandler-thread-0 - Registered new process with pId 20728
12:55:35,789  INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: ReportHealth for pId 20728
12:55:35,790  INFO || - [ReportHealthHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for ReportHealth from 20728
12:55:35,794  INFO || - [ReportHealthHandler] GameLiftSdkHttpHandler-thread-0 - ReportHealth data: healthStatus: true
 12:56:24,098  INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.DescribeGameSessions
12:56:24,119  INFO || - [DescribeGameSessionsDispatcher] Thread-12 - Received API call to describe game sessions with input: {"FleetId":"fleet-123"}
12:56:24,241  INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.CreateGameSession
12:56:24,242  INFO || - [CreateGameSessionDispatcher] Thread-12 - Received API call to create game session with input: {"FleetId":"fleet-123","MaximumPlayerSessionCount":4}
12:56:24,265  INFO || - [HostProcessManager] Thread-12 - Reserved process: 20728 for gameSession: arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d
12:56:24,266  INFO || - [WebSocketInvoker] Thread-12 - StartGameSessionRequest: gameSessionId=arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d, fleetId=fleet-123, gameSessionName=null, maxPlayers=4, properties=[], ipAddress=127.0.0.1, port=33430, gameSessionData?=false, matchmakerData?=false, dnsName=localhost
12:56:24,564  INFO || - [CreateGameSessionDispatcher] Thread-12 - GameSession with id: arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d created
12:56:24,585  INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.DescribeGameSessions
12:56:24,585  INFO || - [DescribeGameSessionsDispatcher] Thread-12 - Received API call to describe game sessions with input: {"FleetId":"fleet-123"}
12:56:24,660  INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: GameSessionActivate for pId 20728
12:56:24,661  INFO || - [GameSessionActivateHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for GameSessionActivate from 20728
12:56:24,678  INFO || - [GameSessionActivateHandler] GameLiftSdkHttpHandler-thread-0 - GameSessionActivate data: gameSessionId: "arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d"
```

### 서버 프로세스 종료
<a name="unity-plug-in-sdk4-shut-down"></a>

**참고**  
이 주제에서는 서버 SDK 4.x 이하를 사용하는 Unity 버전 1.0.0용 Amazon GameLift Servers 플러그인을 설명합니다.

샘플 게임을 완료한 후 Unity에서 서버를 종료합니다.

1. 게임 클라이언트에서 **종료**를 선택하거나 창을 닫아 게임 클라이언트를 중지합니다.

1. Unity의 **로컬 테스트** 창에서 **중지**를 선택하거나 게임 서버 창을 닫아 서버를 중지합니다.