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メニューを順にクリックし、ダウンロードをクリックします。

    Android環境の設定

    GAMEPOT Unreal SDKを使用してAndroidベースのゲームを開発するには、必要な環境を設定する必要があります。

    最小スペックの設定

    アプリをインストール及び実行できる最小スペックを設定するには、以下のコードを使用します。

    minSdkVersion:API 19以上(Kitkat)
    

    GamePot_Android_UPL.xmlの修正

    Android環境を設定するための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_idFacebookコンソールで取得したアプリID
      fb_login_protocol_schemeFacebookコンソールで取得したprotocol scheme fb[app_id]
      gamepot_naver_clientidNAVER開発者コンソールで取得
      gamepot_naver_secretidNAVER開発者コンソールで取得
      gamepot_line_channelidLINE開発者コンソールで取得
      gamepot_twitter_consumerkeyTwitter開発者コンソールで取得
      gamepot_twitter_consumersecretTwitter開発者コンソールで取得
      gamepot_elsa_projectidNAVERクラウド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(Facebook)
               resValue "string", "fb_login_protocol_scheme", ""                          // optional(Facebook)
               resValue "string", "gamepot_naver_clientid", ""                              // optional(NAVER開発者コンソールで取得)
               resValue "string", "gamepot_naver_secretid", ""                             // optional(NAVER開発者コンソールで取得)
               resValue "string", "gamepot_line_channelid",""                              // optional(LINE開発者コンソールで取得)
               resValue "string", "gamepot_twitter_consumerkey", ""                  // optional(Twitter開発者コンソールで取得)
               resValue "string", "gamepot_twitter_consumersecret", ""              // optional(Twitter開発者コンソールで取得)
               resValue "string", "gamepot_elsa_projectid", ""                             // optional(NAVERクラウドELSAプロジェクトID)
          }
          ...
      }
        </insert>
      </buildGradleAdditions>
      

    プッシュ通知アイコンの設定

    プッシュメッセージの受信時に、通知バーに表示するアイコンを設定できます。別途設定しない場合は、SDKに含まれている基本画像を使用するとともに、ゲームに合ったアイコンを直接設定できます。

    プッシュ通知アイコンを設定する方法は、以下のとおりです。

    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
    1. 画像ファイル名をic_stat_gamepot_smallに変更します。

    iOS 環境設定

    GAMEPOT Unreal SDKを使用してiOSベースのゲームを開発するには、必要な環境を設定する必要があります。
    ビルド時のバージョンコードは、整数型でユニークに増加する方法で進行してください。

    プロジェクトの構成

    iOS環境を設定するためにプロジェクトを構成する方法は、以下のとおりです。

    1. Google Firebaseコンソールで取得したGoogleService-Info.plistファイルをUnrealプロジェクトに追加します。

    2. 表を参照してプロジェクトのGamePotConfig-Info.plistファイルで以下の設定を変更します。

    環境変数説明
    gamepot_project_idGAMEPOTで発行されたプロジェクトID
    gamepot_facebook_app_idFacebookで取得したアプリID
    gamepot_facebook_display_nameFacebookに表示される名前
    gamepot_google_app_idGoogleService-InfoファイルのCLIENT_ID
    gamepot_google_url_schemesGoogleService-InfoファイルのREVERSED_CLIENT_ID
    gamepot_naver_clientidNAVER Client ID
    gamepot_naver_secretidNAVER Secret ID
    gamepot_naver_urlschemeNAVER URL Scheme
    gamepot_line_channelidLINE Channel ID
    gamepot_line_url_schemesLINE URLスキーム(line3rdp.{プロジェクトバンドルID})
    gamepot_twitter_consumerkeyTwitter Consumer Key
    gamepot_twitter_consumersecretTwitter Consumer Secret
    gamepot_elsa_projectidNAVERクラウドELSA使用時のプロジェクトID
    gamepot_region注意! ゲームポットダッシュボードの作成リージョンがシンガポールの場合のみ、sgを入力
    gamepot_license_url注意! ゲームポットダッシュボードの作成リージョンが日本の場合にのみ、https://gamepot.apigw.ntruss.com/fw/jp-v1 を入力
    1. プロジェクトの設定のiOS > Extra Plist Data > Additional Plist Dataメニューで以下のユーザー権限取得オプションを追加します。
    • GAMEPOTのお問い合わせ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>
    
    • iOS 14以上のバージョンで、ユーザーからIDFAの取得権限をリクエストするポップアップを使用する場合
    <key>NSUserTrackingUsageDescription</key>
    <string>$(PRODUCT_NAME) This identifier will collect IDFA for advertising purposes.</string>
    
    1. 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;                   // 不明なエラー
        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;                // 決済で不明なエラー発生及びストア側からエラーを伝達する場合
        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
    }
    

    ログインに関連する機能

    Google、Facebook、NAVERなど様々なログインSDK機能を統合してGAMEPOT Unreal SDKで使用できます。

    使用前の設定

    ログインに関連するSDK機能を使用するには、必要なコンソールの設定を完了し、ログインに関連するコードを宣言する必要があります。

    Googleログイン環境の設定

    ログイン機能を使用するためにGoogle Firebaseコンソールを設定する方法は、以下のとおりです。

    1. Google Firebaseコンソールで取得したAndroid用google-service.jsonファイルを$S(PluginDir)/ThirdParty/Android/パスにコピーします。

    2. APKを構成する際に使用したKeystoreファイルのSHA-1値をFirebaseコンソールに追加します。

    3. AdditionalPlistData内にGoogle関連のCFBundleURLSchemes値を追加

    <key>CFBundleURLTypes</key>
    <array>
    <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
    <string>GoogleService-Info.plistファイル内のREVERSED_CLIENT_ID値 例) com.googleusercontent.apps.XXXXXXXXX</string>
    </array>
    ...
    </dict>
    


    • Googleログインを行う際に、onCancelレスポンスと一緒にログインされない場合は、以下のように解決してください。
      • google-service.jsonファイルを正常に適用したかどうかを確認
      • APKを構成する際に使用したKeystoreと、Firebaseコンソールを登録するためにSHA-1値を抽出したKeystoreが同じインスタンスであるかどうかを確認
      • Firebaseコンソールに登録したパッケージ名でビルドしたかどうかを確認

    Facebookログイン環境の設定

    ログイン機能を使用するためにFacebookコンソールを設定する方法は、以下のとおりです。

    1. Facebook for DevelopersコンソールでアプリタイプをNoneまたはConsumerまたはGamingにしてアプリを作成します。

    2. APKを構成する際に使用したKeystoreのキーハッシュ値をFacebook for Developersコンソールに追加します。

    3. Facebook for Developersコンソールで取得したアプリIDを以下のコードに入力し、コードをAndroid用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>
    
    1. プロジェクトGamepotConfig-info.plistファイルに以下のコードを追加します。
    gamepot_facebook_app_id// Facebook開発者コンソールで取得したアプリID
    

    SourceCodeで確認する場合は以下のように追加

    ...
     <key>gamepot_facebook_app_id</key>
     <string>xxxxxx</string>
     ...
    
    1. AdditionalPlistData内にFacebook関連のCFBundleURLSchemes及びLSApplicationQueriesSchemes値が追加
    <key>CFBundleURLTypes</key>
    <array>
    <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
    <string>fb[FacebookアプリのID] 例) 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>
    

    Appleログイン環境の設定

    iOS専用のAppleログイン環境を設定するには、プロジェクトで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情報に基づいてポップアップを作って表示します。以下の二つの方式のうち一つを選択してポップアップを構成します。
        // ケース1:開発会社で直接UIを実装したゲーム内ポップアップを使用
        // ケース2:以下のコードを呼び出してSDK独自のポップアップを使用
        IGamePotSdk* ptr = FGamePotSDKPluginModule::GetSharedGamePotSdk();
        if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
            ptr->showAppStatusPopup(NAppStatus.ToJsonString());
    }
    
    // 強制アップデート(ストアバージョンとゲームクライアントバージョンが異なる場合に呼び出す)
    void ASampleGameModeBase::OnLoginNeedUpdate(FNAppStatus NAppStatus)
    {
         // パラメータに渡されたstatus情報に基づいてポップアップを作って表示します。以下の二つの方式のうち一つを選択してポップアップを構成します。
        // ケース1:開発会社で直接UIを実装したゲーム内ポップアップを使用
        // ケース2:以下のコードを呼び出してSDK独自のポップアップを使用
        IGamePotSdk* ptr = FGamePotSDKPluginModule::GetSharedGamePotSdk();
        if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
            ptr->showAppStatusPopup(NAppStatus.ToJsonString());
    }
    
    void ASampleGameModeBase::OnLoginExit()
    {
       // 強制アップデートやメンテナンス機能をケース2方式で実装する場合は、アプリを強制終了できるため、ここでアプリを終了できるように実装します。
    }
    
    void ASampleGameModeBase::OnAppClose()
    {
        // アプリを終了
        // 強制アップデートやメンテナンス機能をケース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 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ログイン

    NAVERログイン機能を使用するには、NAVER Developersコンソールで使用APIをネアロ(NAVER IDでログイン)にし、アプリを登録して以下のコードを使用します。

    • Android

      • 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>
      
      ...
      
      • NAVER開発者コンソールで取得した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// NAVERで使用するClient ID
       gamepot_naver_secretid// NAVERで使用するSecret ID
       gamepot_naver_urlscheme// NAVERで使用するURLスキーム
      

      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内にNAVER関連のCFBundleURLSchemes及びLSApplicationQueriesSchemes値が追加

    <key>CFBundleURLTypes</key>
    <array>
    <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
    <string>NAVERコンソール上に設定したIOS Schemes値</string>
    </array>
    ...
    </dict>
    …..
    <key>LSApplicationQueriesSchemes</key>
    <array>
    <string>naversearchapp</string>
    <string>naversearchthirdlogin</string>
    <string>navercafe</string>
    ……
    </array>
    

    LINEログイン

    LINEログイン機能を使用するには、APKを構成する際に使用したパッケージ名、KeystoreのSHA-1値、URL Scheme値をLINE Developersコンソールに追加し、以下のコードを使用します。

    • Android

      • 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// NAVERで使用するClient ID
       gamepot_line_url_schemes// LINE URLスキーム(line3rdp.{プロジェクトバンドルidentifier})
      

      SourceCodeで確認する場合は以下のように追加

      ...
      <key>gamepot_line_channelid</key>
      <string>xxxxxx</string>
      <key>gamepot_line_url_schemes</key>
      <string>xxxxxx</string>
      ...
      

    AdditionalPlistData内にLINE関連の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ウェブログイン

    Appleウェブログイン機能を使用するには、ダッシュボードのプロジェクトの設定 > 一般メニューでApple IDログインを設定し、以下のコードを使用します。

    • 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サーバに伝達してログイン検証を行えます。

    詳しい説明は、ログイン検証リクエストをご参照ください。

    外部アカウントとの連携

    一つのゲームアカウントに複数の外部アカウントを連携したり、解除できます。

    アカウントの連携機能

    Google、Facebook、NAVERなど様々な外部アカウントとの連携機能を使用するには、以下のコードを使用します。

    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を利用してメッセージを表示します。
    }
    

    決済機能

    In-App購入のための決済機能を使用できます。

    In-App商品の照会機能

    ストアに登録されている商品情報の照会機能を使用するには、以下のコードを使用します。

    if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
        TArray<FNPurchaseItem> itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseItems();
    
    
    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に表示する場合に推奨)通貨と価格が合算された値。ONE Storeの場合、通貨単位は伝達されません。ex) $0.99
    
        UPROPERTY()
        FString price_currency_code;   // 通貨コード ex)KRW、USD
    
        UPROPERTY()
        FString price_with_currency;
    
        UPROPERTY()
        FString title;                  // 商品名
    
        UPROPERTY()
        FString description;           // 商品説明
    }
    

    決済実行機能

    一つの決済APIでGoogle Play StoreとAPPSTOREの両方で決済実行機能を使用できます。

    決済実行機能を使用するには、以下のコードを使用します。

    // productId:ストアに登録されている商品ID
    // uniqueId:別途管理する領収証番号
    // serverId:決済を行ったキャラクターのサーバID
    // playerId:決済を行ったキャラクターのキャラクターID
    // etc:決済を行ったキャラクターのその他の情報
    
    if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
        FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchase(FString productId, FString uniqueId, FString serverId, FString playerId, FString etc);
    
        /// In-App決済に成功
     void ASampleGameModeBase::OnPurchaseSuccess(FNPurchaseInfo NPurchaseInfo)
     {
     }
    
    /// In-App決済をキャンセル
     void ASampleGameModeBase::OnPurchaseCancel()
     {
     }
    
    /// In-App決済に失敗
     void ASampleGameModeBase::OnPurchaseFailure(FNError NError)
     {
           // NError.messageを利用してメッセージを表示します。
     }
    

    決済アイテム情報の取得機能

    ストアに伝達するIn-App決済アイテム情報の取得機能を使用するには、以下のコードを使用します。

    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
    }
    

    決済アイテムの支給機能

    決済ストアの領収書の内訳と対照して検証をすべて完了した場合のみ、開発会社のサーバに支給リクエストを転送するように設定できます。

    詳しい説明は、アイテム支給のリクエストをご参照ください。

    My Card決済

    My Cardと連携させるためのFacServiceID / KEYの値は、My Card側に確認してからダッシュボードで設定してください。

    1. ダッシュボード >> 決済 >> IAPのストアタイプ:Google項目 > 価格の追加 > 追加(ex. TWD)/価格情報を入力し、保存します。

    2. ダッシュボード >> プロジェクトの設定 >> 外部決済項目にMy Cardを追加し、そのFacService ID / Sign Keyが正常に入力されたのか確認します。

    3. 決済はSDKの以下のコードを呼び出します。

    // productId:ストアに登録されている商品IDを入力します。
    // uniqueId:別途管理する領収証番号を入力します。
    // serverId:決済を行ったキャラクターのサーバIDを入力します。
    // playerId:決済を行ったキャラクターのキャラクターIDを入力します。
    // etc:決済を行ったキャラクターのその他の情報を入力します。
    
    if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
        FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchase(FString productId, FString uniqueId, FString serverId, FString playerId, FString etc);
    
    • My Cardの使用中の決済アイテムの呼び出し形式は、以下の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情報に基づいてポップアップを作って表示します。以下の二つの方式のうち一つを選択してポップアップを構成します。
        // ケース1:開発会社で直接UIを実装したゲーム内ポップアップを使用
        // ケース2:以下のコードを呼び出してSDK独自のポップアップを使用
    
        if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
            FGamePotSDKPluginModule::GetSharedGamePotSdk()->showAppStatusPopup(NAppStatus.ToJsonString());
    }
    
    // 強制アップデート(ストアバージョンとゲームクライアントバージョンが異なる場合に呼び出す)
    void ASampleGameModeBase::OnLoginNeedUpdate(FNAppStatus NAppStatus)
    {
         // パラメータに渡されたstatus情報に基づいてポップアップを作って表示します。以下の二つの方式のうち一つを選択してポップアップを構成します。
        // ケース1:開発会社で直接UIを実装したゲーム内ポップアップを使用
        // ケース2:以下のコードを呼び出してSDK独自のポップアップを使用
    
        if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
            FGamePotSDKPluginModule::GetSharedGamePotSdk()->showAppStatusPopup(NAppStatus.ToJsonString());
    }
    
    void ASampleGameModeBase::OnLoginExit()
    {
        // TODO:Login UIを終了する場合、
    }
    
    void ASampleGameModeBase::OnAppClose()
    {
        // アプリを終了
        // 強制アップデートやメンテナンス機能をケース2方式で実装する場合は、アプリを強制終了できるため、ここでアプリを終了できるように実装します。
    
    }
    

    独自提供のログインUI画像ロゴの設定(Android)

    Android用の独自提供のログインUI上段に表示される画像を設定できます。別途設定しない場合は、SDKに含まれている基本画像を使用するとともに、ゲームに合った画像を直接設定できます。

    Android用の独自提供のログイン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
    1. 画像ファイル名を 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)
    • 容量:250KB以下

    ダッシュボードのお知らせメニューにアップロードした画像が表示されるようにするには、以下のコードを使用します。

    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:GAMEPOTから発行された外部サポートセンター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(); 
    
    // ケース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;
      }
      


    • それぞれの変数は、以下の画像に表示された領域に適用されます。
      gamepotunreal002ko

    GDPR規約のチェックリスト機能

    ダッシュボードで有効にしたGDPRの規約項目をリストの形で取得するには、以下のコードを使用します。

    //返されるデータ形式はFStringタイプで、string[]の形式です。例> "[ 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:非パーソナライズド広告を見るに同意(GDPR適用国)
    

    決済キャンセルを悪用するユーザーに対する再決済ポップアップ機能

    ダッシュボードの決済キャンセルメニューで、Google決済キャンセルを悪用するユーザーを自動的に利用停止するように設定した場合は、その悪用するユーザーに対して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;
    }
    

    Remote Config機能

    ダッシュボードのゲーム > Remote Configメニューに登録したサーバのパラメータ値を取得できます。パラメータ値を取得してSDKで使用すると、ゲームをアップデートせずに各要素を修正及び制御できます。

    取得したパラメータはログイン時にロードされ、その後から呼び出すことができます。

    Remote Config機能を使用するには、以下のコードを使用します。

    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の設定

    ログイン後、当該会員に追加情報を入れる場合に使用してください。
    キーの最大数は50個に制限
    値の最大長さは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必須決済ストア(googleappleonegalaxy)
      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.