---
title: "Unreal SDK"
slug: "game-gamepotunreal"
tags: ["GAMEPOT", "sdk", "Unreal", "GAMEPOT 2.0"]
updated: 2026-09-17T09:07:47Z
published: 2026-09-17T09:07:47Z
canonical: "guide.ncloud-docs.com/game-gamepotunreal"
stale: true
---
> ## Documentation Index
> Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Unreal SDK
Classic/VPC 환경에서 이용 가능합니다.
Unreal에서 게임을 개발하기 위한 GAMEPOT Unreal SDK 사용법에 대해 설명합니다. SDK를 설치하고 환경을 구성함으로써 게임과 대시보드를 연동할 수 있습니다.
Unreal용 GAMEPOT SDK를 사용하기 위한 요구 사양은 다음과 같습니다.
- 최소 사양: Unreal 4.26 이상
## SDK 설치 및 환경 구성
GAMEPOT Unreal SDK를 설치한 후 환경을 구성하여 GAMEPOT 대시보드와 게임을 연동하고 게임 개발에 필요한 기능을 사용할 수 있습니다.
### SDK 설치
GAMEPOT Unreal SDK를 설치하고 Unreal에서 프로젝트를 구성하는 방법은 다음과 같습니다.
1. [GAMEPOT SDK 다운로드 > Unreal](/docs/game-gamepot-gamepotsdk-unreal)에서 다운로드 링크를 클릭해 주십시오.
### 안드로이드 환경 설정
GAMEPOT Unreal SDK를 사용하여 안드로이드 기반의 게임을 개발하려면 필요한 환경을 설정해야 합니다.
#### 최소 사양 설정
앱을 설치 및 실행할 수 있는 최소 사양을 설정하려면 아래의 코드를 사용해 주십시오.
```
minSdkVersion : API 19 이상 (Kitkat)
```
#### GamePot_Android_UPL.xml 수정
안드로이드 환경을 설정하기 위해 GamePot_Android_UPL.xml 파일을 수정하려면 다운로드한 $S(PluginDir)/GamePot_Android_UPL.xml 파일을 Unreal에서 연 후 표를 참조하여 코드의 입력값을 수정해 주십시오.
- `(optional)` 값은 사용하지 않을 때에는 해당 줄을 삭제해 주십시오.
| 값 | 설명 |
| --- | --- |
| gamepot_project_id | GAMEPOT에서 발급받은 프로젝트 ID |
| gamepot_store | 스토어 값(`google` 또는 `one` 또는 `galaxy`) |
| gamepot_app_title | 앱 제목 (FCM) |
| gamepot_push_default_channel | 등록된 기본 채널 이름이므로 변경하지 마십시오. |
| facebook_app_id | 페이스북 콘솔에서 획득한 받은 앱 ID |
| fb_login_protocol_scheme | fb[페이스북에서 발급받은 앱 ID] ex) fb101010 |
| gamepot_naver_clientid | Naver 개발자 콘솔에서 획득 |
| gamepot_naver_secretid | Naver 개발자 콘솔에서 획득 |
| gamepot_line_channelid | Line 개발자 콘솔에서 획득 |
| gamepot_twitter_consumerkey | Twitter 개발자 콘솔에서 획득 |
| gamepot_twitter_consumersecret | Twitter 개발자 콘솔에서 획득 |
| gamepot_elsa_projectid | 네이버 클라우드 ELSA 사용시 프로젝트 ID |
| gamepot_region | 게임팟 대시보드 생성 리전이 싱가포르인 경우에만 sg 입력 |
| gamepot_license_url | 게임팟 대시보드 생성 리전이 일본인경우 경우만 https://gamepot.apigw.ntruss.com/fw/jp-v1 입력 |
```
...
android {
...
defaultConfig {
...
resValue "string", "gamepot_project_id", "" // required
resValue "string", "gamepot_store", "google" // required
resValue "string", "gamepot_app_title","@string/app_name" // required (fcm)
resValue "string", "gamepot_push_default_channel","Default" // required (fcm)
resValue "string", "facebook_app_id", "" // optional (페이스북)
resValue "string", "fb_login_protocol_scheme", "" // optional (페이스북)
resValue "string", "gamepot_naver_clientid", "" // optional (네이버 개발자 콘솔에서 획득)
resValue "string", "gamepot_naver_secretid", "" // optional (네이버 개발자 콘솔에서 획득)
resValue "string", "gamepot_line_channelid","" // optional (라인 개발자 콘솔에서 획득)
resValue "string", "gamepot_twitter_consumerkey", "" // optional (트위터 개발자 콘솔에서 획득)
resValue "string", "gamepot_twitter_consumersecret", "" // optional (트위터 개발자 콘솔에서 획득)
resValue "string", "gamepot_elsa_projectid", "" // optional (네이버 클라우드 ELSA 프로젝트 ID
resValue "string", "gamepot_region", "" // Caution! Only if the gamepot region is Singapore , value as sg
}
...
}
```
#### 푸시 알림 아이콘 설정
푸시 메시지를 수신했을 때 알림 바에 표시할 아이콘을 설정할 수 있습니다. 별도로 설정하지 않을 경우 SDK에 포함된 기본 이미지를 사용하며, 게임에 맞는 아이콘을 직접 설정할 수 있습니다. [Android Asset Studio](http://romannurik.github.io/AndroidAssetStudio/icons-notification.html#source.type=clipart&source.clipart=ac_unit&source.space.trim=1&source.space.pad=0&name=ic_stat_gamepot_small)를 이용해 제작하면 자동으로 폴더별로 이미지가 제작되어 편리합니다.
푸시 알림 아이콘을 설정하는 방법은 다음과 같습니다.
1. 아래와 같이 프로젝트 경로에 res/drawable 폴더를 각각 생성한 후 각 크기별 이미지 파일을 추가해 주십시오.
| 폴더명 | 크기 |
| --- | --- |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-mdpi/ | 24x24 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-hdpi/ | 36x36 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-xhdpi/ | 48x48 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-xxhdpi/ | 72x72 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-xxxhdpi/ | 96x96 |
2. 이미지 파일 이름을 ic_stat_gamepot_small로 변경해 주십시오.
### iOS 환경 설정
GAMEPOT Unreal SDK를 사용하여 iOS 기반의 게임을 개발하려면 필요한 환경을 설정해야 합니다.
빌드시 **버전 코드**는 정수형태로 유니크하게 증가하는 방식으로 진행 부탁드립니다.
#### 프로젝트 구성
iOS 환경을 설정하기 위해 프로젝트를 구성하는 방법은 다음과 같습니다.
1. 구글 Firebase 콘솔에서 획득한 GoogleService-Info.plist 파일을 Unreal 프로젝트에 추가해 주십시오.
2. 표를 참조하여 프로젝트의 GamePotConfig-Info.plist 파일에서 아래 설정을 변경해 주십시오.
| 환경 변수 | 설명 |
| --- | --- |
| gamepot_project_id | GAMEPOT에서 발급받은 프로젝트 ID |
| gamepot_facebook_app_id | 페이스북에서 획득한 앱 ID |
| gamepot_facebook_display_name | 페이스북에 표시되는 이름 |
| gamepot_google_app_id | GoogleService-Info 파일의 `CLIENT_ID` 값 |
| gamepot_google_url_schemes | GoogleService-Info 파일의 `REVERSED_CLIENT_ID` 값 |
| gamepot_naver_clientid | 네이버 Client ID |
| gamepot_naver_secretid | 네이버 Secret ID |
| gamepot_naver_urlscheme | 네이버 Url Scheme |
| gamepot_line_channelid | 라인 Channel ID |
| gamepot_line_url_schemes | 라인 URL Scheme (line3rdp.{프로젝트 번들 ID}) |
| gamepot_twitter_consumerkey | 트위터 Consumer Key |
| gamepot_twitter_consumersecret | 트위터 Consumer Secret |
| gamepot_elsa_projectid | 네이버 클라우드 ELSA 사용 시 프로젝트 ID |
| gamepot_region | 게임팟 대시보드 생성 리전이 싱가포르인 경우에만 sg 입력 |
| gamepot_license_url | 게임팟 대시보드 생성 리전이 일본인경우 경우만 https://gamepot.apigw.ntruss.com/fw/jp-v1 입력 |
3. 프로젝트 설정의 **iOS > Extra Plist Data > Additional Plist Data** 메뉴에서 아래 사용자 권한 획득 옵션을 추가해 주십시오.
```
NSCameraUsageDescription
$(PRODUCT_NAME) camera use.
NSPhotoLibraryUsageDescription
$(PRODUCT_NAME) photo library use.
NSMicrophoneUsageDescription
$(PRODUCT_NAME) Microphone use.
```
```
NSUserTrackingUsageDescription
$(PRODUCT_NAME) This identifier will collect IDFA for advertising purposes.
```
- 게임팟 고객문의 UI 사용시 필요 권한
- 사용자로부터 IDFA 값 획득을 위한 권한 요청 팝업을 사용할 경우
4. GamePotResources.embeddedframework 를 .zip으로 압축한 후 $S(PluginDir)/ThirdParty/iOS/GamePotResources.embeddedframework.zip 의 경로에 추가한 후 빌드를 진행해 주십시오.
### 초기화
초기화를 수행하려면 게임을 시작할 때 로드되는 첫 장면에 사용되는 개체에 아래 코드를 추가해 주십시오. 각 예제 파일을 기준으로 설명합니다.
- 초기화 예시 1 - ASampleGameModeBase.h
```
#include "GamePotSDKPluginModule.h"
//(해당 레벨에서 사용되는) GAMEPOT API에 대한, Callback Event Listener 선언
UCLASS()
class GAMEPOTSDKSAMPLE_API ASampleGameModeBase : public AGameModeBase
{
...
void OnLoginSuccess(FNUserInfo NUserInfo);
void OnLoginCancel();
void OnLoginFailure(FNError NError);
void OnLoginMaintenance(FNAppStatus NAppStatus);
void OnLoginNeedUpdate(FNAppStatus NAppStatus);
void OnLoginExit();
...
};
```
- 초기화 예시 2 - ASampleGameModeBase.cpp
```
#include "ASampleGameModeBase.h"
void ASampleGameModeBase::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
AGameModeBase::InitGame(MapName, Options, ErrorMessage);
//(header에서 선언한 Event Listener를) GamePotPluginModule의 Callback Event Listener에 바인딩
if (FGamePotSDKPluginModule::IsAvailable())
{
FGamePotSDKPluginModule::OnSdkLoginSuccess.AddUObject(this, &ASampleGameModeBase::OnLoginSuccess);
FGamePotSDKPluginModule::OnSdkLoginCancel.AddUObject(this, &ASampleGameModeBase::OnLoginCancel);
FGamePotSDKPluginModule::OnSdkLoginFailure.AddUObject(this, &ASampleGameModeBase::OnLoginFailure);
FGamePotSDKPluginModule::OnSdkLoginMaintenance.AddUObject(this, &ASampleGameModeBase::OnLoginMaintenance);
FGamePotSDKPluginModule::OnSdkLoginNeedUpdate.AddUObject(this, &ASampleGameModeBase::OnLoginNeedUpdate);
FGamePotSDKPluginModule::OnSdkLoginExit.AddUObject(this, &ASampleGameModeBase::OnLoginExit);
FGamePotSDKPluginModule::OnSdkLogoutSuccess.AddUObject(this, &ASampleGameModeBase::OnLogoutSuccess);
FGamePotSDKPluginModule::OnSdkLogoutFailure.AddUObject(this, &ASampleGameModeBase::OnLogoutFailure);
...
}
}
void ASampleGameModeBase::OnLoginSuccess(FNUserInfo NUserInfo)
{
// Handling NUserInfo..
}
void ASampleGameModeBase::OnLoginCancel()
{
}
void ASampleGameModeBase::OnLoginFailure(FNError NError)
{
// Handling NError Info..
}
```
- 바인딩 Event Listener 목록
```
// Login 성공
FOnSdkLoginSuccess OnSdkLoginSuccess(FNUserInfo NUserInfo);
// Login 취소
FOnSdkLoginCancel OnSdkLoginCancel();
// Login 실패
FOnSdkLoginFailure OnSdkLoginFailure(FNError NError);
// Login (점검)
FOnSdkLoginMaintenance OnSdkLoginMaintenance(FNAppStatus NAppStatus);
// Login (업데이트)
FOnSdkLoginNeedUpdate OnSdkLoginNeedUpdate(FNAppStatus NAppStatus);
// Login UI Close(showLoginWithUI 사용 시)
FOnSdkLoginExit OnSdkLoginExit();
// (점검, 업데이트 시) 앱 종료
FOnSdkAppClose OnSdkAppClose();
// Logout 성공
FOnSdkLogoutSuccess OnSdkLogoutSuccess();
// Logout 실패
FOnSdkLogoutFailure OnSdkLogoutFailure(FNError NError);
// showWebview 닫음
FOnWebviewClose OnSdkWebviewClose(FString msg);
// purchase 성공
FOnSdkPurchaseSuccess OnSdkPurchaseSuccess(FNPurchaseInfo NPurchaseInfo);
// purchase 취소
FOnSdkPurchaseCancel OnSdkPurchaseCancel();
// purchase 실패
FOnSdkPurchaseFailure OnSdkPurchaseFailure(FNError NError);
// getPurchaseDetailListAsync 성공
FOnSdkPurchaseDetailListSuccess OnSdkPurchaseDetailListSuccess(TArray Items);
// getPurchaseDetailListAsync 실패
FOnSdkPurchaseDetailListFailure OnSdkPurchaseDetailListFailure(FNError NError);
// createLinking 성공
FOnSdkCreateLinkingSuccess OnSdkCreateLinkingSuccess(FNUserInfo NUserInfo);
// createLinking 취소
FOnSdkCreateLinkingCancel OnSdkCreateLinkingCancel();
// createLinking 실패
FOnSdkCreateLinkingFailure OnSdkCreateLinkingFailure(FNError NError);
// deleteLinking 성공
FOnSdkDeleteLinkingSuccess OnSdkDeleteLinkingSuccess();
// deleteLinking 실패
FOnSdkDeleteLinkingFailure OnSdkDeleteLinkingFailure(FNError NError);
// 공지사항 이미지(showNotice, showEvent)를 클릭 시 scheme 콜백이 실행
FOnSdkReceiveScheme OnSdkReceiveScheme(FString scheme);
// deleteMember 성공
FOnSdkDeleteMemberSuccess OnSdkDeleteMemberSuccess();
// deleteMember 실패
FOnSdkDeleteMemberFailure OnSdkDeleteMemberFailure(FNError NError);
// coupon (사용)성공
FOnSdkCouponSuccess OnSdkCouponSuccess(FString msg);
// coupon (사용)실패
FOnSdkCouponFailure OnSdkCouponFailure(FNError NError);
// showAgreeDialog (약관동의여부) 갱신 성공
FOnAgreeDialogSuccess OnSdkAgreeDialogSuccess(FNAgreeResultInfo NAgreeResultInfo);
// showAgreeDialog (약관동의여부) 갱신 실패
FOnAgreeDialogFailure OnSdkAgreeDialogFailure(FNError NError);
// setPush 성공
FOnPushSuccess OnSdkPushSuccess();
// setPushAdStatus 성공
FOnPushAdSuccess OnSdkPushAdSuccess();
// setPushNightStatus 성공
FOnPushNightSuccess OnSdkPushNightSuccess();
// setPushStatus 성공
FOnPushStatusSuccess OnSdkPushStatusSuccess();
// setPush 실패
FOnPushFailure OnSdkPushFailure(FNError NError);
// setPushAdStatus 실패
FOnPushAdFailure OnSdkPushAdFailure(FNError NError);
// setPushNightStatus 실패
FOnPushNightFailure OnSdkPushNightFailure(FNError NError);
// setPushStatus 실패
FOnPushStatusFailure OnSdkPushStatusFailure(FNError NError);
```
### 오류 코드 설정
오류 코드를 설정하려면 아래의 코드를 사용해 주십시오.
```
USTRUCT()
struct FNError
{
//Detail Error code
static const int CODE_UNKNOWN_ERROR = 0; // 알 수 없는 Error
static const int CODE_NOT_INITALIZE = 1; // 초기화 실패
static const int CODE_INVAILD_PARAM = 2; // 파라미터가 올바르지 않은 경우
static const int CODE_MEMBERID_IS_EMPTY = 3; // 멤버 ID 데이터가 없는 경우
static const int CODE_NOT_SIGNIN = 4; // 로그인이 되지 않은 상태
static const int CODE_NETWORK_MODULE_NOT_INIT = 3000; // 네트워크 모듈이 초기화 되지 않은 경우
static const int CODE_NETWORK_ERROR = 3001; // 네트웍 연결 오류 및 타임아웃 발생 시
static const int CODE_SERVER_ERROR = 4000; // server-side에서 발생하는 오류
static const int CODE_SERVER_HTTP_ERROR = 4001; // http response code가 성공이 아닌 경우
static const int CODE_SERVER_NETWORK_ERROR = 4002; // 네트웍 연결 오류 및 타임아웃 발생 시
static const int CODE_SERVER_PARSING_ERROR = 4003; // 서버에서 받은 데이터를 파싱할때 오류
static const int CODE_CHARGE_UNKNOWN_ERROR = 5000; // 결제에서 알 수 없는 오류 발생 및 스토어 측에서 Error를 전달한 경우
static const int CODE_CHARGE_PRODUCTID_EMPTY = 5001; // product id를 입력하지 않은 경우
static const int CODE_CHARGE_PRODUCTID_WRONG = 5002; // product id를 잘못 이벽한 경우
static const int CODE_CHARGE_CONSUME_ERROR = 5003; // consume시 오류
UPROPERTY()
int code; // error Code
UPROPERTY()
FString message; // error Message
}
```
## 로그인 관련 기능
구글, 페이스북, 네이버 등 다양한 로그인 SDK 기능을 통합하여 GAMEPOT Unreal SDK에서 사용할 수 있습니다.
### 사용 전 설정
로그인 관련 SDK 기능을 사용하려면 필요한 콘솔 설정을 완료하고 로그인 관련 코드를 선언해야 합니다.
#### 구글 로그인 환경 설정
로그인 기능을 사용하기 위해 구글 Firebase 콘솔을 설정하는 방법은 아래와 같습니다.
1. 구글 Firebase 콘솔에서 획득한 안드로이드용 google-service.json 파일을 $S(PluginDir)/ThirdParty/Android/ 경로에 복사해 주십시오.
2. APK를 구성할 때 사용한 Keystore 파일의 SHA-1 값을 Firebase 콘솔에 추가해 주십시오.
- 구글 로그인을 시도할 때 onCancel 응답과 함께 로그인이 되지 않는 경우 아래와 같이 해결해 주십시오.
- google-service.json 파일을 정상적으로 적용하였는지 확인
- APK를 구성할 때 사용한 Keystore와 Firebase 콘솔에 등록하기 위해 SHA-1 값을 추출한 Keystore가 서로 동일한 개체가 맞는지 확인
- Firebase 콘솔에 등록한 패키지 명으로 빌드를 했는지 확인
1. AdditionalPlistData 내에 구글 관련 CFBundleURLSchemes 값 추가
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
GoogleService-Info.plist 파일내 REVERSED_CLIENT_ID 값 ex) com.googleusercontent.apps.XXXXXXXXX
...
```
#### 페이스북 로그인 환경 설정
로그인 기능을 사용하기 위해 페이스북 콘솔을 설정하는 방법은 다음과 같습니다.
1. Facebook for Developers 콘솔에서 앱 유형을 **None** 또는 **Consumer** 또는 **Gaming**으로 선택한 후 앱을 생성해 주십시오.
2. APK를 구성할 때 사용한 Keystore의 키 해시값을 Facebook for Developers 콘솔에 추가해 주십시오.
3. Facebook for Developers 콘솔에서 획득한 앱 ID를 아래 코드에 입력한 후 코드를 안드로이드용 GamePot_Android_UPL.xml 파일에 추가해 주십시오.
```
...
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-facebook', ext: 'aar')
...
}
...
defaultConfig {
resValue "string", "facebook_app_id", "1234567890"
resValue "string", "fb_login_protocol_scheme", "fb1234567890"
}
...
...
import io.gamepot.channel.facebook.GamePotFacebook;
```
4. 프로젝트 GamepotConfig-info.plist 파일에 아래 코드를 추가해 주십시오.
```
gamepot_facebook_app_id // 페이스북 개발자 콘솔에서 획득한 앱 ID
```
SourceCode로 확인할 때는 아래와 같이 추가
```
...
gamepot_facebook_app_id
xxxxxx
...
```
5. AdditionalPlistData 내에 facebook 관련 CFBundleURLSchemes 및 LSApplicationQueriesSchemes 값이 추가
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
fb[페이스북앱아이디] ex) fb100001
...
…..
LSApplicationQueriesSchemes
fbapi
fb-messenger-api
fb-messenger-share-api
fbauth2
fbshareextension
……
```
#### 애플 로그인 환경 설정
iOS 전용 애플 로그인 환경을 설정하려면 프로젝트의 Config 경로에 있는 DefaultEngine.ini 파일 내의 `/Script/IOSRuntimeSettings.IOSRuntimeSettings` 항목에 `bEnableSignInWithAppleSupport=True` 플래그값을 추가해 주십시오.
### 로그인 기능
개발사에서 구현한 로그인 UI에 따라 로그인 버튼을 클릭했을 때 동작하는 SDK 로그인 기능을 사용하려면 아래 코드를 사용해 주십시오. 사용자 정보 확인을 위한 `MemberId`가 생성되며, 생성된 정보는 `FNUserInfo`에 저장되어 리턴됩니다.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->Login(ENLoginType::Type loginType);
void ASampleGameModeBase::OnLoginSuccess(FNUserInfo NUserInfo)
{
// 로그인 성공
}
void ASampleGameModeBase::OnLoginCancel()
{
// 로그인 취소
}
void ASampleGameModeBase::OnLoginFailure(FNError NError)
{
// 로그인 실패
// NError.message를 사용하여 메시지를 표시해 주십시오.
}
// 점검(대시보드에 점검 기능이 활성화되어 있는 경우 호출)
void ASampleGameModeBase::OnLoginMaintenance(FNAppStatus NAppStatus)
{
// 파라미터로 넘어온 status 정보를 토대로 팝업을 만들어 표시해야 합니다. 아래 두 가지 방식 중 한 가지를 선택하여 팝업을 구성해 주십시오.
// case 1: 개발사에서 직접 UI를 구현한 인게임 팝업 사용
// case 2: 아래 코드를 호출하여 SDK 자체 팝업 사용
IGamePotSdk* ptr = FGamePotSDKPluginModule::GetSharedGamePotSdk();
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
ptr->showAppStatusPopup(NAppStatus.ToJsonString());
}
// 강제 업데이트(스토어 버전과 클라이언트 버전이 다를 경우 호출)
void ASampleGameModeBase::OnLoginNeedUpdate(FNAppStatus NAppStatus)
{
// 파라미터로 넘어온 status 정보를 토대로 팝업을 만들어 표시해야 합니다. 아래 두 가지 방식 중 한 가지를 선택하여 팝업을 구성해 주십시오.
// case 1: 개발사에서 직접 UI를 구현한 인게임 팝업 사용
// case 2: 아래 코드를 호출하여 SDK 자체 팝업 사용
IGamePotSdk* ptr = FGamePotSDKPluginModule::GetSharedGamePotSdk();
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
ptr->showAppStatusPopup(NAppStatus.ToJsonString());
}
void ASampleGameModeBase::OnLoginExit()
{
// 강제 업데이트나 점검 기능을 case 2 방식으로 구현하는 경우 앱을 강제 종료할 수 있으므로 이 곳에서 앱을 종료할 수 있도록 구현해 주십시오.
}
void ASampleGameModeBase::OnAppClose()
{
// 앱 종료
// 강제 업데이트나 점검 기능을 case 2 방식으로 구현하는 경우 앱을 강제 종료할 수 있으므로 이 곳에서 앱을 종료할 수 있도록 구현해 주십시오.
}
```
#### LoginType, NUserInfo, NAppStatus 정의
로그인 기능의 각종 파라미터를 설정하려면 아래 코드를 사용해 주십시오.
- **`LoginType`**
```
UENUM()
namespace ENLoginType
{
enum Type
{
NONE,
GOOGLE,
GOOGLEPLAY,
FACEBOOK,
NAVER,
GAMECENTER,
TWITTER,
LINE,
APPLE,
GUEST,
THIRDPARTYSDK,
STANDALONE
};
}
```
- **`NUserInfo`**
```
USTRUCT()
struct FNUserInfo
{
UPROPERTY()
FString memberid; // 멤버 ID(사용자 고유 ID)
UPROPERTY()
FString name; // 이름
UPROPERTY()
FString profileUrl; // 프로필 URL(존재 시)
UPROPERTY()
FString email; // 이메일(존재 시)
UPROPERTY()
FString token; // 유저 유효성 체크용 Token (Token Authentication API에서 사용)
UPROPERTY()
FString userid; // 소셜 미디어 ID
}
```
- **`NAppStatus`**
```
USTRUCT()
struct FNAppStatus
{
UPROPERTY()
FString type; // AppStatus 타입으로 "maintenance"인 경우 점검, "needupdate" :인 경우 업데이트
UPROPERTY()
FString message; // 점검 설정 : 대시보드에서 입력한 메시지
UPROPERTY()
FString url; // 점검 설정 : 대시보드에서 입력한 URL
UPROPERTY()
FString currentAppVersion; // 업데이트 : 현재 App Version
UPROPERTY()
FString updateAppVersion; // 업데이트 : Dashboard에서 입력한 App Version
UPROPERTY()
int currentAppVersionCode; // 업데이트 : 현재 App Code
UPROPERTY()
FString updateAppVersionCode; // 업데이트 : 대시보드에서 입력한 App Version code
UPROPERTY()
bool isForce; // 업데이트 : 대시보드에서 강제 업데이트 설정 시 true
UPROPERTY()
FString resultPayload; // 클라이언트 SDK에서 전달 된 Json 값이므로 무시해 주십시오.
UPROPERTY()
double startedAt; // 점검 : 시작 시간(timestamp)
UPROPERTY()
double endedAt; // 점검 : 종료 시간(timestamp)
}
```
#### IDFA 값 획득을 위한 권한 요청 팝업 설정
iOS 플랫폼에서 사용자 IDFA 값 획득을 위한 권한 요청 팝업을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->requestTrackingAuthorization();
void ASampleGameModeBase::OnSdkResultTrackingAuthorization(FNResultTrackingAuthorization info) {
// info.authorization (FString)
// ATTrackingManagerAuthorizationStatusNotDetermined,
// ATTrackingManagerAuthorizationStatusRestricted,
// ATTrackingManagerAuthorizationStatusDenied,
// ATTrackingManagerAuthorizationStatusAuthorized,
// ATTrackingManagerAuthorizationStatusUnknown
}
// IDFA 값 획득 권한 요청 팝업을 임의로 표시할 수 있습니다. 권한 획득 후에는 메소드를 호출해도 팝업이 뜨지 않습니다.
```
- **팝업 요청 시점 변경**
iOS 플랫폼의 IDFA 값 획득에 대한 권한 요청 팝업은 로그인 API 호출 시 요청됩니다. 해당 팝업 요청을 로그인 시점에 호출하지 않고자 할 경우 $S(PluginDir)/Private/iOS/IOSGamePotSdk.cpp 파일에서 아래와 같이 함수를 수정해 주십시오.
```
void FIOSGamePotSdk::Login(ENLoginType::Type _loginType)
{
//로그인 전, 명시적으로 IDFA 팝업 노출 <-- 필요 시, 주석처리
FIOSGamePotSdk::requestTrackingAuthorization();
...
```
### 계정별 로그인 기능 사용
계정별 로그인 기능을 사용하려면 아래의 코드를 사용하여 설정을 적용해 주십시오.
#### 네이버 로그인
네이버 로그인 기능을 사용하려면 Naver Developers 콘솔에서 사용 API를 `네아로`로 선택한 후 앱을 등록하고 아래 코드를 사용해 주십시오.
- **안드로이드**
```
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-naver', ext: 'aar')
...
}
...
defaultConfig {
resValue "string", "gamepot_naver_clientid", "abcdefg1234567890"
resValue "string", "gamepot_naver_secretid", "hijklmn"
}
...
...
import io.gamepot.channel.naver.GamePotNaver;
...
```
- GamePot_Android_UPL.xml 수정
- 네이버 개발자 콘솔에서 획득한 Client ID를 `gamepot_naver_clientid` 값에 입력하고 Client Secret은 `gamepot_naver_secretid` 값에 입력
- 프로젝트 $S(PluginDir)ThirdParty/Android/libs 경로에 gamepot-channel-naver.aar 파일을 추가
- **iOS**
```
...
public GamePotSDKPlugin(ReadOnlyTargetRules Target) : base(Target)
{
...
else if (Target.Platform == UnrealTargetPlatform.IOS)
{
PublicAdditionalFrameworks.Add(
new Framework(
"GamePotNaver",
ModuleDirectory+"/ThirdParty/iOS/GamePotNaver.framework"
)
);
PublicAdditionalFrameworks.Add(
new Framework(
"NaverThirdPartyLogin",
ModuleDirectory+"/ThirdParty/iOS/NaverThirdPartyLogin.framework"
)
}
...
}
...
```
```
gamepot_naver_clientid // 네이버에서 사용할 client 아이디
gamepot_naver_secretid // 네이버에서 사용할 secret 아이디
gamepot_naver_urlscheme // 네이버에서 사용할 urlscheme
```
SourceCode로 확인할 때는 아래와 같이 추가
```
...
gamepot_naver_clientid
xxxxxx
gamepot_naver_secretid
xxxxxx
gamepot_naver_urlscheme
xxxxxx
...
```
- GamePotSDKPlugin.Build.cs 파일 수정
- GamePotConfig-info.plist 파일 수정
AdditionalPlistData 내에 네이버 관련 CFBundleURLSchemes 및 LSApplicationQueriesSchemes 값이 추가
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
네이버 콘솔상에 설정한 IOS Schemes 값
...
…..
LSApplicationQueriesSchemes
naversearchapp
naversearchthirdlogin
navercafe
……
```
#### 라인 로그인
라인 로그인 기능을 사용하려면 APK를 구성할 때 사용한 패키지 명, Keystore의 SHA-1 값, URL Scheme 값을 라인 Developers 콘솔에 추가한 후 아래 코드를 사용해 주십시오.
- **안드로이드**
```
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-line', ext: 'aar')
implementation(name: 'line-sdk-4.0.10', ext: 'aar')
...
}
...
defaultConfig {
resValue "string", "gamepot_line_channelid","xxxxxxx"
}
...
...
import io.gamepot.channel.line.GamePotLine;
...
```
- GamePot_Android_UPL.xml 수정
- 프로젝트 $S(PluginDir)/ThirdParty/Android/libs 경로에 gamepot-channel-line.aar 파일과 line-sdk-4.0.10.aar 파일을 추가
- **iOS**
```
...
public GamePotSDKPlugin(ReadOnlyTargetRules Target) : base(Target)
{
...
else if (Target.Platform == UnrealTargetPlatform.IOS)
{
PublicAdditionalFrameworks.Add(
new Framework(
"GamePotLine",
ModuleDirectory+"/ThirdParty/iOS/GamePotLine.framework"
)
);
PublicAdditionalFrameworks.Add(
new Framework(
"LineSDK",
ModuleDirectory+"/ThirdParty/iOS/LineSDK.framework"
)
);
PublicAdditionalFrameworks.Add(
new Framework(
"LineSDKObjC",
ModuleDirectory+"/ThirdParty/iOS/LineSDKObjC.framework"
)
);
}
...
}
...
```
```
gamepot_line_channelid // 네이버에서 사용할 client 아이디
gamepot_line_url_schemes // Line URL Scheme (line3rdp.{프로젝트 번들 identifier})
```
SourceCode로 확인할 때는 아래와 같이 추가
```
...
gamepot_line_channelid
xxxxxx
gamepot_line_url_schemes
xxxxxx
...
```
AdditionalPlistData 내에 라인 관련 CFBundleURLSchemes 및 LSApplicationQueriesSchemes 값이 추가
- GamePotSDKPlugin.Build.cs 파일 수정
- GamePotConfig-info.plist 파일 수정
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
line3rdp.{프로젝트 번들 identifier}<
...
…..
LSApplicationQueriesSchemes
lineauth2
……
```
#### 애플 웹 로그인
애플 웹 로그인 기능을 사용하려면 대시보드의 **프로젝트 설정 > 일반** 메뉴에서 Apple ID Login을 설정한 후 아래 코드를 사용해 주십시오.
- GamePot_Android_UPL.xml 수정
```
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-apple-signin', ext: 'aar')
...
}
...
...
import io.gamepot.channel.naver.GamePotAppleSignin;
...
```
- 프로젝트 $S(PluginDir)/ThirdParty/Android/libs 경로에 gamepot-channel-apple-signin.aar 파일을 추가
### 자동 로그인 기능
회원이 마지막으로 로그인했던 정보를 전달하는 API를 통한 자동 로그인 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
ENLoginType::Type loginType = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getLastLoginType();
if(loginType != ENLoginType::NONE) {
{
// 마지막에 로그인했던 로그인 타입으로 로그인하는 방식입니다.
FGamePotSDKPluginModule::GetSharedGamePotSdk()->Login(loginType);
}
else
{
// 처음 게임을 실행했거나 로그아웃한 상태. 로그인을 할 수 있는 로그인 화면으로 이동해 주십시오.
}
```
### 로그아웃 기능
로그아웃 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->Logout();
void ASampleGameModeBase::OnLogoutSuccess()
{
}
void ASampleGameModeBase::OnLogoutFailure(FNError NError)
{
// 로그아웃 실패. NError.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 회원 탈퇴 기능
회원 탈퇴 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->deleteMember();
/// 회원 탈퇴 성공
void ASampleGameModeBase::OnDeleteMemberSuccess()
{
}
void ASampleGameModeBase::OnDeleteMemberFailure(FNError NError)
{
// 회원 탈퇴 실패. NError.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 로그인 검증 기능
로그인 완료 후 로그인 정보를 개발사 서버에서 GAMEPOT 서버로 전달하여 로그인 검증을 진행할 수 있습니다.
자세한 설명은 [로그인 검증 요청](/docs/game-gamepotserver#%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B2%80%EC%A6%9D%EC%9A%94%EC%B2%AD)을 참조해 주십시오.
## 외부 계정 연동
하나의 게임 계정에 여러 개의 외부 계정을 연결 또는 연결 해제할 수 있습니다.
### 계정 연동 기능
구글, 페이스북, 네이버 등 다양한 외부 계정과의 연동 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
UENUM()
namespace ENLinkingType
{
enum Type
{
NONE,
GOOGLEPLAY,
GAMECENTER,
GOOGLE,
FACEBOOK,
NAVER,
TWITTER,
LINE,
APPLE,
THIRDPARTYSDK
};
}
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->createLinking(ENLinkingType::Type linkingType);
void ASampleGameModeBase::OnCreateLinkingSuccess(FNUserInfo NUserInfo) {
// 계정 연동 성공
}
void ASampleGameModeBase::OnCreateLinkingCancel() {
// 유저가 계정 연동을 취소한 경우
}
void ASampleGameModeBase::OnCreateLinkingFailure(FNError NError) {
// 계정 연동 실패. NError.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 연동 리스트 확인 기능
계정에 연동된 외부 계정 목록을 확인하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray linkedList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getLinkedList();
//링크 정보 정의
USTRUCT()
struct FNLinkingInfo
{
UPROPERTY()
ENLinkingType::Type provider; // 계정 연동 정보 (google, facebook, naver, apple..)
}
}
```
### 연동 해제 기능
외부 계정과의 연동 해제 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->deleteLinking(ENLinkingType::Type linkType);
void ASampleGameModeBase::OnDeleteLinkingSuccess() {
/// 계정 연동 해제 성공
}
void ASampleGameModeBase::OnDeleteLinkingFailure(FNError NError) {
/// 계정 연동 해제 실패. NError.message를 사용하여 메시지를 표시해 주십시오.
}
```
## 결제 기능
인앱 구매를 위한 결제 기능을 사용할 수 있습니다.
### 인앱 상품 조회 기능
스토어에 등록된 상품 정보를 조회하는 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
[Case1]
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseItems();
[Case2]
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseDetailListAsync();
// getPurchaseDetailListAsync 성공
void ASampleGameModeBase::OnSdkPurchaseDetailListSuccess(TArray Items)
{
}
// getPurchaseDetailListAsync 실패
void ASampleGameModeBase::OnSdkPurchaseDetailListFailure(FNError NError)
{
}
USTRUCT()
struct FNPurchaseItem
{
UPROPERTY()
FString productId; // 상품 ID
UPROPERTY()
FString type; // 상품 타입. "inapp"으로 고정
UPROPERTY()
FString price; // 가격 google 스토어 : $0.99, 그 외 스토어 : 0.99
UPROPERTY()
FString price_amount;
UPROPERTY()
FString price_amount_micros; // (UI에 노출 시 권장) 통화와 가격이 합쳐진 값. 원스토어의 경우 통화 단위는 전달되지 않습니다. ex) $0.99
UPROPERTY()
FString price_currency_code; // 통화코드 ex) KRW, USD
UPROPERTY()
FString price_with_currency;
UPROPERTY()
FString title; // 상품 이름
UPROPERTY()
FString description; // 상품 설명
}
```
### 결제 시도 기능
하나의 결제 API로 구글 플레이스토어, 애플 앱스토어 모두에서 결제 시도 기능을 사용할 수 있습니다.
결제 시도 기능을 사용하려면 아래의 코드를 사용해 주십시오.
```
// productId : 스토어에 등록된 상품ID
// uniqueId : 별도로 관리하는 영수증 번호
// serverId : 결제를 진행한 캐릭터의 서버 ID
// playerId : 결제를 진행한 캐릭터의 캐릭터 ID
// etc : 결제를 진행한 캐릭터 기타 정보
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchase(FString productId, FString uniqueId, FString serverId, FString playerId, FString etc);
/// 인앱 결제 성공
void ASampleGameModeBase::OnPurchaseSuccess(FNPurchaseInfo NPurchaseInfo)
{
}
/// 인앱 결제 취소
void ASampleGameModeBase::OnPurchaseCancel()
{
}
/// 인앱 결제 실패
void ASampleGameModeBase::OnPurchaseFailure(FNError NError)
{
// NError.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 결제 아이템 정보 획득 기능
스토어에서 전달하는 인앱 결제 아이템 정보를 획득하는 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
USTRUCT()
struct FNPurchaseInfo
{
UPROPERTY()
FString price; // 결제 아이템의 가격
UPROPERTY()
FString productId; // 결제 아이템 ID
UPROPERTY()
FString currency; // 결제 가격 통화(KRW/USD)
UPROPERTY()
FString orderId; // 스토어 Order ID
UPROPERTY()
FString productName; // 결제 아이템 이름
UPROPERTY()
FString gamepotOrderId; // GAMEPOT에서 생성한 order id
UPROPERTY()
FString uniqueId; // 개발사에서 별도로 관리하는 영수증 ID
UPROPERTY()
FString serverId; // 결제를 진행한 캐릭터의 서버 ID
UPROPERTY()
FString playerId; // 결제를 진행한 캐릭터의 캐릭터 ID
UPROPERTY()
FString etc; // 결제를 진행한 캐릭터의 기타 정보
UPROPERTY()
FString signature; // 스토어 signature
UPROPERTY()
FString originalJSONData; // 영수증 Data
}
```
### 결제 아이템 지급 기능
결제 스토어의 영수증 내역과 대조하여 검증을 모두 완료한 경우에만 개발사 서버에 지급 요청을 전송하도록 설정할 수 있습니다.
자세한 설명은 [아이템 지급 요청](/docs/game-gamepotserver#%EC%95%84%EC%9D%B4%ED%85%9C%EC%A7%80%EA%B8%89%EC%9A%94%EC%B2%AD)을 참조해 주십시오.
### Mycard 결제
마이카드 와 연동하기 위한 FacServiceID / KEY 값은 마이카드 측을 통해 확인 후 대시보드에 설정해 주십시오.
1. 대시보드 > 결제 > IAP의 스토어 타입:Google 항목 > 가격추가 > 통화(ex. TWD)/가격 정보를 기입후 저장해 주십시오.
2. 대시보드 > 프로젝트 설정 > 외부결제 항목에 MyCard를 추가하고 해당 FacService ID / Sign Key 가 정상적으로 입력되어 있는지 확인해 주십시오.
3. 결제는 SDK의 아래 코드를 호출 합니다.
```
// productId : 스토어에 등록된 상품ID를 입력해 주시면 됩니다.
// uniqueId : 별도로 관리하는 영수증 번호를 넣으시면 됩니다.
// serverId : 결제를 진행한 캐릭터의 서버아이디를 입력해 주시면 됩니다.
// playerId : 결제를 진행한 캐릭터의 캐릭터 아이디를 입력해 주시면 됩니다.
// etc : 결제를 진행한 캐릭터 기타 정보를 넣으시면 됩니다.
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchase(FString productId, FString uniqueId, FString serverId, FString playerId, FString etc);
```
- MyCard 사용 중 결제 아이템 호출 형태는 아래의 API를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseThirdPaymentsItems();
```
1. $S(PluginDir)/GamePot_Android_UPL.xml 파일을 에디터로 엽니다.
```
...
...
....
...
dependencies {
...
implementation(name: 'gamepot-billing-mycard', ext: 'aar')
...
defaultConfig {
...
resValue "string", "gamepot_store", "google"
resValue "string", "gamepot_payment", "mycard" // 스토어가 google인 경우에만 동작합니다.
```
5 ../ThirdParty/Android/libs/gamepot-billing-mycard.aar 폴더 내에 gamepot-billing-mycard.aar 이 포함 되어 있는지 확인 합니다.
### 외부 결제
외부 결제 모듈과 연동하려면 먼저 [외부 결제 서비스 연동](/docs/game-gamepot-projectmgmt#%EC%99%B8%EB%B6%80%EA%B2%B0%EC%A0%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EC%97%B0%EB%8F%99)을 참조하여 설정을 완료한 후 아래의 코드를 사용해 주십시오.
```
// productId : 마켓에 등록된 상품 ID
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchaseThirdPayments(FString productId);
// 상품 정보 리스트를 호출하기 위한 API
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseThirdPaymentsItems();
```
## SDK 자체 제공 로그인 UI
GAMEPOT Unreal SDK가 제공하는 완성된 형태의 로그인 UI를 사용할 수 있습니다.
### SDK 자체 제공 로그인 UI 호출
GAMEPOT Unreal SDK가 제공하는 로그인 UI를 호출하려면 아래 코드를 사용해 주십시오.
```
USTRUCT()
struct FNLoginUIInfo
{
//이미지 로고 삽입 여부
UPROPERTY()
bool showLogo;
//UI로 노출할 Login Type
UPROPERTY()
TArray loginTypes; //google, facebook...
}
//호출할 로그인 UI 타입
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showLoginWithUI(FNLoginUIInfo NLoginUIInfo);
void ASampleGameModeBase::OnLoginSuccess(FNUserInfo NUserInfo)
{
// 로그인 성공
}
void ASampleGameModeBase::OnLoginCancel()
{
// 로그인 취소
}
void ASampleGameModeBase::OnLoginFailure(FNError NError)
{
// 로그인 실패. error.message를 사용하여 메시지를 표시해 주십시오.
}
// 점검(대시보드에 점검이 활성화되어 있는 경우 호출)
void ASampleGameModeBase::OnLoginMaintenance(FNAppStatus NAppStatus)
{
// 파라미터로 넘어온 status 정보를 토대로 팝업을 만들어 표시해야 합니다. 아래 두 가지 방식 중 한 가지를 선택하여 팝업을 구성해 주십시오.
// case 1: 개발사에서 직접 UI를 구현한 인게임 팝업 사용
// case 2: 아래 코드를 호출하여 SDK 자체 팝업 사용
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showAppStatusPopup(NAppStatus.ToJsonString());
}
// 강제 업데이트(스토어 버전과 클라이언트 버전이 다를 경우 호출)
void ASampleGameModeBase::OnLoginNeedUpdate(FNAppStatus NAppStatus)
{
// 파라미터로 넘어온 status 정보를 토대로 팝업을 만들어 표시해야 합니다. 아래 두 가지 방식 중 한 가지를 선택하여 팝업을 구성해 주십시오.
// case 1: 개발사에서 직접 UI를 구현한 인게임 팝업 사용
// case 2: 아래 코드를 호출하여 SDK 자체 팝업 사용
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showAppStatusPopup(NAppStatus.ToJsonString());
}
void ASampleGameModeBase::OnLoginExit()
{
// TODO: LoginUI를 종료할 때,
}
void ASampleGameModeBase::OnAppClose()
{
// 앱 종료
// 강제 업데이트나 점검 기능을 case 2 방식으로 구현하는 경우 앱을 강제 종료할 수 있으므로 이 곳에서 앱을 종료할 수 있도록 구현해 주십시오.
}
```
### 자체 제공 로그인 UI 이미지 로고 설정(안드로이드)
안드로이드용 자체 제공 로그인 UI 상단에 표시되는 이미지를 설정할 수 있습니다. 별도로 설정하지 않을 경우 SDK에 포함된 기본 이미지를 사용하며, 게임에 맞는 이미지를 직접 설정할 수 있습니다.
안드로이드용 자체 제공 로그인 UI 이미지를 설정하는 방법은 다음과 같습니다.
1. 아래와 같이 경로에 res/drawable 폴더를 각각 생성한 후 각 크기별 이미지 파일을 추가해 주십시오.
| 폴더명 | 크기 |
| --- | --- |
| $S(PluginDir)/ThirdParty/GamePotResources/res/drawable-mdpi// | 24x24 |
| $S(PluginDir)/ThirdParty/GamePotResources/res/drawable-hdpi/ | 36x36 |
| $S(PluginDir)/ThirdParty/GamePotResources/res/drawable-xhdpi/ | 48x48 |
| $S(PluginDir)/ThirdParty/GamePotResources/res/drawable-xxhdpi/ | 72x72 |
| $S(PluginDir)/ThirdParty/GamePotResources/res/drawable-xxxhdpi/ | 96x96 |
2. 이미지 파일 이름을 ic_stat_gamepot_login_logo.png로 변경해 주십시오.
## 쿠폰 기능
사용자가 쿠폰을 입력하면 사용 처리하는 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
FGamePotSDKPluginModule::GetSharedGamePotSdk()->coupon(FString couponNumber); // 쿠폰번호
FGamePotSDKPluginModule::GetSharedGamePotSdk()->coupon(FString couponNumber, FString userData); // 쿠폰번호, 사용자정보
}
void ASampleGameModeBase::OnCouponSuccess(FString msg)
{
/// 쿠폰 사용 성공
}
void ASampleGameModeBase::OnCouponFailure(FNError NError)
{
// 쿠폰 사용 실패. error.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 아이템 지급
쿠폰 사용에 성공하면 개발사 서버에 아이템 지급을 요청합니다.
자세한 설명은 [아이템 지급 요청](/docs/game-gamepotserver#%EC%95%84%EC%9D%B4%ED%85%9C%EC%A7%80%EA%B8%89%EC%9A%94%EC%B2%AD)을 참조해 주십시오.
## 푸시 기능
일반 푸시, 야간 푸시, 광고성 푸시 기능 활성화 또는 비활성가 가능합니다. 광고성 푸시 설정은 푸시기능을 사용하신다면 true 로 해 주십시오. (광고성 푸시 값이 false 시 일반/야간 푸시 설정 상관없이 푸시가 오지 않습니다.)
### 일반 푸시 설정
일반 푸시를 설정하려면 아래의 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushStatus(bool pushEnable);
void ASampleGameModeBase::OnPushSuccess()
{
/// 푸시 상태 변경에 대한 서버 통신 성공
}
void ASampleGameModeBase::OnPushFailure(FNError NError)
{
// 푸시 상태 변경 실패. error.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 야간 푸시 설정
야간 푸시를 설정하려면 아래의 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushNightStatus(bool nightPushEnable);
void ASampleGameModeBase::OnPushNightSuccess()
{
/// 야간 푸시 상태 변경에 대한 서버 통신 성공
}
void ASampleGameModeBase::OnPushNightFailure(FNError NError)
{
// 야간 푸시 상태 변경 실패. error.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 광고 푸시 설정
광고 푸시를 설정하려면 아래의 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushADStatus(bool adPushEnable);
void ASampleGameModeBase::OnPushAdSuccess()
{
/// 광고 푸시 상태 변경에 대한 서버 통신 성공
}
void ASampleGameModeBase::OnPushFailure(FNError NError)
{
// 광고 푸시 상태 변경 실패. error.message를 사용하여 메시지를 표시해 주십시오.
}
```
#### 일반/야간/광고 푸시 한번에 설정
로그인 전에 푸시 허용 여부를 확인하는 게임인 경우 로그인 후 반드시 아래 코드를 호출해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushStatus(bool pushEnable, bool nightPushEnable, bool adPushEnable);
void ASampleGameModeBase::OnPushStatusSuccess()
{
/// 푸시 상태 변경에 대한 서버 통신 성공
}
void ASampleGameModeBase::OnPushStatusFailure(FNError NError)
{
// 푸시 상태 변경 실패. error.message를 사용하여 메시지를 표시해 주십시오.
}
```
### 푸시 상태 확인
현재 푸시 상태를 확인하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FNPushInfo NPushInfo = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPushStatus();
USTRUCT()
struct FNPushInfo
{
UPROPERTY()
bool enable; // 일반 푸시 허용 여부
UPROPERTY()
bool night; // 야간 푸시 허용 여부
UPROPERTY()
bool ad; // 광고 푸시 허용 여부
}
```
## 공지사항 이미지 표시 기능
대시보드의 **공지사항** 메뉴에 업로드한 이미지가 표시되도록 설정할 수 있습니다. 권장 이미지 크기는 아래와 같습니다.
- 크기: 720x1200(Portrait), 1280x640(Landscape)
- 용량: 250 kB 이하
대시보드 **공지사항** 메뉴에 업로드한 이미지가 표시되도록 하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showNotice(bool showToday = true);
// true : 오늘 하루 보지 않기 적용
// false : 오늘 하루 보지 않기 관계없이 강제 노출
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showEvent(FString Type);
// Type : 대시보드 공지사항 > 분류 메뉴에서 설정한 분류명에 해당하는 이미지만 노출
void ASampleGameModeBase::OnReceiveScheme(FString scheme)
{
// GAMEPOT 대시보드에서 설정한 scheme 값을 전달
}
```
## 고객지원 기능
대시보드와 연동하여 고객 문의, 정책 및 약관 UI 호출, 동의 수집 등의 기능을 사용할 수 있습니다.
### 고객 문의 기능
회원이 문의를 발송하고 담당자가 답변할 수 있는 고객 문의 기능을 사용할 수 있습니다. 대시보드의 **고객지원 > 고객문의** 메뉴와 연동됩니다.
고객 문의 UI는 디바이스 언어에 따라 한국어, 영어, 일어, 중국어 간체 및 번체 중 하나의 언어로 변경되며, 이외의 디바이스 언어일 경우 영어로 변경됩니다.
대시보드와 연동하여 고객 문의 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showCSWebView();
```
#### 외부 링크 고객 문의
외부 링크를 통해 로그인하지 않은 고객도 문의를 등록할 수 있도록 하려면 아래 코드를 사용해 주십시오.
```
// url : 게임팟에서 발급받은 외부고객지원 URL
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showWebView(FString url);
```
### 약관 및 정책 UI 호출 기능
대시보드의 **고객지원** 메뉴에서 작성한 각종 약관, 정책을 UI로 호출할 수 있습니다.
약관 및 정책 UI를 호출하려면 아래 코드를 사용해 주십시오.
- **이용약관**
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showTerms();
```
- **개인정보처리방침**
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showPrivacy();
```
- **환불정책**
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showRefund();
```
### 약관 동의 기능 (GDPR 포함)
제공되는 팝업 UI 기능을 사용하여 대시보드에서 작성한 각종 정책과 약관에 대한 동의를 수집할 수 있습니다. GDPR 정책에 대한 동의도 수집 가능합니다.
#### 약관 동의 UI 호출
제공되는 약관 동의 UI의 테마를 변경하고 호출하려면 아래 코드를 사용해 주십시오.
```
// Case 1) 기본 호출(BLUE 테마로 적용)
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showAgreeDialog();
// Case 2) 그 외 테마로 적용 시
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
// - 기본 테마
// BLUE
// GREEN
// - 개선 테마
// MATERIAL_RED,
// MATERIAL_BLUE,
// MATERIAL_CYAN,
// MATERIAL_ORANGE,
// MATERIAL_PURPLE,
// MATERIAL_DARKBLUE,
// MATERIAL_YELLOW,
// MATERIAL_GRAPE,
// MATERIAL_GRAY,
// MATERIAL_GREEN,
// MATERIAL_PEACH,
FNAgreeInfo info;
info.theme = "MATERIAL_RED";
info.headerTitle = TEXT("title");
info.headerBackGradient = "{ 0xFF00050B, 0xFF0F1B21 }";
info.headerBottomColor = "0xFFFF0000";
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showAgreeDialog(info.ToJsonString());
}
// 약관에 동의한 경우
void ASampleGameModeBase::OnAgreeDialogSuccess(FNAgreeResultInfo NAgreeResultInfo)
{
// NAgreeResultInfo.agree : 필수 약관을 모두 동의한 경우 true
// NAgreeResultInfo.agreePush : (일반) 푸시 수신 동의를 체크한 경우 true, 그렇지 않으면 false
// NAgreeResultInfo.agreeNight : 야간 광고성 수신 동의를 체크한 경우 true, 그렇지 않으면 false
// agreePush / agreeNight 값은 로그인 완료 후 setPushStatus api를 통해 한번에 설정해주십시오.
}
void ASampleGameModeBase::OnAgreeDialogFailure(FNError NError)
{
// 오류 발생
}
```
- NAgreeInfo 정의
```
USTRUCT()
struct FNAgreeInfo
{
// 기본 테마
UPROPERTY()
FString theme;
// 타이틀
// 배경 색상(gradient)
UPROPERTY()
TArray headerBackGradient;
// 타이틀 영역 하단 라인 색상
UPROPERTY()
FString headerBottomColor;
// 아이콘 이미지 파일명(aos - drawable / ios - bundle)
UPROPERTY()
FString headerIconDrawable;
// 제목
UPROPERTY()
FString headerTitle;
// 제목 색상
UPROPERTY()
FString headerTitleColor;
// 컨텐츠
// 배경 색상(gradient)
UPROPERTY()
TArray contentBackGradient;
// 아이콘 이미지 파일명(aos - drawable / ios - bundle)
UPROPERTY()
FString contentIconDrawable;
// 아이콘 색상
UPROPERTY()
FString contentIconColor;
// 체크버튼 색상
UPROPERTY()
FString contentCheckColor;
// 체크내용 색상
UPROPERTY()
FString contentTitleColor;
// 보기문구 색상
UPROPERTY()
FString contentShowColor;
// 하단(게임시작)
// 배경 색상(gradient)
UPROPERTY()
TArray footerBackGradient;
// 게임시작 버튼 배경 색상(gradient)
UPROPERTY()
TArray footerButtonGradient;
// 게임시작 버튼 외곽선 색상
UPROPERTY()
TArray footerButtonOutlineColor;
// 게임시작 문구
UPROPERTY()
TArray footerTitle;
// 게임시작 문구 색상
UPROPERTY()
TArray footerTitleColor;
//일반푸시 노출 여부
UPROPERTY()
bool showPush;
// 야간푸시 노출 여부
UPROPERTY()
bool showNightPush;
// '모두 동의' 문구 변경 시
UPROPERTY()
FString allMessage;
// '이용 약관' 문구 변경 시
UPROPERTY()
FString termMessage;
// '개인정보 취급방침' 문구 변경 시
UPROPERTY()
FString privacyMessage;
// '일반 푸시' 문구 변경 시
UPROPERTY()
FString pushMessage;
// '야간 푸시' 문구 변경 시
UPROPERTY()
FString nightPushMessage;
UPROPERTY()
FString pushDetailURL;
UPROPERTY()
FString nightPushDetailURL;
}
```
- 각 변수는 아래 이미지에 표시된 영역에 적용됩니다.

#### GDPR 약관 체크리스트 기능
대시보드에서 활성화한 GDPR 약관 항목을 리스트 형태로 가져오려면 아래 코드를 사용해 주십시오.
```
//리턴되는 데이터포맷은 FString 타입이며, string[] 형태입니다. ex> "[ gdpr_privacy, gdpr_term ]"
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FString gdpr_list = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getGDPRCheckedList();
// gdpr_privacy : 개인정보처리방침
// gdpr_term : 이용약관
// gdpr_gdpr : GDPR 이용약관
// gdpr_push_normal : 이벤트 푸시 수신동의
// gdpr_push_night : 야간 이벤트 푸시 수신동의 (한국만 해당)
// gdpr_adapp_custom : 개인 맞춤광고 보기에 대한 동의 (GDPR 적용 국가)
// gdpr_adapp_nocustom : 개인 맞춤이 아닌 광rh 보기에 대한 동의 (GDPR 적용 국가)
```
## 결제 취소 악용자 재결제 팝업 기능
대시보드의 **결제 취소** 메뉴를 통해 구글 결제 취소 악용자를 자동으로 이용 정지 처리하도록 설정한 경우, 해당 악용자에게 SDK에서 제공하는 재결제 팝업 UI가 표시되도록 설정할 수 있습니다. UI를 통해 결제 취소한 아이템을 재결제하면 이용 정지가 자동으로 해제됩니다.
결제 취소 악용자 재결제 팝업 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
//테마 종류
// MATERIAL_RED,
// MATERIAL_BLUE,
// MATERIAL_CYAN,
// MATERIAL_ORANGE,
// MATERIAL_PURPLE,
// MATERIAL_DARKBLUE,
// MATERIAL_YELLOW,
// MATERIAL_GRAPE,
// MATERIAL_GRAY,
// MATERIAL_GREEN,
// MATERIAL_PEACH
NVoidInfo info;
info.theme = "MATERIAL_RED";
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setVoidBuilder(info.ToJsonString());
}
```
- NVoidInfo 정의
```
USTRUCT()
struct FNVoidInfo
{
// 기본 테마
UPROPERTY()
FString theme;
// 배경 색상(gradient)
UPROPERTY()
TArray headerBackGradient;
// 제목
UPROPERTY()
FString headerTitle;
// 제목 색상
UPROPERTY()
FString headerTitleColor;
UPROPERTY()
TArray contentBackGradient;
UPROPERTY()
TArray listHeaderBackGradient;
UPROPERTY()
FString listHeaderTitleColor;
UPROPERTY()
TArray listContentBackGradient;
UPROPERTY()
FString listContentTitleColor;
// 배경 색상(gradient)
UPROPERTY()
TArray footerBackGradient;
// 버튼 배경 색상(gradient)
UPROPERTY()
TArray footerButtonGradient;
UPROPERTY()
FString footerTitleColor;
UPROPERTY()
FString descHTML;
UPROPERTY()
FString descColor;
UPROPERTY()
FString listHeaderTitle;
UPROPERTY()
FString footerTitle;
}
```
## 원격 구성 기능
대시보드의 **게임 > 원격구성**메뉴에 등록한 서버 매개변수 값을 가져올 수 있습니다. 매개변수 값을 가져와 SDK에서 사용하면 게임을 업데이트하지 않고 각 요소를 수정 및 제어할 수 있습니다.
가져온 매개변수는 로그인 시점에 로드되며, 그 이후부터 호출할 수 있습니다.
원격 구성 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
//"test_01" : 매개변수 FString
FString value = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getConfig("test_01");
//대시보드에 추가한 모든 매개변수를 json string 형태로 가져옵니다.
FString json_value = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getConfigs();
}
```
## 게임 로그 전송 기능
게임 로그를 호출하여 대시보드의 **게임 > 플레이어** 메뉴에서 확인할 수 있습니다.
게임 로그 전송 기능을 사용하려면 표를 참조하여 아래 코드에 예약어를 입력한 후 코드를 호출해 주십시오.
- **예약어 및 코드**
| 예약어 | 필수 여부 | 타입 | 설명 | 최대 길이 |
| --- | --- | --- | --- | --- |
| `FNSendLogCharacter.NAME` | 필수 | `FString` | 캐릭터명 | 128 |
| `FNSendLogCharacter.LEVEL` | 선택 | `FString` | 레벨 | 128 |
| `FNSendLogCharacter.SERVER_ID` | 선택 | `FString` | 서버 ID | 128 |
| `FNSendLogCharacter.PLAYER_ID` | 선택 | `FString` | 캐릭터 ID | 128 |
| `FNSendLogCharacter.USERDATA` | 선택 | `FString` | 기타 정보 | 128 |
```
USTRUCT()
struct FNSendLogCharacter
{
UPROPERTY()
FString NAME;
UPROPERTY()
FString PLAYER_ID;
UPROPERTY()
FString SERVER_ID;
UPROPERTY()
FString LEVEL;
UPROPERTY()
FString USERDATA;
}
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
FNSendLogCharacter info;
info.NAME = TEXT("tester");
info.PLAYER_ID = TEXT("player_id");
bool result = FGamePotSDKPluginModule::GetSharedGamePotSdk()->characterInfo(info.ToJsonString());
// 결과값 true : 검증 성공. 로그가 GAMEPOT 서버로 전송됩니다.
// 결과값 false : 검증 실패. logcat을 확인해 주십시오.
}
```
### setUserData설정
로그인 후 해당 회원에 추가 정보를 넣고자 할때 사용해 주십시오. key 최대 갯수 50개 제한 value 최대 길이 1024 제한 해당 정보는 회원 상세 항목에서만 확인이 가능합니다.
```
ex)
TSharedPtr JsonObject = MakeShareable(new FJsonObject);
JsonObject->SetStringField("appversion", "1.0.23");
JsonObject->SetStringField("server", "s1");
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setUserData(JsonObject);
void AGamePotSampleGameModeBase_Main::OnSetUserDataSuccess()
{
// 성공
}
void AGamePotSampleGameModeBase_Main::OnSetUserDataFailure(FNError NError)
{
// 실패
}
```
## 3rd Party SDK 연동
GAMEPOT Unreal SDK는 3rd Party SDK와의 연동을 지원합니다.
### 3rd Party SDK 로그인 연동
3rd Party SDK와 연동하여 로그인 기능을 사용하려면 표를 참조하여 아래 코드에 파라미터에 값을 입력한 후 코드를 사용해 주십시오.
- **파라미터 및 코드**
| 파라미터명 | 필수 여부 | 타입 | 설명 |
| --- | --- | --- | --- |
| `userid` | 필수 | `FString` | 사용자 고유 ID 값에 ":"(콜론) 사용 불가 |
```
FString userid = TEXT("memberid of 3rd party sdk");
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->loginByThirdPartySDK(userid);
```
- 자동 로그인을 지원하지 않으므로 매번 호출해야 합니다.
### 3rd Party SDK 결제 연동
3rd Party SDK와 연동하여 결제 기능을 사용하려면 표를 참조하여 아래 코드에 파라미터에 값을 입력한 후 코드를 사용해 주십시오.
- **파라미터 및 코드**
| 파라미터명 | 필수 여부 | 타입 | 설명 |
| --- | --- | --- | --- |
| `productid` | 필수 | `FString` | 대시보드에 등록된 아이템 ID |
| `transactionid` | 필수 | `FString` | 결제 영수증 번호(GPA-xxx-xxxx-xxxx) |
| `store` | 필수 | 결제 스토어(`google`, `apple`, `one`, `galaxy`) | |
| `currency` | 선택 | `FString` | 통화(KRW,USD) |
| `price` | 선택 | `double` | 결제 아이템 금액 |
| `paymentid` | 선택 | `FString` | 결제 ID 일반적으로 store_id와 동일 |
| `uniqueid` | 선택 | `FString` | 개발사에서 사용하는 고유 ID |
```
FString productId = "purchase_001";
FString transactionId = "GPA-xxx-xxxx-xxxx";
FString currency = "KRW";
double price = 1200;
FString paymentId = "google";
FString uniqueId = "developer unique id";
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
FGamePotSDKPluginModule::GetSharedGamePotSdk()->sendPurchaseByThirdPartySDK(FString productId, FString transactionId, FString currency, double price, FString store, FString paymentId, FString uniqueId);
}
```