# PC SDK Unreal 따라하기

UNREAL 기반 게임에 STOVE PC SDK 2.0을 적용하는 방법을 알아보기 위해 HelloStove 프로젝트에 STOVE PC SDK를 연동하고 SDK API를 이용하는 방법에 대해 설명합니다.

confirm 이 예제를 완료하려면,
따라하기 예제를 진행하기 전에 STOVE 런처 (opens new window) 를 미리 설치하고 SDK 개발환경 준비하기 (opens new window)를 참고하여 App key, App secret, Game Id를 발급받아야 합니다.
HelloStove 프로젝트는 Visual Studio 2015 Update 3 에서 제작되었습니다.
HelloStove 프로젝트의 언리얼 StoveSDK 플러그인UNREAL 엔진 4.21.2 이상만 지원하며, EpicGamesLauncherUNREAL 에디터 사전설치가 필요합니다.

# STOVE 런처 설정

(1) PC 클라이언트 다운로드 (opens new window)에서 STOVE 런처를 다운로드합니다.

(2) STOVE 런처가 설치된 폴더에 PolicyConfig.json 파일을 생성

  • Live 기본 설치위치 : C:\Program Files (x86)\Smilegate\STOVE

(3) PolicyConfig.json 파일에 아래 내용을 입력하고 STOVE Studio 프로젝트 등록시에 생성

주의사항

SDK 연동 중에는 STOVE 런처를 실행 후 로그인 된 상태여야 합니다.

아래와 같은 구조로 PolicyConfig.json을 생성한 후

  • Live : C:\Program Files (x86)\Smilegate\STOVE

폴더에 덮어씁니다.Game ID를 확인한 후 교체합니다.




 



{
  "skip_check_game_list":
  [
    "id_hellostove"
  ]
}
1
2
3
4
5
6

참고

"id_hellostove"는 STOVE Partners에 등록한 gameID로 변경 하시면 됩니다.

(4) STOVE 런처를 실행하고 STOVE에 가입한 신청한 스토브ID로 로그인

# 따라하기용 HelloStove 프로젝트 다운로드

아래 링크에서 따라하기용 HelloStove 프로젝트를 다운로드하고 압축을 해제 합니다.

HelloStove 프로젝트는 UNREAL StoveSDK 플러그인이 연동되어 있지 않은 상태입니다. UNREAL StoveSDK 플러그인 연동부터 따라하기를 진행합니다.

# 프로젝트 환경 구성하기

# 1) UNREAL Plugin 폴더 구성하기

HelloStove프로젝트의 StovePCSDK_UNREAL폴더 안에 STOVE PC SDK인 StovePCSDK_UNREAL_x.x.x.zip파일 압축을 해제하면 보이는 Plugins 폴더를 HelloStove프로젝트에 복사하여 하단 그림과 같이 HelloStove_Unreal을 빌드할 수 있는 상태로 구성합니다.

Figure1

HelloStove.uproject를 더블클릭하면 UNREAL리빌드를 할것인지 선택창이 나오고(UNREAL버전에 따라 엔진버전 선택창이 먼저 표시될 수 있습니다) 여기서 예(Y)를 선택하면 해당폴더에 Binaries, Intermediate, Saved등의 부수적인 폴더가 생성됩니다. 부수적인 폴더 생성 후에 최종적으로 UNREAL에디터가 자동실행됩니다.

Figure6

Figure6.2

Figure6.3

# 2) VisualStudio 솔루션 생성하기

UNREAL빌드가 정상적으로 완료되었다면 UNREAL에디터를 이용하여 HelloStove.sln을 생성합니다. HelloStove.uproject를 마우스 우측 클릭해서 Visual Studio 솔루션을 생성할 수 있습니다.

confirm UNREAL버전에 따라 HelloStove.sln파일이 먼저 생성되어 있기도 합니다.

Figure2

# 3) Visual Studio 솔루션에서 StovePCSDKPlugin 구성하기

