- 인쇄
- PDF
Unreal SDK
- 인쇄
- PDF
Classic/VPC 환경에서 이용 가능합니다.
Unreal에서 게임을 개발하기 위한 GAMEPOT Unreal SDK 사용법에 대해 설명합니다. SDK를 설치하고 환경을 구성함으로써 게임과 대시보드를 연동할 수 있습니다.
Unreal용 GAMEPOT SDK를 사용하기 위한 요구 사양은 다음과 같습니다.
- 최소 사양: Unreal 4.26 이상
SDK 설치 및 환경 구성
GAMEPOT Unreal SDK를 설치한 후 환경을 구성하여 GAMEPOT 대시보드와 게임을 연동하고 게임 개발에 필요한 기능을 사용할 수 있습니다.
SDK 설치
GAMEPOT Unreal SDK를 설치하고 Unreal에서 프로젝트를 구성하는 방법은 다음과 같습니다.
- 관리자 계정으로 대시보드에 로그인해 주십시오.
- SDK 다운로드 > 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 입력 <buildGradleAdditions> <insert> ... 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 } ... } </insert> </buildGradleAdditions>
푸시 알림 아이콘 설정
푸시 메시지를 수신했을 때 알림 바에 표시할 아이콘을 설정할 수 있습니다. 별도로 설정하지 않을 경우 SDK에 포함된 기본 이미지를 사용하며, 게임에 맞는 아이콘을 직접 설정할 수 있습니다.
Android Asset Studio를 이용해 제작하면 자동으로 폴더별로 이미지가 제작되어 편리합니다.
푸시 알림 아이콘을 설정하는 방법은 다음과 같습니다.
아래와 같이 프로젝트 경로에 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 이미지 파일 이름을 ic_stat_gamepot_small로 변경해 주십시오.
iOS 환경 설정
GAMEPOT Unreal SDK를 사용하여 iOS 기반의 게임을 개발하려면 필요한 환경을 설정해야 합니다.
빌드시 버전 코드는 정수형태로 유니크하게 증가하는 방식으로 진행 부탁드립니다.
프로젝트 구성
iOS 환경을 설정하기 위해 프로젝트를 구성하는 방법은 다음과 같습니다.
구글 Firebase 콘솔에서 획득한 GoogleService-Info.plist 파일을 Unreal 프로젝트에 추가해 주십시오.
표를 참조하여 프로젝트의 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 입력 프로젝트 설정의 iOS > Extra Plist Data > Additional Plist Data 메뉴에서 아래 사용자 권한 획득 옵션을 추가해 주십시오.
- 게임팟 고객문의 UI 사용시 필요 권한
<key>NSCameraUsageDescription</key> <string>$(PRODUCT_NAME) camera use.</string> <key>NSPhotoLibraryUsageDescription</key> <string>$(PRODUCT_NAME) photo library use.</string> <key>NSMicrophoneUsageDescription</key> <string>$(PRODUCT_NAME) Microphone use.</string>
- 사용자로부터 IDFA 값 획득을 위한 권한 요청 팝업을 사용할 경우
<key>NSUserTrackingUsageDescription</key> <string>$(PRODUCT_NAME) This identifier will collect IDFA for advertising purposes.</string>
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<FNPurchaseItem> 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 콘솔을 설정하는 방법은 아래와 같습니다.
- 구글 Firebase 콘솔에서 획득한 안드로이드용 google-service.json 파일을 $S(PluginDir)/ThirdParty/Android/ 경로에 복사해 주십시오.
- APK를 구성할 때 사용한 Keystore 파일의 SHA-1 값을 Firebase 콘솔에 추가해 주십시오.
- 구글 로그인을 시도할 때 onCancel 응답과 함께 로그인이 되지 않는 경우 아래와 같이 해결해 주십시오.
- google-service.json 파일을 정상적으로 적용하였는지 확인
- APK를 구성할 때 사용한 Keystore와 Firebase 콘솔에 등록하기 위해 SHA-1 값을 추출한 Keystore가 서로 동일한 개체가 맞는지 확인
- Firebase 콘솔에 등록한 패키지 명으로 빌드를 했는지 확인
- AdditionalPlistData 내에 구글 관련 CFBundleURLSchemes 값 추가
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>GoogleService-Info.plist 파일내 REVERSED_CLIENT_ID 값 ex) com.googleusercontent.apps.XXXXXXXXX</string>
</array>
...
</dict>
페이스북 로그인 환경 설정
로그인 기능을 사용하기 위해 페이스북 콘솔을 설정하는 방법은 다음과 같습니다.
Facebook for Developers 콘솔에서 앱 유형을 None 또는 Consumer 또는 Gaming으로 선택한 후 앱을 생성해 주십시오.
APK를 구성할 때 사용한 Keystore의 키 해시값을 Facebook for Developers 콘솔에 추가해 주십시오.
Facebook for Developers 콘솔에서 획득한 앱 ID를 아래 코드에 입력한 후 코드를 안드로이드용 GamePot_Android_UPL.xml 파일에 추가해 주십시오.
... <resourceCopies> <copyFile src="$S(PluginDir)/ThirdParty/Android/libs/gamepot-channel-facebook.aar" dst="$S(BuildDir)/libs/gamepot-channel-facebook.aar" /> </resourceCopies> ... ... <buildGradleAdditions> <insert> ... dependencies { ... implementation(name: 'gamepot-channel-facebook', ext: 'aar') ... } ... defaultConfig { resValue "string", "facebook_app_id", "1234567890" resValue "string", "fb_login_protocol_scheme", "fb1234567890" } ... </insert> </buildGradleAdditions> ... <gameActivityImportAdditions> <insert> import io.gamepot.channel.facebook.GamePotFacebook; </insert> </gameActivityImportAdditions>
프로젝트 GamepotConfig-info.plist 파일에 아래 코드를 추가해 주십시오.
gamepot_facebook_app_id // 페이스북 개발자 콘솔에서 획득한 앱 ID
SourceCode로 확인할 때는 아래와 같이 추가
... <key>gamepot_facebook_app_id</key> <string>xxxxxx</string> ...
AdditionalPlistData 내에 facebook 관련 CFBundleURLSchemes 및 LSApplicationQueriesSchemes 값이 추가
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb[페이스북앱아이디] ex) fb100001</string>
</array>
...
</dict>
…..
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fb-messenger-share-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
……
</array>
애플 로그인 환경 설정
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를 네아로
로 선택한 후 앱을 등록하고 아래 코드를 사용해 주십시오.
안드로이드
- GamePot_Android_UPL.xml 수정
... <resourceCopies> <copyFile src="$S(PluginDir)/ThirdParty/Android/libs/gamepot-channel-naver.aar" dst="$S(BuildDir)/libs/gamepot-channel-naver.aar" /> </resourceCopies> ... <buildGradleAdditions> <insert> ... dependencies { ... implementation(name: 'gamepot-channel-naver', ext: 'aar') ... } ... defaultConfig { resValue "string", "gamepot_naver_clientid", "abcdefg1234567890" resValue "string", "gamepot_naver_secretid", "hijklmn" } ... </insert> </buildGradleAdditions> ... <gameActivityImportAdditions> <insert> import io.gamepot.channel.naver.GamePotNaver; </insert> </gameActivityImportAdditions> ...
- 네이버 개발자 콘솔에서 획득한 Client ID를
gamepot_naver_clientid
값에 입력하고 Client Secret은gamepot_naver_secretid
값에 입력 - 프로젝트 $S(PluginDir)ThirdParty/Android/libs 경로에 gamepot-channel-naver.aar 파일을 추가
- iOS
- GamePotSDKPlugin.Build.cs 파일 수정
... 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" ) } ... } ...
- GamePotConfig-info.plist 파일 수정
SourceCode로 확인할 때는 아래와 같이 추가gamepot_naver_clientid // 네이버에서 사용할 client 아이디 gamepot_naver_secretid // 네이버에서 사용할 secret 아이디 gamepot_naver_urlscheme // 네이버에서 사용할 urlscheme
... <key>gamepot_naver_clientid</key> <string>xxxxxx</string> <key>gamepot_naver_secretid</key> <string>xxxxxx</string> <key>gamepot_naver_urlscheme</key> <string>xxxxxx</string> ...
AdditionalPlistData 내에 네이버 관련 CFBundleURLSchemes 및 LSApplicationQueriesSchemes 값이 추가
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>네이버 콘솔상에 설정한 IOS Schemes 값</string>
</array>
...
</dict>
…..
<key>LSApplicationQueriesSchemes</key>
<array>
<string>naversearchapp</string>
<string>naversearchthirdlogin</string>
<string>navercafe</string>
……
</array>
라인 로그인
라인 로그인 기능을 사용하려면 APK를 구성할 때 사용한 패키지 명, Keystore의 SHA-1 값, URL Scheme 값을 라인 Developers 콘솔에 추가한 후 아래 코드를 사용해 주십시오.
안드로이드
- GamePot_Android_UPL.xml 수정
... <resourceCopies> <copyFile src="$S(PluginDir)/ThirdParty/Android/libs/gamepot-channel-line.aar" dst="$S(BuildDir)/libs/gamepot-channel-line.aar" /> <copyFile src="$S(PluginDir)/ThirdParty/Android/libs/line-sdk-4.0.10.aar" dst="$S(BuildDir)/libs/line-sdk-4.0.10.aar" /> </resourceCopies> ... <buildGradleAdditions> <insert> ... dependencies { ... implementation(name: 'gamepot-channel-line', ext: 'aar') implementation(name: 'line-sdk-4.0.10', ext: 'aar') ... } ... defaultConfig { resValue "string", "gamepot_line_channelid","xxxxxxx" } ... </insert> </buildGradleAdditions> ... <gameActivityImportAdditions> <insert> import io.gamepot.channel.line.GamePotLine; </insert> </gameActivityImportAdditions> ...
- 프로젝트 $S(PluginDir)/ThirdParty/Android/libs 경로에 gamepot-channel-line.aar 파일과 line-sdk-4.0.10.aar 파일을 추가
iOS
- GamePotSDKPlugin.Build.cs 파일 수정
... 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" ) ); } ... } ...
- GamePotConfig-info.plist 파일 수정
gamepot_line_channelid // 네이버에서 사용할 client 아이디 gamepot_line_url_schemes // Line URL Scheme (line3rdp.{프로젝트 번들 identifier})
SourceCode로 확인할 때는 아래와 같이 추가
... <key>gamepot_line_channelid</key> <string>xxxxxx</string> <key>gamepot_line_url_schemes</key> <string>xxxxxx</string> ...
AdditionalPlistData 내에 라인 관련 CFBundleURLSchemes 및 LSApplicationQueriesSchemes 값이 추가
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>line3rdp.{프로젝트 번들 identifier}<</string>
</array>
...
</dict>
…..
<key>LSApplicationQueriesSchemes</key>
<array>
<string>lineauth2</string>
……
</array>
애플 웹 로그인
애플 웹 로그인 기능을 사용하려면 대시보드의 프로젝트 설정 > 일반 메뉴에서 Apple ID Login을 설정한 후 아래 코드를 사용해 주십시오.
- GamePot_Android_UPL.xml 수정
...
<resourceCopies>
<copyFile src="$S(PluginDir)/ThirdParty/Android/libs/gamepot-channel-apple-signin.aar" dst="$S(BuildDir)/libs/gamepot-channel-apple-signin.aar" />
</resourceCopies>
...
<buildGradleAdditions>
<insert>
...
dependencies {
...
implementation(name: 'gamepot-channel-apple-signin', ext: 'aar')
...
}
...
</insert>
</buildGradleAdditions>
...
<gameActivityImportAdditions>
<insert>
import io.gamepot.channel.naver.GamePotAppleSignin;
</insert>
</gameActivityImportAdditions>
...
- 프로젝트 $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 서버로 전달하여 로그인 검증을 진행할 수 있습니다.
자세한 설명은 로그인 검증 요청을 참조해 주십시오.
외부 계정 연동
하나의 게임 계정에 여러 개의 외부 계정을 연결 또는 연결 해제할 수 있습니다.
계정 연동 기능
구글, 페이스북, 네이버 등 다양한 외부 계정과의 연동 기능을 사용하려면 아래 코드를 사용해 주십시오.
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<FNLinkingInfo> 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<FNPurchaseItem> itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseItems();
[Case2]
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseDetailListAsync();
// getPurchaseDetailListAsync 성공
void ASampleGameModeBase::OnSdkPurchaseDetailListSuccess(TArray<FNPurchaseItem> 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
}
결제 아이템 지급 기능
결제 스토어의 영수증 내역과 대조하여 검증을 모두 완료한 경우에만 개발사 서버에 지급 요청을 전송하도록 설정할 수 있습니다.
자세한 설명은 아이템 지급 요청을 참조해 주십시오.
Mycard 결제
마이카드 와 연동하기 위한 FacServiceID / KEY 값은 마이카드 측을 통해 확인 후 대시보드에 설정해 주십시오.
대시보드 > 결제 > IAP의 스토어 타입:Google 항목 > 가격추가 > 통화(ex. TWD)/가격 정보를 기입후 저장해 주십시오.
대시보드 > 프로젝트 설정 > 외부결제 항목에 MyCard를 추가하고 해당 FacService ID / Sign Key 가 정상적으로 입력되어 있는지 확인해 주십시오.
결제는 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<FNPurchaseItem> itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseThirdPaymentsItems();
- $S(PluginDir)/GamePot_Android_UPL.xml 파일을 에디터로 엽니다.
...
<resourceCopies>
...
<copyFile src="$S(PluginDir)/ThirdParty/Android/libs/gamepot-billing-mycard.aar" dst="$S(BuildDir)/libs/gamepot-billing-mycard.aar" />
....
<buildGradleAdditions>
...
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 이 포함 되어 있는지 확인 합니다.
외부 결제
외부 결제 모듈과 연동하려면 먼저 외부 결제 서비스 연동을 참조하여 설정을 완료한 후 아래의 코드를 사용해 주십시오.
// productId : 마켓에 등록된 상품 ID
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchaseThirdPayments(FString productId);
// 상품 정보 리스트를 호출하기 위한 API
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray<FNPurchaseItem> 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<ENLoginType::Type> 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 이미지를 설정하는 방법은 다음과 같습니다.
- 아래와 같이 경로에 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 - 이미지 파일 이름을 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를 사용하여 메시지를 표시해 주십시오.
}
아이템 지급
쿠폰 사용에 성공하면 개발사 서버에 아이템 지급을 요청합니다.
자세한 설명은 아이템 지급 요청을 참조해 주십시오.
푸시 기능
일반 푸시, 야간 푸시, 광고성 푸시 기능을 활성화 또는 비활성화하고, 로컬 푸시 기능을 사용할 수 있습니다.
광고성 푸시 설정은 푸시기능을 사용하신다면 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; // 광고 푸시 허용 여부
}
로컬 푸시 기능
푸시 메시지 서버를 통하지 않고 디바이스에서 자체적으로 푸시를 표시할 수 있습니다.
푸시를 등록하여 정해진 시간에 로컬 푸시가 표시되도록 하려면 아래 코드를 사용해 주십시오.
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
int pushId = FGamePotSDKPluginModule::GetSharedGamePotSdk()->sendLocalPush(FString date, FString title, FString message);
// date : (Format - timestamp "yyyy-MM-dd HH:mm:ss")
// ex > DateTime.Parse("2018-01-01 00:00:00")
// title : "title"
// message : "content"
// pushid의 return 값은 개발사에서 관리
등록한 로컬 푸시 취소
로컬 푸시를 등록할 때 얻은 pushid
값을 사용하여 기존에 등록된 푸시를 취소하려면 아래 코드를 사용해 주십시오.
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
bool success = FGamePotSDKPluginModule::GetSharedGamePotSdk()->cancelLocalPush(int /*푸시 등록시 얻은 pushId*/);
공지사항 이미지 표시 기능
대시보드의 공지사항 메뉴에 업로드한 이미지가 표시되도록 설정할 수 있습니다. 권장 이미지 크기는 아래와 같습니다.
- 크기: 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<FString> headerBackGradient; // 타이틀 영역 하단 라인 색상 UPROPERTY() FString headerBottomColor; // 아이콘 이미지 파일명(aos - drawable / ios - bundle) UPROPERTY() FString headerIconDrawable; // 제목 UPROPERTY() FString headerTitle; // 제목 색상 UPROPERTY() FString headerTitleColor; // 컨텐츠 // 배경 색상(gradient) UPROPERTY() TArray<FString> contentBackGradient; // 아이콘 이미지 파일명(aos - drawable / ios - bundle) UPROPERTY() FString contentIconDrawable; // 아이콘 색상 UPROPERTY() FString contentIconColor; // 체크버튼 색상 UPROPERTY() FString contentCheckColor; // 체크내용 색상 UPROPERTY() FString contentTitleColor; // 보기문구 색상 UPROPERTY() FString contentShowColor; // 하단(게임시작) // 배경 색상(gradient) UPROPERTY() TArray<FString> footerBackGradient; // 게임시작 버튼 배경 색상(gradient) UPROPERTY() TArray<FString> footerButtonGradient; // 게임시작 버튼 외곽선 색상 UPROPERTY() TArray<FString> footerButtonOutlineColor; // 게임시작 문구 UPROPERTY() TArray<FString> footerTitle; // 게임시작 문구 색상 UPROPERTY() TArray<FString> 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<FString> headerBackGradient;
// 제목
UPROPERTY()
FString headerTitle;
// 제목 색상
UPROPERTY()
FString headerTitleColor;
UPROPERTY()
TArray<FString> contentBackGradient;
UPROPERTY()
TArray<FString> listHeaderBackGradient;
UPROPERTY()
FString listHeaderTitleColor;
UPROPERTY()
TArray<FString> listContentBackGradient;
UPROPERTY()
FString listContentTitleColor;
// 배경 색상(gradient)
UPROPERTY()
TArray<FString> footerBackGradient;
// 버튼 배경 색상(gradient)
UPROPERTY()
TArray<FString> 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<FJsonObject> 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); }