--- 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; } ``` - 각 변수는 아래 이미지에 표시된 영역에 적용됩니다. ![gamepot_unreal_002_ko](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/gamepot_unreal_002_ko.png?sv=2026-02-06&spr=https&st=2026-11-14T06%3A18%3A34Z&se=2026-11-14T07%3A18%3A34Z&sr=c&sp=r&sig=KRjsoULc1DXlEmI22jqhOqiOItgtd3BkvADWk5CxLwk%3D) #### 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); } ```