Visual Studio 솔루션 파일 생성까지 완료하였다면 HelloStove 프로젝트에서 Plugin을 연동하기 위한 다음 순서의 작업이 필요합니다.

# a. StoveSDK_Unreal 빌드 모듈 구성하기

HelloStove 프로젝트(HelloStove_Unreal 폴더)에서 Plugin 모듈을 인식하기 위해 HelloStove.uprojectHelloStove.Build.cs 파일에 모듈이름 종속성을 추가합니다.

HelloStove.sln파일을 더블클릭하여 Visual Studio를 실행하고 솔루션 탐색기에서 HelloStove.uproject 파일을 열어서 Plugin의 명칭인 StoveSDKPlugin를 “AdditionalDependencies”항목 안에 아래 코드와 같이 추가합니다.

HelloStove.uproject

{
	"FileVersion": 3,
	"EngineAssociation": "4.21",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "HelloStove",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
                "UMG",
                "Engine",
                "CoreUObject",
                "StoveSDKPlugin"
			]
		}
	]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

HelloStove.Build.cs에는 Plugin을 UNREAL엔진에 임포트하기 위해 StoveSDKPlugin를 각각 아래 코드와 같이 PublicDependencyModuleNamesPrivateDependencyModuleNames 모듈에 추가(AddRange)합니다.

HelloStove.Build.cs


using UnrealBuildTool;

