> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GSDK 프로젝트 설정

> 전용 서버 빌드를 PlayFab 멀티플레이어 서버에서 호스팅할 수 있도록 Unreal Engine ThirdPersonMP 프로젝트에서 PlayFab GSDK 플러그인을 추가하고 구성합니다.

# 프로젝트에 GSDK 추가

이 문서에서는 기존 프로젝트를 PlayFab 멀티플레이어 서버(MPS)에서 호스팅할 수 있도록 업그레이드하는 방법을 설명합니다. 이 프로세스에는 Unreal 프로젝트에 PlayFab GSDK를 추가하고 구성하는 과정이 포함됩니다. 여기의 지침은 Unreal ThirdPersonMP 템플릿 프로젝트를 사용하여 작성되었습니다.

참고: Unreal 프로젝트에는 다음과 같은 기능이 있어야 합니다.

* 네트워킹
* 멀티플레이어
* 전용 게임 서버

그렇지 않은 경우 [예제 프로젝트 설정](/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk/third-person-mp-example-project-setup) 가이드로 돌아가서 프로젝트를 전용 서버 기능이 있는 네트워크 지원 멀티플레이어 게임으로 구성해야 합니다.

## 목표

프로젝트에 PlayFab Unreal GSDK를 추가하고 구성하며, 로컬에서 테스트하여 PlayFab Multiplayer Services에서 작동할 것으로 예상되는지 확인합니다.

## 요구 사항

