Unreal SDK
    • PDF

    Unreal SDK

    • PDF

    Article Summary

    Classic/VPC 환경에서 이용 가능합니다.

    Unreal에서 게임을 개발하기 위한 GAMEPOT Unreal SDK 사용법에 대해 설명합니다. SDK를 설치하고 환경을 구성함으로써 게임과 대시보드를 연동할 수 있습니다.

    Unreal용 GAMEPOT SDK를 사용하기 위한 요구 사양은 다음과 같습니다.

    • 최소 사양: Unreal 4.26 이상

    SDK 설치 및 환경 구성

    GAMEPOT Unreal SDK를 설치한 후 환경을 구성하여 GAMEPOT 대시보드와 게임을 연동하고 게임 개발에 필요한 기능을 사용할 수 있습니다.

    SDK 설치

    GAMEPOT Unreal SDK를 설치하고 Unreal에서 프로젝트를 구성하는 방법은 다음과 같습니다.

    1. 관리자 계정으로 대시보드에 로그인해 주십시오.
    2. 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_idGAMEPOT에서 발급받은 프로젝트 ID
      gamepot_store스토어 값(google 또는 one 또는 galaxy)
      gamepot_app_title앱 제목 (FCM)
      gamepot_push_default_channel등록된 기본 채널 이름이므로 변경하지 마십시오.
      facebook_app_id페이스북 콘솔에서 획득한 받은 앱 ID
      fb_login_protocol_schemefb[페이스북에서 발급받은 앱 ID] ex) fb101010
      gamepot_naver_clientidNaver 개발자 콘솔에서 획득
      gamepot_naver_secretidNaver 개발자 콘솔에서 획득
      gamepot_line_channelidLine 개발자 콘솔에서 획득
      gamepot_twitter_consumerkeyTwitter 개발자 콘솔에서 획득
      gamepot_twitter_consumersecretTwitter 개발자 콘솔에서 획득
      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를 이용해 제작하면 자동으로 폴더별로 이미지가 제작되어 편리합니다.

    푸시 알림 아이콘을 설정하는 방법은 다음과 같습니다.

    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_idGAMEPOT에서 발급받은 프로젝트 ID
      gamepot_facebook_app_id페이스북에서 획득한 앱 ID
      gamepot_facebook_display_name페이스북에 표시되는 이름
      gamepot_google_app_idGoogleService-Info 파일의 CLIENT_ID
      gamepot_google_url_schemesGoogleService-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 메뉴에서 아래 사용자 권한 획득 옵션을 추가해 주십시오.

      • 게임팟 고객문의 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>
      
    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<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 콘솔을 설정하는 방법은 아래와 같습니다.

    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 값 추가
    <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>
    
    

    페이스북 로그인 환경 설정

    로그인 기능을 사용하기 위해 페이스북 콘솔을 설정하는 방법은 다음과 같습니다.

    1. Facebook for Developers 콘솔에서 앱 유형을 None 또는 Consumer 또는 Gaming으로 선택한 후 앱을 생성해 주십시오.

    2. APK를 구성할 때 사용한 Keystore의 키 해시값을 Facebook for Developers 콘솔에 추가해 주십시오.

    3. 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>
      
      
    4. 프로젝트 GamepotConfig-info.plist 파일에 아래 코드를 추가해 주십시오.

      gamepot_facebook_app_id // 페이스북 개발자 콘솔에서 획득한 앱 ID
      

      SourceCode로 확인할 때는 아래와 같이 추가

      ...
       <key>gamepot_facebook_app_id</key>
       <string>xxxxxx</string>
       ...
      
    5. 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 파일 수정
       gamepot_naver_clientid // 네이버에서 사용할 client 아이디
       gamepot_naver_secretid // 네이버에서 사용할 secret 아이디
       gamepot_naver_urlscheme // 네이버에서 사용할 urlscheme
      
      SourceCode로 확인할 때는 아래와 같이 추가
      ...
      <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 값은 마이카드 측을 통해 확인 후 대시보드에 설정해 주십시오.

    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<FNPurchaseItem> itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseThirdPaymentsItems();
    
    1. $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 이미지를 설정하는 방법은 다음과 같습니다.

    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를 사용하여 메시지를 표시해 주십시오.
    }
    

    아이템 지급

    쿠폰 사용에 성공하면 개발사 서버에 아이템 지급을 요청합니다.

    자세한 설명은 아이템 지급 요청을 참조해 주십시오.

    푸시 기능

    일반 푸시, 야간 푸시, 광고성 푸시 기능을 활성화 또는 비활성화하고, 로컬 푸시 기능을 사용할 수 있습니다.
    광고성 푸시 설정은 푸시기능을 사용하신다면 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;
      }
      


    • 각 변수는 아래 이미지에 표시된 영역에 적용됩니다.
      gamepot_unreal_002_ko

    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서버 ID128
      FNSendLogCharacter.PLAYER_ID선택FString캐릭터 ID128
      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);
      }
      

    이 문서가 도움이 되었습니까?

    What's Next
    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.