public class HelloStove : ModuleRules
{
	public HelloStove(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Projects", "StoveSDKPlugin" });


        PrivateDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Projects", "StoveSDKPlugin" });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# b. UMyStoveSDKObject 의 부모클래스 변경하기

위 단계를 통해 Plugin의 빌드 모듈 종속성이 추가 되었다면 스토브 SDK 함수를 사용하기 위해 파생클래스(derived class)인 UMyStoveSDKObject 의 부모클래스 (parent class) 를 기존 UStoveSDKEmptyObject클래스 에서 신규 UStoveSDKObect클래스로 변경합니다.

부모클래스 변경 전에 UMyStoveSDKObject클래스는 스켈레톤 클래스인 UStoveSDKEmptyObject를 상속 받고 있지만 어떠한 기능도 동작하지 않습니다. Plugin의 모든 기능을 사용하기 위해서는 헤더파일 StoveSDKObject.h를 포함(include)하고 UStoveSDKObect 클래스를 새로 상속하도록 변경해야 합니다.

Before

#pragma once

#include "CoreMinimal.h"
#include "StoveSDKEmptyObject.h"
#include "MyStoveSDKObject.generated.h"

DECLARE_DELEGATE_OneParam(FDele_Delegate_Log, FString);



UCLASS()
class HELLOSTOVE_API UMyStoveSDKObject : public UStoveSDKEmptyObject
{
    GENERATED_BODY()
protected:
    // Called when the game starts or when spawned
   ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

After

#pragma once

#include "CoreMinimal.h"
#include "StoveSDKObject.h"
#include "MyStoveSDKObject.generated.h"

DECLARE_DELEGATE_OneParam(FDele_Delegate_Log, FString);


UCLASS()
class HELLOSTOVE_API UMyStoveSDKObject : public UStoveSDKObject
{
    GENERATED_BODY()
protected:
    // Called when the game starts or when spawned
    
    ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

부모클래스 변경이 완료된 후, StoveSDKEmptyObect.h를 프로젝트에서 삭제하거나 헤더를 주석처리만 해도 빌드는 문제없이 진행 됩니다.

# c. UMyGameInstance에서 UMyStoveSDKObect 멤버변수 생성

HelloStoveUMyGameInstance/*remark delete*/ 로 표시된 아래코드의 주석을 제거합니다.

  • UMyGameInstance.h
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
/*remark delete*/
/*#include "MyStoveSDKObject.h"*/
#include "MyGameInstance.generated.h"

UCLASS()
class HELLOSTOVE_API UMyGameInstance : public UGameInstance
{
	GENERATED_BODY()
public:
	UMyGameInstance()
	{
		/*remark delete*/
		/*_stoveSDKObject = NewObject<UMyStoveSDKObject>();*/
	}

private:
	/*remark delete*/
    /*UPROPERTY()
    UMyStoveSDKObject* _stoveSDKObject;*/
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# d. MyUserWidget의 버튼 이벤트 연결

HelloStove프로젝트에는 Plugin API(STOVE SDK)를 테스트하기 위한 버튼이 준비되어 있습니다. Plugin을 연동하고 버튼 이벤트와 연결하기 위해 UMyHelloStoveWidget클래스의 /*remark delete*/ 로 표시된 아래코드의 주석을 제거합니다.

UMyHelloStoveWidget.cpp

    /*remark delete*/
	/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
	stoveSDKObject->_OnDeleLog.BindUObject(this, &UMyHelloStoveWidget::OnEventLog);*/

void UMyHelloStoveWidget::OnClickInit()
{
	/*remark delete*/
	/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
	stoveSDKObject->StoveSDKInit(FStoveConfig{});*/
}

void UMyHelloStoveWidget::OnClickToken()
{
	/*remark delete*/
	/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
	stoveSDKObject->StoveSDKGetToken();*/
}

void UMyHelloStoveWidget::OnClickUser()
{
	/*remark delete*/
	/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
	stoveSDKObject->StoveSDKGetUser();*/
}

void UMyHelloStoveWidget::OnClickUnInit()
{
	/*remark delete*/
	/*auto stoveSDKObject = Cast<UMyStoveSDKObject>(FindStoveSDKObject());
	stoveSDKObject->StoveSDKUnInit();*/
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 4) VisualStudio 솔루션에서 UNREAL 에디터 실행하기

이제까지 모든 과정을 순차적으로 따라했다면 Visual Studio 빌드옵션에서 DevelopmentEditorWin64 항목이 선택된 상태로 디버거 모드로 실행합니다. 솔루션 빌드가 완료되고 UNREAL에디터가 순차적으로 실행되면서 UNREAL에디터 메인 화면이 나타나면, 플러그인이 정상으로 연동된 것입니다.
만약 솔루션 빌드 시에 에러가 발생하는 경우, 출력로그창에서 에러 메시지를 확인하고 #프로젝트 환경 구성하기 전체과정을 재검토하고 에러를 수정합니다. 에러 수정 후에는 HelloStove 프로젝트를 다시 빌드해서 에러없이 UNREAL에디터가 실행되는지 확인합니다.

UNREAL에디터 툴바에 있는 플레이버튼을 눌러 아래 화면처럼 HelloStove 프로젝트의 버튼들이 정상적으로 표시되는지 확인합니다.

Figure3

# Plugin 초기화

Plugin을 초기화하려면 FStovePCConfig 구조체에 Plugin(STOVE PC SDK)의 환경값을 설정하고, 아래 예제 코드를 UMyStoveSDKObject::StoveSDKInit함수에 입력합니다.

주의사항

YOUR_APP_KEY, YOUR_SECRET_KEY, YOUR_GAME_ID는 사전에 발급 받은 데이터로 변경 합니다. 스토브 런처에 로그인 하지 않은 상태로 UMyStoveSDKObject::StoveSDKInit 함수를 호출하면 에러가 발생합니다.

  • MyStoveSDKObject.cpp
FStoveResult UMyStoveSDKObject::StoveSDKInit(const FStoveConfig& Config)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    /*이 함수에서 함수인자로 받은 Config는 무시합니다. */
  
    //config
    FStoveConfig ReplaceConfig{ 
        "LIVE", 
        "YOUR_APP_KEY", 
        "YOUR_SECRET_KEY", 
        "YOUR_GAME_ID", 
        STOVE_PC_LOG_LEVEL_DEBUG, 
        "" };  // logpath
    FStoveResult ErrorResult = Super::StoveSDKInit(ReplaceConfig);
    if (ErrorResult.Result == STOVE_PC_NO_ERROR)
    {        
        OnLog("[Success] StovePC_Init");    
    }
    else
    {
        OnLog("[Error] StovePC_Init, Result %d", ErrorResult.Result);        
    }
    return ErrorResult;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

주의사항

PCSDK 로그경로는 절대적경로로 설정해야 합니다. ex) C:\Program Files\{Your Game Folder}\Logs 마지막에 "\"는 추가하지 않습니다. PCSDK 에서 "StovePCSDK.log" 파일명을 자동으로 추가합니다.
만약 "" 빈문자열로 경로를 설정하게 되면 PCSDK는 자동적으로 게임실행파일 폴더 또는 PCSDK DLL 이 위치한 폴더의 경로로 로그가 생성됩니다.

confirm 위 코드의 YOUR_APP_KEY, YOUR_SECRET_KEY, YOUR_GAME_ID는 STOVE Studio (opens new window)에서 사전에 등록한 ID와 Key값으로 변경해야 됩니다. 만약 STOVE Studio에 입점 신청한 스토브 계정으로 스토브 런처에 로그인 하지 않고 Super::StoveSDKInit 함수가 호출되면 150 에러코드(sgup 초기화 실패)가 발생합니다.

UMyStoveSDKObject::StoveSDKInit 함수의 반환 값이 STOVE_PC_NO_ERROR 즉, '성공'이면 UMyStoveSDKObject의 슈퍼클래스(Super class)인 UStoveSDKObject::StoveSDKInit 함수에서 _isOnCallback값에 true를 입력해서 UStoveSDKObject::Tick함수를 타이머처럼 이용하게 됩니다.

UMyStoveSDKObject::StoveSDKInit 함수가 정상적으로 완료되었는지를 확인하기 위해 콜백 UMyStoveSDKObject::OnInitComplete 함수에 아래와 같이 OnLog를 추가합니다.

MyStoveSDKObject.cpp

void UMyStoveSDKObject::OnInitComplete()
{
    /*여기에 '따라하기' 코드를 추가합니다.*/

    OnLog("[Success] InitComplete");
}

1
2
3
4
5
6
7

UMyStoveSDKObject::StoveSDKInit 함수, 또는 기타 다른 Plugin의 함수 호출이 실패하는 경우 콜백 UMyStoveSDKObject::OnError 함수를 통해 에러 코드를 확인할 수 있습니다. 에러코드를 확인하기 위해서는 아래와 같이 UMyStoveSDKObject::OnError 함수의 인자로 들어오는 FStoveError 구조체를 통해 에러 정보를 얻을 수 있습니다.

MyStoveSDKObject.cpp

void UMyStoveSDKObject::OnError(FStoveError Error)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
 
    OnLog("[Error]");
    OnLog("FuncType: %d", Error.FunctionType);
    OnLog("Result: %d", Error.ErrorResult.Result);
    OnLog("ExternalError: %d", Error.ExternalError);
}
1
2
3
4
5
6
7
8
9

# Plugin 종료

Plugin의 모든 사용이 끝난 뒤에 리소스 정리를 위해 아래 코드와 같이 UMyStoveSDKObject::StoveSDKUnInit 함수에 슈퍼글래스의 Super::StoveSDKUnInit 함수를 호출하여 Plugin 리소스를 해제할 수 있습니다.

MyStoveSDKObject.cpp

FStoveResult UMyStoveSDKObject::StoveSDKUnInit()
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
 
    //SDK 종료
    FStoveResult ErrorResult = Super::StoveSDKUnInit();
    if (ErrorResult.Result == STOVE_PC_NO_ERROR)
    {        
        OnLog("[Success] StovePC_UnInit");    
    }
    else
    {
        OnLog("[Error] StovePC_UnInit, Result %d", ErrorResult.Result);        
    }
     
    return ErrorResult;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 사용자 정보 얻기

STOVE 런처에 로그인한 사용자 정보를 가져오기 위해서는 아래 호출 코드를 UMyStoveSDKObject::StoveSDKGetUser 함수에서 슈퍼클래스의 Super:: StoveSDKGetUser 함수를 호출하는 것으로 사용자 정보를 요청합니다. Super:: StoveSDKGetUser함수가 호출되면 콜백 OnUser함수로 사용자 정보를 전달합니다.

MyStoveSDKObject.cpp

FStoveResult UMyStoveSDKObject::StoveSDKGetUser()
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
 
    FStoveResult ErrorResult = Super::StoveSDKGetUser();
    if (ErrorResult.Result == STOVE_PC_NO_ERROR)
    {
        OnLog("[Success] StovePC_GetUser");        
    }
    else
    {
        OnLog("[Error] StovePC_GetUser, ErrorResult %d", ErrorResult.Result);
    }
    return ErrorResult;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

UMyStoveSDKObject::StoveSDKGetUser 함수가 정상적으로 호출됐을 때의 콜백 OnUser의 인자인 FStoveUser구조체를 통해 사용자정보를 획득합니다. 사용자정보 획득방법은 아래 코드를 통해 확인할 수 있습니다.

MyStoveSDKObject.cpp

void UMyStoveSDKObject::OnUser(FStoveUser User)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/

    OnLog("[User]");
    OnLog("MemberNo : %u", User.MemberNo);
    OnLog("Nickname : %s", *(User.Nickname));
    OnLog("GameUserId: %s", *(User.GameUserId));
    
}
1
2
3
4
5
6
7
8
9
10

# 토큰 정보 얻기

STOVE런처 사용자의 토큰 정보를 얻기 위해서는 UMyStoveSDKObject::StoveSDKGetToken 함수에 슈퍼클래스의 Super::StoveSDKGetToken 함수를 호출하여 획득합니다. StoveSDKGetToken 함수호출 후에 콜백 OnToken함수의 인자로 토큰정보를 확인할 수 있습니다.

MyStoveSDKObject.cpp

FStoveResult UMyStoveSDKObject::StoveSDKGetToken()
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
 
    FStoveResult ErrorResult = Super::StoveSDKGetToken();
    if (ErrorResult.Result == StovePCResult::STOVE_PC_NO_ERROR)
    {        
        OnLog("[Success] StovePC_GetToken");
    }
    else
    {
        OnLog("[Error] StovePC_GetToken, Result %d", ErrorResult.Result);       
    }
 
    return ErrorResult;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

confirm 토큰이란? STOVE 런처에 로그인된 사용자의 엑세스토큰(Access Token)으로 게임서버가 이 엑세스토큰을 스토브 인증서버로 전달해서 로그인한 사용자의 유효성 검증을 수행할 수 있습니다. 엑세스토큰에 대한 상세한 설명은 store.support@smilegate.com로 기술지원을 받으시길 바랍니다.

StoveSDKGetToken 함수가 정상적으로 호출되면 콜백 OnToken함수의 인자인 FStoveToken을 통해 토큰정보를 확인할 수 있습니다.

MyStoveSDKObject.cpp

void UMyStoveSDKObject::OnToken(FStoveToken Token)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
 
    OnLog("[Token]");
    OnLog("Token : %s", *(Token.AccessToken));
}
1
2
3
4
5
6
7

# 빌드 및 실행

HelloStove프로젝트를 빌드 후 실행합니다. UNREAL에디터가 실행되면 툴바의 플레이 버튼을 눌러 데모를 실행하고 화면에 표시되는 각각의 버튼을 순서대로 누르면서 정상적으로 동작하는지 확인합니다.

Figure5

축하합니다!
PC SDK Unreal 따라하기를 성공적으로 완료했습니다.

Last Updated: 2023. 12. 6. 오전 4:02:21