* Visual Studio를 다운로드합니다. [Community 버전](https://visualstudio.microsoft.com/vs/community/)은 무료입니다.
  * 필수 워크로드: .NET 데스크톱 개발 및 C++를 사용한 데스크톱 개발
* Unreal Engine 소스 코드를 다운로드합니다. 자세한 내용은 [Downloading Unreal Engine Source code (외부)](https://docs.unrealengine.com/ProgrammingAndScripting/ProgrammingWithCPP/DownloadingSourceCode/)를 참조하세요.
* 완료된 [ThirdPersonMP 예제 프로젝트](/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk/third-person-mp-example-project-setup) 또는 유사한 기능을 갖춘 프로젝트
* [PlayFab Unreal GSDK 플러그인](https://github.com/PlayFab/gsdk/tree/master/UnrealPlugin)
* \[선택 사항] [PlayFab Marketplace 플러그인](https://www.unrealengine.com/marketplace/product/playfab-sdk) 또는 [GitHub 소스 버전](https://github.com/PlayFab/UnrealMarketplacePlugin). 이 플러그인은 GSDK에 필수는 아니지만 로그인을 비롯한 많은 PlayFab 서비스에 필요합니다.

## C++ 구현

### 프로젝트에 플러그인 추가

다음 단계에 따라 프로젝트에 Unreal GSDK를 추가합니다.

* Unreal 프로젝트로 이동합니다.
* File Explorer를 열고 게임의 루트 디렉터리에 **Plugins** 폴더를 만듭니다. Plugins 폴더 안에 **PlayFabGSDK**라는 폴더를 만듭니다.
* **\{depot}\GSDK\gsdk\UnrealPlugin**으로 이동합니다. **UnrealPlugin** 폴더의 모든 파일을 **Plugins/PlayFabGSDK** 폴더로 드래그합니다.
* 마지막으로 원하는 텍스트 편집기에서 `{ProjectName}.uproject` 파일을 엽니다. plugins 배열에 "PlayFabGSDK" 플러그인을 추가합니다.

아래 예를 참조하세요.

```json theme={null}
{
    "FileVersion": 3,
    "EngineAssociation": "{YourEngineVersion}",
    "Category": "",
    "Description": "",
    "Modules": [
        {
            "Name": "{ProjectName}",
            "Type": "Runtime",
            "LoadingPhase": "Default",
            "AdditionalDependencies": [
                "Engine"
            ]
        }
    ],
    "Plugins": [                    // Add this if it doesn't exist
        {                           // Add this
            "Name": "PlayFabGSDK",  // Add this
            "Enabled": true         // Add this
        }                           // Add this
    ]                               // Add this if it doesn't exist
}
```

### 모듈에 플러그인 포함

* \{ProjectName}.Build.cs 파일을 업데이트하여 PublicDependencyModuleNames.AddRange(); 목록에 다음과 같이 "PlayFabGSDK"를 추가합니다.

```csharp theme={null}
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "PlayFabGSDK" });
```

* `{ProjectName}.uproject` 파일을 마우스 오른쪽 버튼으로 클릭하고 **Switch Unreal Engine version** 옵션을 선택합니다. 이 옵션을 사용하면 현재 사용 중인 Unreal Engine 버전을 빠르게 확인할 수 있습니다. 아래에 표시된 팝업이 나타납니다. Unreal Engine 버전이 이미 소스 빌드로 표시되면 변경할 필요가 없으므로 Cancel을 클릭합니다. Unreal 버전이 현재 소스 빌드가 아닌 경우 드롭다운 목록에서 선택한 다음 OK를 클릭합니다.

<img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/SelectUnrealEngineVersion.png?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=bd8e143a756f3896fe41188b23adcb34" alt="image depicting a window that says &#x22;Select Unreal Engine Version&#x22;" width="253" height="137" data-path="images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/SelectUnrealEngineVersion.png" />

* `{ProjectName}.uproject` 파일을 다시 마우스 오른쪽 버튼으로 클릭하고 "Generate Visual Studio Project Files"를 선택합니다.

* 마지막으로 Visual Studio에서 프로젝트를 빌드하고 Development Editor 구성을 선택하여 Editor를 시작합니다.

<img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/DevelopmentEditor.png?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=e039b6ef96b11027a01432cdbd6af933" alt="image depicting Visual Studio with the option to build in Development Editor Mode" width="519" height="287" data-path="images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/DevelopmentEditor.png" />

### 프로젝트 설정

프로젝트에서 서버 모드를 활성화하면 \{ProjectName}Server.Target.cs 파일이 있게 됩니다.

결과는 다음과 유사해야 합니다.

```csharp theme={null}
public class {ProjectName}ServerTarget : TargetRules
{
    public {ProjectName}ServerTarget( TargetInfo Target) : base(Target)
    {
        Type = TargetType.Server;
        DefaultBuildSettings = BuildSettingsVersion.V2;
        ExtraModuleNames.AddRange( new string[] { "{ProjectName}" } );

    // You may have additional configuration based on your server needs
    }
}
```

Windows 빌드의 경우 다음과 같은 선택적 구성을 추가해야 할 수 있습니다.

```csharp theme={null}
DisablePlugins.Add("WMFMediaPlayer");
DisablePlugins.Add("AsyncLoadingScreen"); //if you are using this plugin
DisablePlugins.Add("WindowsMoviePlayer");
DisablePlugins.Add("MediaFoundationMediaPlayer");
```

참고: 이러한 구성은 Linux 서버 빌드에는 유효하지 않습니다.

### GameInstance 클래스 만들기/업데이트

#### GameInstance 클래스 만들기

프로젝트를 처음부터 만드는 중이고 아직 GameInstance 클래스가 없는 경우 먼저 이 예제 지침을 따라 GameInstance 클래스를 만듭니다. 이미 GameInstance 클래스가 있는 프로젝트(예: Unreal의 샘플 라이브러리의 ShooterGame)를 사용하는 경우 ***Modify the GameInstance class*** 섹션으로 이동합니다.

***

Unreal Editor에서:

* **Files** 선택
* **Create a new C++ class** 선택
* **Show all classes** 선택
* 검색 필드에 `GameInstance` 입력
  * 설명된 대로 직접 선택하면 모든 것이 올바르게 생성되고 아래에 자세히 설명된 함수를 추가할 수 있습니다.
* Unreal을 닫고 소스 빌드 모드에서 다시 \_\_Generate project files\_\_를 실행합니다.
* Visual Studio를 사용하여 새로 생성된 파일을 열고 지침에 따라 GameInstance 클래스를 수정합니다.

#### GameInstance 클래스 수정

프로젝트 설정에 따라 C++ 또는 Blueprint를 사용하여 GameInstance 클래스를 수정할 수 있습니다. 두 방법 모두 아래에 제시되어 있으며 요구 사항에 맞는 것을 선택해야 합니다.

#### C++ 구현

GameInstance 클래스를 찾으세요. 이는 \{ProjectName}GameInstance 또는 MyGameInstance와 유사한 이름일 가능성이 큽니다. 이제부터 GameInstance 클래스는 \[YourGameInstanceClassName]으로 표시됩니다.

##### GameInstance 헤더 파일 수정

먼저 include 문을 확인하고 GameInstance 클래스의 헤더 파일(\[YourGameInstanceClassName].h)에 다음이 포함되어 있는지 확인합니다.

```cpp theme={null}
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "MyGameInstance.generated.h"
```

\[선택 사항] 다음 코드를 사용하여 GameInstance 전용 로그 채널을 도입할 수 있습니다. 또는 LogTemp을 사용한 로깅으로 충분합니다.

```cpp theme={null}
DECLARE_LOG_CATEGORY_EXTERN(LogPlayFabGSDKGameInstance, Log, All);
```

그런 다음 공용 섹션에 다음 선언을 추가합니다. (이미 Init() 함수가 있는 경우 다른 선언을 포함할 필요가 없습니다.)

```cpp theme={null}
public:

    virtual void Init() override;
    virtual void OnStart() override;
```

그런 다음 메서드의 protected 섹션에 다음 선언을 추가합니다.

```cpp theme={null}
protected:

    UFUNCTION()
    void OnGSDKShutdown();

    UFUNCTION()
    bool OnGSDKHealthCheck();

    UFUNCTION()
    void OnGSDKServerActive();

    UFUNCTION()
    void OnGSDKReadyForPlayers();

};
```

##### GameInstance CPP 파일 수정

그런 다음 \[YourGameInstanceClassName].cpp 파일을 찾습니다.

다음이 포함되어 있는지 확인합니다.

```cpp theme={null}
#include "[YourGameInstanceClassName].h"
#include "PlayfabGSDK.h"
#include "GSDKUtils.h"
```

헤더 파일에 사용자 지정 로그 채널이 도입된 경우 다음 코드가 필요합니다.

```cpp theme={null}
DEFINE_LOG_CATEGORY(LogPlayFabGSDKGameInstance);

```

그런 다음 Init() 함수를 찾습니다. Init() 함수가 아직 ***없는*** 경우 다음과 같이 함수를 추가합니다.

###### Init() 함수 만들기

```cpp theme={null}
void U[YourGameInstanceClassName]::Init()
{
    FOnGSDKShutdown_Dyn OnGSDKShutdown;
    OnGSDKShutdown.BindDynamic(this, &UMyGameInstance::OnGSDKShutdown);
    FOnGSDKHealthCheck_Dyn OnGSDKHealthCheck;
    OnGSDKHealthCheck.BindDynamic(this, &UMyGameInstance::OnGSDKHealthCheck);
    FOnGSDKServerActive_Dyn OnGSDKServerActive;
    OnGSDKServerActive.BindDynamic(this, &UThirdPersonGameInstance::OnGSDKServerActive);
    FOnGSDKReadyForPlayers_Dyn OnGSDKReadyForPlayers;
    OnGSDKReadyForPlayers.BindDynamic(this, &UThirdPersonGameInstance::OnGSDKReadyForPlayers);

    UGSDKUtils::RegisterGSDKShutdownDelegate(OnGSDKShutdown);
    UGSDKUtils::RegisterGSDKHealthCheckDelegate(OnGSDKHealthCheck);
    UGSDKUtils::RegisterGSDKServerActiveDelegate(OnGSDKServerActive);
    UGSDKUtils::RegisterGSDKReadyForPlayersDelegate(OnGSDKReadyForPlayers);
}
```

***

이미 Init() 함수를 **가지고 있는** 경우 `[YourGameInstanceClassName].cpp` 파일에서 인스턴스가 전용 서버용인지 여부를 나타내는 변수가 있는지 확인합니다. **이 변수를 찾을 수 있으면** Init() 함수의 끝에 다음을 추가합니다.

###### 기존 Init() 함수 수정

```cpp theme={null}
    if (IsDedicatedServerInstance() == true)
    {
        FOnGSDKShutdown_Dyn OnGsdkShutdown;
        OnGsdkShutdown.BindDynamic(this, &UShooterGameInstance::OnGSDKShutdown);
        FOnGSDKHealthCheck_Dyn OnGsdkHealthCheck;
        OnGsdkHealthCheck.BindDynamic(this, &UShooterGameInstance::OnGSDKHealthCheck);
        FOnGSDKServerActive_Dyn OnGSDKServerActive;
        OnGSDKServerActive.BindDynamic(this, &UShooterGameInstance::OnGSDKServerActive);
        FOnGSDKReadyForPlayers_Dyn OnGSDKReadyForPlayers;
        OnGSDKReadyForPlayers.BindDynamic(this, &UShooterGameInstance::OnGSDKReadyForPlayers);

        UGSDKUtils::RegisterGSDKShutdownDelegate(OnGsdkShutdown);
        UGSDKUtils::RegisterGSDKHealthCheckDelegate(OnGsdkHealthCheck);
        UGSDKUtils::RegisterGSDKServerActiveDelegate(OnGSDKServerActive);
        UGSDKUtils::RegisterGSDKReadyForPlayers(OnGSDKReadyForPlayers);
    }
```

MPS의 기본 포트를 설정하는 다음 함수를 호출하여 **Init() 함수를 완성**합니다.

```cpp theme={null}
#if UE_SERVER
    UGSDKUtils::SetDefaultServerHostPort();
#endif
```

***

마지막으로 `[YourGameInstanceClassName].cpp` 파일의 하단에 이러한 메서드 구현을 추가합니다.

```cpp theme={null}
void UMyGameInstance::OnStart()
{
    UE_LOG(LogPlayFabGSDKGameInstance, Warning, TEXT("Reached onStart!"));
    UGSDKUtils::ReadyForPlayers();
}

void UMyGameInstance::OnGSDKShutdown()
{
    UE_LOG(LogPlayFabGSDKGameInstance, Warning, TEXT("Shutdown!"));
    FPlatformMisc::RequestExit(false);
}

bool UMyGameInstance::OnGSDKHealthCheck()
{
    // Uncomment the next line if you want your server to log something at every heartbeat for sanity check.
    /* UE_LOG(LogPlayFabGSDKGameInstance, Warning, TEXT("Healthy!")); */
    return true;
}

void UThirdPersonGameInstance::OnGSDKServerActive()
{
    /**
     * Server is transitioning to an active state.
     * Optional: Add in the implementation any code that is needed for the game server when
     * this transition occurs.
     */
    UE_LOG(LogPlayFabGSDKGameInstance, Warning, TEXT("Active!"));
}

void UThirdPersonGameInstance::OnGSDKReadyForPlayers()
{
    /**
     * Server is transitioning to a StandBy state. Game initialization is complete and the game
     * is ready to accept players.
     * Optional: Add in the implementation any code that is needed for the game server before
     * initialization completes.
     */
    UE_LOG(LogPlayFabGSDKGameInstance, Warning, TEXT("Finished Initialization - Moving to StandBy!"));
}
```

#### Blueprint 구현

이 부분은 순수 C++ 구현이 아닌 Blueprint 구현으로 진행하기로 결정한 경우에만 필요합니다.

* Unreal Editor의 Content Browser 창을 확인합니다.
* 새 Blueprint를 포함할 폴더를 선택하거나 만듭니다.
* 마우스 오른쪽 버튼을 클릭하고 Blueprint 클래스를 만듭니다.
* All classes 드롭다운 메뉴에서 GameInstance 클래스를 찾습니다.
  * 이 예제에서는 blueprint의 이름이 "MyGameInstance"입니다.
* blueprint를 두 번 클릭합니다.
* 왼쪽에서 function 필드 위로 마우스를 가져가서 Override 드롭다운을 선택합니다.
* Init 함수를 선택합니다.
* 그래프에서 마우스 오른쪽 버튼을 클릭하고 모든 register GSDK 함수를 추가합니다.
* GSDK Shutdown 및 Maintenance Delegate의 경우 빨간색 사각형에서 선을 끌어내어 "Add Custom Event"를 선택합니다.
* "Register GSDK Health Check Delegate"의 경우 "Event Dispatchers"에서 "Create Event"를 선택합니다.
* <img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintAddRegisterHealthCheckDelegate.png?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=034809788a483673c44c06da1b4a5ca4" alt="PlayFab GSDK Health Check add" width="1909" height="1059" data-path="images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintAddRegisterHealthCheckDelegate.png" />
* 새 노드의 드롭다운에서 "Create matching function"을 선택합니다. **GSDK Health Check Delegate에는 반환 값이 있으므로 이것이 중요합니다.**
* <img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintRegisterHealthCheckDelegate.png?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=2fb2c95b58172f1e6ad1f1483295c7f7" alt="PlayFab GSDK Health Check register" width="1909" height="844" data-path="images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintRegisterHealthCheckDelegate.png" />
* 함수에서 반환 boolean 값이 확인되었는지 확인합니다.
* <img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintGSDKHealthCheckFunction.png?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=529d14dc173c83d6a75c5cd2cb508483" alt="PlayFab GSDK Health Check function" width="1087" height="373" data-path="images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintGSDKHealthCheckFunction.png" />
* 모든 노드를 Event Init 노드에 연결하는 것을 잊지 마세요.
* 마지막에 PlayFab의 ready 신호에 반응할 수 있도록 "ReadyforPlayers" 노드를 추가합니다.
* 또한 GSDK가 예상하는 포트에 연결하기 위해 "SetDefaultServerHostPort" 노드를 추가하는 것을 잊지 마세요.
* Blueprint에 추가하려는 모든 GSDK 함수/노드에 대해 새 노드에 함수 이름의 처음 몇 글자를 입력하고 예상 GSDK 함수가 제안에 표시되는지 확인하여 존재하는지 확인할 수 있습니다.
* 결과적으로 Blueprint는 아래 이미지에 표시된 것과 유사해야 합니다.
* <img src="https://mintcdn.com/microsoft-4404708b/U1LR64ZWxo45eXwl/images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintFullGraph.png?fit=max&auto=format&n=U1LR64ZWxo45eXwl&q=85&s=b4c7da43fbe2085a2fa9d1f2a7daeddb" alt="PlayFab GSDK Full Graph" width="2387" height="899" data-path="images/playfab/multiplayer/servers/server-sdks/unreal-gsdk/BlueprintFullGraph.png" />

## GameInstance 클래스 설정

gsdk와 통합되는 사용자 지정 GameInstance 클래스를 만든 후에는 실제로 이 새로 만든 GameInstance 클래스를 사용하도록 프로젝트를 구성해야 합니다. 이렇게 하는 방법은 두 가지가 있습니다. Unreal Engine 편집기를 사용하거나 DefaultEngine.ini를 직접 편집합니다.

### Unreal Editor에서

편집기에서 편집기의 UI를 통해 기본 GameInstance를 설정할 수 있습니다. 편집기에서 **Edit** -> \_\_Project Settings\_\_로 이동합니다. 열린 창에서 왼쪽의 \_\_Maps\&Modes\_\_로 이동합니다. 하단으로 스크롤한 다음 `GameInstanceClass` 옵션을 새 GameInstance 클래스로 직접 설정할 수 있습니다(오타에 주의하세요. 정확히 일치해야 합니다).

### DefaultEngine.ini에서

또는 DefaultEngine.ini 파일을 업데이트하고 다음 줄을 추가할 수 있습니다.

```ini theme={null}
[/Script/EngineSettings.GameMapsSettings]
GameInstanceClass=/Script/{ProjectName}.MyGameInstance
```

## Windows 전용 서버용 필수 구성 요소 포함

app-local 필수 구성 요소를 포함하는 방법은 두 가지가 있습니다. Unreal Engine 편집기를 사용하거나 DefaultGame.ini를 편집합니다.

### Unreal Editor에서

편집기에서 Edit -> Project Settings로 이동합니다. 열린 창에서 왼쪽의 Packaging으로 이동합니다. 목록 하단으로 스크롤한 다음 "Include app-local prerequisites"에 체크 표시합니다.

### DefaultGame.ini에서

또는 다음 코드로 DefaultGame.ini를 업데이트할 수 있습니다.

```ini theme={null}
[/Script/UnrealEd.ProjectPackagingSettings]
IncludeAppLocalPrerequisites=True
```

DefaultGame.ini에 카테고리가 이미 있는 경우 두 번째 줄만 추가합니다. 이 구성은 모든 app local 종속성이 프로젝트와 함께 배송되도록 합니다.

Continuous Integration (CI)을 사용하는 경우 이 플래그를 전용 서버를 빌드할 때만 활성화하도록 설정에 추가하여 전용 서버 빌드인 경우에만 필수 구성 요소 DLL이 추가되도록 할 수 있습니다.

## 다음 단계

이제 로컬 컴퓨터에서 [프로젝트를 빌드](/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk/building-the-third-person-mp-example-project)할 준비가 되었습니다.

또는 기본 [Unreal GSDK 플러그인](/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk#unreal-project-build-configurations) 가이드로 돌아갈 수 있습니다.
