---
title: "Unreal SDK"
slug: "game-gamepotunreal"
tags: ["GAMEPOT"]
updated: 2026-09-17T09:23:32Z
published: 2026-09-17T09:23:32Z
canonical: "guide.ncloud-docs.com/game-gamepotunreal"
stale: true
---
> ## Documentation Index
> Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Unreal SDK
Classic/VPC環境で利用できます。
Unrealでゲームを開発するための GAMEPOT Unreal SDKの使用方法について説明します。SDKをインストールして環境を構成することで、ゲームとダッシュボードを連携できます。
Unreal用GAMEPOT SDKを使用するためのシステム要件は、次の通りです。
- 最小スペック: Unreal 4.26以降
## SDKのインストールと環境の構成
GAMEPOT Unreal SDKをインストールして環境を構成し、GAMEPOTのダッシュボードとゲームを連携してゲーム開発に必要な機能を使用できます。
### SDKのインストール
GAMEPOT Unreal SDKをインストールし、Unrealでプロジェクトを構成する方法は、次の通りです。
1. [GAMEPOT SDKのダウンロード > Unreal](/docs/ja/game-gamepot-gamepotsdk-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_id | GAMEPOTで発行されたプロジェクト ID |
| gamepot_store | ストア値(`google`または`one`または`galaxy`) |
| gamepot_app_title | アプリのタイトル(FCM) |
| gamepot_push_default_channel | 登録されている基本チャンネル名なので、変更しないでください。 |
| facebook_app_id | Facebookコンソールで取得したアプリID |
| fb_login_protocol_scheme | fb[Facebookで発行されたアプリ ID] 例) fb101010 |
| gamepot_naver_clientid | NAVER開発者コンソールで取得 |
| gamepot_naver_secretid | NAVER開発者コンソールで取得 |
| gamepot_line_channelid | LINE開発者コンソールで取得 |
| gamepot_twitter_consumerkey | Twitter開発者コンソールで取得 |
| gamepot_twitter_consumersecret | Twitter開発者コンソールで取得 |
| gamepot_elsa_projectid | NAVERクラウド ELSA使用時のプロジェクト ID |
| gamepot_region | GAMEPOTダッシュボード作成リージョンがシンガポールの場合のみ sgと入力 |
| gamepot_license_url | GAMEPOTダッシュボード作成リージョンが日本の場合のみ https://gamepot.apigw.ntruss.com/fw/jp-v1を入力 |
```
...
android {
...
defaultConfig {
...
resValue "string", "gamepot_project_id", "" // required
resValue "string", "gamepot_store", "google" // required
resValue "string", "gamepot_app_title","@string/app_name" // required (fcm)
resValue "string", "gamepot_push_default_channel","Default" // required (fcm)
resValue "string", "facebook_app_id", "" // optional (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
resValue "string", "gamepot_region", "" // Caution! Only if the gamepot region is Singapore , value as sg
}
...
}
```
#### プッシュ通知アイコンの設定
プッシュメッセージの受信時に、通知バーに表示するアイコンを設定できます。別途設定しない場合は、SDKに含まれている基本画像を使用するとともに、ゲームに合ったアイコンを直接設定できます。 [Android Asset Studio](http://romannurik.github.io/AndroidAssetStudio/icons-notification.html#source.type=clipart&source.clipart=ac_unit&source.space.trim=1&source.space.pad=0&name=ic_stat_gamepot_small)を利用して制作すると、自動的にフォルダ別に画像が制作され便利です。
プッシュ通知アイコンを設定する方法は、次の通りです。
1. 以下のようにプロジェクトパスに res/drawableフォルダをそれぞれ作成し、各サイズの画像ファイルを追加します。
| フォルダ名 | サイズ |
| --- | --- |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-mdpi/ | 24x24 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-hdpi/ | 36x36 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-xhdpi/ | 48x48 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-xxhdpi/ | 72x72 |
| $S(PluginDir)/ThirdParty/Android/GamePotResources/res/drawable-xxxhdpi/ | 96x96 |
2. 画像ファイル名を ic_stat_gamepot_smallに変更します。
### iOS環境の設定
GAMEPOT Unreal SDKを使用して iOSベースのゲームを開発するには、必要な環境を設定する必要があります。
ビルド時の**バージョンコード**は、整数形式でユニークに増加する方式にします。
#### プロジェクトの構成
iOS環境を設定するためにプロジェクトを構成する方法は、次の通りです。
1. Google Firebaseコンソールで取得した GoogleService-Info.plistファイルを Unrealプロジェクトに追加します。
2. 表を参照してプロジェクトの GamePotConfig-Info.plistファイルで以下の設定を変更します。
| 環境変数 | 説明 |
| --- | --- |
| gamepot_project_id | GAMEPOTで発行されたプロジェクト ID |
| gamepot_facebook_app_id | Facebookで取得したアプリ ID |
| gamepot_facebook_display_name | Facebookに表示される名前 |
| gamepot_google_app_id | GoogleService-Infoファイルの`CLIENT_ID`値 |
| gamepot_google_url_schemes | GoogleService-Infoファイルの`REVERSED_CLIENT_ID`値 |
| gamepot_naver_clientid | NAVER Client ID |
| gamepot_naver_secretid | NAVER Secret ID |
| gamepot_naver_urlscheme | NAVER URL Scheme |
| gamepot_line_channelid | LINE Channel ID |
| gamepot_line_url_schemes | LINE URL Scheme (line3rdp.{プロジェクトバンドル ID}) |
| gamepot_twitter_consumerkey | Twitter Consumer Key |
| gamepot_twitter_consumersecret | Twitter Consumer Secret |
| gamepot_elsa_projectid | NAVERクラウド ELSA使用時のプロジェクト ID |
| gamepot_region | GAMEPOTダッシュボード作成リージョンがシンガポールの場合のみ sgと入力 |
| gamepot_license_url | GAMEPOTダッシュボード作成リージョンが日本の場合のみ https://gamepot.apigw.ntruss.com/fw/jp-v1を入力 |
3. プロジェクト設定の **iOS > Extra Plist Data > Additional Plist Data** メニューで、以下のユーザー権限取得オプションを追加します。
```
NSCameraUsageDescription
$(PRODUCT_NAME) camera use.
NSPhotoLibraryUsageDescription
$(PRODUCT_NAME) photo library use.
NSMicrophoneUsageDescription
$(PRODUCT_NAME) Microphone use.
```
```
NSUserTrackingUsageDescription
$(PRODUCT_NAME) This identifier will collect IDFA for advertising purposes.
```
- GAMEPOTのお問い合わせ UIの使用時に必要な権限
- ユーザーからの IDFA取得権限をリクエストするポップアップを使用する場合
4. GamePotResources.embeddedframeworkを.zipで圧縮して $S(PluginDir)/ThirdParty/iOS/GamePotResources.embeddedframework.zipのパスに追加し、ビルドを行います。
### 初期化
初期化を実行するには、ゲームを始める際にロードされる最初の画面に使用されるインスタンスに、以下のコードを追加します。各サンプルファイルに基づいて説明します。
- 初期化の例1 - ASampleGameModeBase.h
```
#include "GamePotSDKPluginModule.h"
//(当該レベルで使用される)GAMEPOT APIに対する、Callback Event Listener宣言
UCLASS()
class GAMEPOTSDKSAMPLE_API ASampleGameModeBase : public AGameModeBase
{
...
void OnLoginSuccess(FNUserInfo NUserInfo);
void OnLoginCancel();
void OnLoginFailure(FNError NError);
void OnLoginMaintenance(FNAppStatus NAppStatus);
void OnLoginNeedUpdate(FNAppStatus NAppStatus);
void OnLoginExit();
...
};
```
- 初期化の例2 - ASampleGameModeBase.cpp
```
#include "ASampleGameModeBase.h"
void ASampleGameModeBase::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
AGameModeBase::InitGame(MapName, Options, ErrorMessage);
//(headerで宣言した Event Listenerを)GamePotPluginModuleの Callback Event Listenerにバインド
if (FGamePotSDKPluginModule::IsAvailable())
{
FGamePotSDKPluginModule::OnSdkLoginSuccess.AddUObject(this, &ASampleGameModeBase::OnLoginSuccess);
FGamePotSDKPluginModule::OnSdkLoginCancel.AddUObject(this, &ASampleGameModeBase::OnLoginCancel);
FGamePotSDKPluginModule::OnSdkLoginFailure.AddUObject(this, &ASampleGameModeBase::OnLoginFailure);
FGamePotSDKPluginModule::OnSdkLoginMaintenance.AddUObject(this, &ASampleGameModeBase::OnLoginMaintenance);
FGamePotSDKPluginModule::OnSdkLoginNeedUpdate.AddUObject(this, &ASampleGameModeBase::OnLoginNeedUpdate);
FGamePotSDKPluginModule::OnSdkLoginExit.AddUObject(this, &ASampleGameModeBase::OnLoginExit);
FGamePotSDKPluginModule::OnSdkLogoutSuccess.AddUObject(this, &ASampleGameModeBase::OnLogoutSuccess);
FGamePotSDKPluginModule::OnSdkLogoutFailure.AddUObject(this, &ASampleGameModeBase::OnLogoutFailure);
...
}
}
void ASampleGameModeBase::OnLoginSuccess(FNUserInfo NUserInfo)
{
// Handling NUserInfo..
}
void ASampleGameModeBase::OnLoginCancel()
{
}
void ASampleGameModeBase::OnLoginFailure(FNError NError)
{
// Handling NError Info..
}
```
- バインドEvent Listenerリスト
```
// Loginに成功
FOnSdkLoginSuccess OnSdkLoginSuccess(FNUserInfo NUserInfo);
// Loginをキャンセル
FOnSdkLoginCancel OnSdkLoginCancel();
// Loginに失敗
FOnSdkLoginFailure OnSdkLoginFailure(FNError NError);
// Login(メンテナンス)
FOnSdkLoginMaintenance OnSdkLoginMaintenance(FNAppStatus NAppStatus);
// Login(アップデート)
FOnSdkLoginNeedUpdate OnSdkLoginNeedUpdate(FNAppStatus NAppStatus);
// Login UI Close(showLoginWithUIを使用時)
FOnSdkLoginExit OnSdkLoginExit();
// (メンテナンス、アップデート時)アプリを終了
FOnSdkAppClose OnSdkAppClose();
// Logoutに成功
FOnSdkLogoutSuccess OnSdkLogoutSuccess();
// Logoutに失敗
FOnSdkLogoutFailure OnSdkLogoutFailure(FNError NError);
// showWebviewを閉じる
FOnWebviewClose OnSdkWebviewClose(FString msg);
// purchaseに成功
FOnSdkPurchaseSuccess OnSdkPurchaseSuccess(FNPurchaseInfo NPurchaseInfo);
// purchaseをキャンセル
FOnSdkPurchaseCancel OnSdkPurchaseCancel();
// purchaseに失敗
FOnSdkPurchaseFailure OnSdkPurchaseFailure(FNError NError);
// getPurchaseDetailListAsyncに成功
FOnSdkPurchaseDetailListSuccess OnSdkPurchaseDetailListSuccess(TArray Items);
// getPurchaseDetailListAsyncに失敗
FOnSdkPurchaseDetailListFailure OnSdkPurchaseDetailListFailure(FNError NError);
// createLinkingに成功
FOnSdkCreateLinkingSuccess OnSdkCreateLinkingSuccess(FNUserInfo NUserInfo);
// createLinkingをキャンセル
FOnSdkCreateLinkingCancel OnSdkCreateLinkingCancel();
// createLinkingに失敗
FOnSdkCreateLinkingFailure OnSdkCreateLinkingFailure(FNError NError);
// deleteLinkingに成功
FOnSdkDeleteLinkingSuccess OnSdkDeleteLinkingSuccess();
// deleteLinkingに失敗
FOnSdkDeleteLinkingFailure OnSdkDeleteLinkingFailure(FNError NError);
// お知らせの画像(showNotice、showEvent)をクリックすると schemeコールバックが実行される
FOnSdkReceiveScheme OnSdkReceiveScheme(FString scheme);
// deleteMemberに成功
FOnSdkDeleteMemberSuccess OnSdkDeleteMemberSuccess();
// deleteMemberに失敗
FOnSdkDeleteMemberFailure OnSdkDeleteMemberFailure(FNError NError);
// coupon(使用)に成功
FOnSdkCouponSuccess OnSdkCouponSuccess(FString msg);
// coupon(使用)に失敗
FOnSdkCouponFailure OnSdkCouponFailure(FNError NError);
// showAgreeDialog(約款に同意したかどうか)更新に成功
FOnAgreeDialogSuccess OnSdkAgreeDialogSuccess(FNAgreeResultInfo NAgreeResultInfo);
// showAgreeDialog(約款に同意したかどうか)更新に失敗
FOnAgreeDialogFailure OnSdkAgreeDialogFailure(FNError NError);
// setPushに成功
FOnPushSuccess OnSdkPushSuccess();
// setPushAdStatusに成功
FOnPushAdSuccess OnSdkPushAdSuccess();
// setPushNightStatusに成功
FOnPushNightSuccess OnSdkPushNightSuccess();
// setPushStatusに成功
FOnPushStatusSuccess OnSdkPushStatusSuccess();
// setPushに失敗
FOnPushFailure OnSdkPushFailure(FNError NError);
// setPushAdStatusに失敗
FOnPushAdFailure OnSdkPushAdFailure(FNError NError);
// setPushNightStatusに失敗
FOnPushNightFailure OnSdkPushNightFailure(FNError NError);
// setPushStatusに失敗
FOnPushStatusFailure OnSdkPushStatusFailure(FNError NError);
```
### エラーコードの設定
エラーコードを設定するには以下のコードを使用します。
```
USTRUCT()
struct FNError
{
//Detail Error code
static const int CODE_UNKNOWN_ERROR = 0; // 不明な Error
static const int CODE_NOT_INITALIZE = 1; // 初期化に失敗
static const int CODE_INVAILD_PARAM = 2; // 無効なパラメータの場合
static const int CODE_MEMBERID_IS_EMPTY = 3; // メンバー IDデータがない場合
static const int CODE_NOT_SIGNIN = 4; // ログインしていない状態
static const int CODE_NETWORK_MODULE_NOT_INIT = 3000; // ネットワークモジュールが初期化されていない場合
static const int CODE_NETWORK_ERROR = 3001; // ネットワーク接続エラーとタイムアウト発生時
static const int CODE_SERVER_ERROR = 4000; // server-sideで発生するエラー
static const int CODE_SERVER_HTTP_ERROR = 4001; // http response codeが成功でない場合
static const int CODE_SERVER_NETWORK_ERROR = 4002; // ネットワーク接続エラーとタイムアウト発生時
static const int CODE_SERVER_PARSING_ERROR = 4003; // サーバから取得したデータをパースする際のエラー
static const int CODE_CHARGE_UNKNOWN_ERROR = 5000; // 決済で不明なエラーが発生したか、ストアから Errorが渡された場合
static const int CODE_CHARGE_PRODUCTID_EMPTY = 5001; // product idを入力していない場合
static const int CODE_CHARGE_PRODUCTID_WRONG = 5002; // 正しくない product idを入力した場合
static const int CODE_CHARGE_CONSUME_ERROR = 5003; // consume時のエラー
UPROPERTY()
int code; // error Code
UPROPERTY()
FString message; // error Message
}
```
## ログインに関連する機能
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コンソールに追加します。
- Googleログインを行う際に、onCancelレスポンスと一緒にログインされない場合は、以下のように解決してください。
- google-service.jsonファイルを正常に適用したか確認します
- APKを構成する際に使用した Keystoreと、Firebaseコンソールを登録するために SHA-1値を抽出した Keystoreが同じインスタンスであるかどうかを確認
- Firebaseコンソールに登録したパッケージ名でビルドしたかどうかを確認
1. AdditionalPlistDataに Google関連の CFBundleURLSchemes値を追加
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
GoogleService-Info.plistファイル内の REVERSED_CLIENT_ID値 例) com.googleusercontent.apps.XXXXXXXXX
...
```
#### 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ファイルに追加します。
```
...
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-facebook', ext: 'aar')
...
}
...
defaultConfig {
resValue "string", "facebook_app_id", "1234567890"
resValue "string", "fb_login_protocol_scheme", "fb1234567890"
}
...
...
import io.gamepot.channel.facebook.GamePotFacebook;
```
4. プロジェクトGamepotConfig-info.plistファイルに以下のコードを追加します。
```
gamepot_facebook_app_id // Facebook開発者コンソールで取得したアプリ ID
```
SourceCodeで確認する場合は以下のように追加
```
...
gamepot_facebook_app_id
xxxxxx
...
```
5. AdditionalPlistDataに facebook関連の CFBundleURLSchemesと LSApplicationQueriesSchemesの値を追加
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
fb[Facebookアプリの ID] 例) fb100001
...
…..
LSApplicationQueriesSchemes
fbapi
fb-messenger-api
fb-messenger-share-api
fbauth2
fbshareextension
……
```
#### 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**
```
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-naver', ext: 'aar')
...
}
...
defaultConfig {
resValue "string", "gamepot_naver_clientid", "abcdefg1234567890"
resValue "string", "gamepot_naver_secretid", "hijklmn"
}
...
...
import io.gamepot.channel.naver.GamePotNaver;
...
```
- GamePot_Android_UPL.xmlの編集
- NAVER開発者コンソールから取得した Client IDを`gamepot_naver_clientid`に入力し、Client Secretは`gamepot_naver_secretid`に入力
- プロジェクト$S(PluginDir)ThirdParty/Android/libsパスに ggamepot-channel-naver.aarrファイルを追加
- **iOS**
```
...
public GamePotSDKPlugin(ReadOnlyTargetRules Target) : base(Target)
{
...
else if (Target.Platform == UnrealTargetPlatform.IOS)
{
PublicAdditionalFrameworks.Add(
new Framework(
"GamePotNaver",
ModuleDirectory+"/ThirdParty/iOS/GamePotNaver.framework"
)
);
PublicAdditionalFrameworks.Add(
new Framework(
"NaverThirdPartyLogin",
ModuleDirectory+"/ThirdParty/iOS/NaverThirdPartyLogin.framework"
)
}
...
}
...
```
```
gamepot_naver_clientid // NAVERで使用する client ID
gamepot_naver_secretid // NAVERで使用する secret ID
gamepot_naver_urlscheme // NAVERで使用する urlscheme
```
SourceCodeで確認する場合は以下のように追加
```
...
gamepot_naver_clientid
xxxxxx
gamepot_naver_secretid
xxxxxx
gamepot_naver_urlscheme
xxxxxx
...
```
- GamePotSDKPlugin.Build.csファイルの変更
- GamePotConfig-info.plistファイルの変更
AdditionalPlistDataに NAVER関連の CFBundleURLSchemesと LSApplicationQueriesSchemesの値を追加
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
NAVERコンソール上に設定した IOS Schemes値
...
…..
LSApplicationQueriesSchemes
naversearchapp
naversearchthirdlogin
navercafe
……
```
#### LINEログイン
LINEログイン機能を使用するには、APKを構成する際に使用したパッケージ名、KeystoreのSHA-1値、URL Scheme値を LINE Developersコンソールに追加し、以下のコードを使用します。
- **Android**
```
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-line', ext: 'aar')
implementation(name: 'line-sdk-4.0.10', ext: 'aar')
...
}
...
defaultConfig {
resValue "string", "gamepot_line_channelid","xxxxxxx"
}
...
...
import io.gamepot.channel.line.GamePotLine;
...
```
- GamePot_Android_UPL.xmlの編集
- プロジェクト$S(PluginDir)/ThirdParty/Android/libsパスに gamepot-channel-line.aarファイルと line-sdk-4.0.10.aarファイルを追加
- **iOS**
```
...
public GamePotSDKPlugin(ReadOnlyTargetRules Target) : base(Target)
{
...
else if (Target.Platform == UnrealTargetPlatform.IOS)
{
PublicAdditionalFrameworks.Add(
new Framework(
"GamePotLine",
ModuleDirectory+"/ThirdParty/iOS/GamePotLine.framework"
)
);
PublicAdditionalFrameworks.Add(
new Framework(
"LineSDK",
ModuleDirectory+"/ThirdParty/iOS/LineSDK.framework"
)
);
PublicAdditionalFrameworks.Add(
new Framework(
"LineSDKObjC",
ModuleDirectory+"/ThirdParty/iOS/LineSDKObjC.framework"
)
);
}
...
}
...
```
```
gamepot_line_channelid // NAVERで使用する client ID
gamepot_line_url_schemes // Line URL Scheme (line3rdp.{プロジェクトバンドル identifier})
```
SourceCodeで確認する場合は以下のように追加
```
...
gamepot_line_channelid
xxxxxx
gamepot_line_url_schemes
xxxxxx
...
```
AdditionalPlistDataに LINE関連の CFBundleURLSchemesと LSApplicationQueriesSchemesの値を追加
- GamePotSDKPlugin.Build.csファイルの変更
- GamePotConfig-info.plistファイルの変更
```
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
line3rdp.{プロジェクトバンドル identifier}<
...
…..
LSApplicationQueriesSchemes
lineauth2
……
```
#### Appleウェブログイン
Appleウェブログイン機能を使用するには、ダッシュボードの **プロジェクトの設定 > 一般** メニューで Apple ID Loginを設定し、以下のコードを使用します。
- GamePot_Android_UPL.xmlの編集
```
...
...
...
dependencies {
...
implementation(name: 'gamepot-channel-apple-signin', ext: 'aar')
...
}
...
...
import io.gamepot.channel.naver.GamePotAppleSignin;
...
```
- プロジェクト$S(PluginDir)/ThirdParty/Android/libsパスに gamepot-channel-apple-signin.aarファイルを追加
### 自動ログイン機能
会員の最後のログイン情報を伝達する APIで自動ログイン機能を使用するには、以下のコードを使用します。
```
ENLoginType::Type loginType = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getLastLoginType();
if(loginType != ENLoginType::NONE) {
{
// 最後にログインしたログインタイプでログインする方式です。
FGamePotSDKPluginModule::GetSharedGamePotSdk()->Login(loginType);
}
else
{
// 初めてゲームを実行したか、ログアウトした状態。ログインできるログイン画面に移動します。
}
```
### ログアウト機能
ログアウト機能を使用するには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->Logout();
void ASampleGameModeBase::OnLogoutSuccess()
{
}
void ASampleGameModeBase::OnLogoutFailure(FNError NError)
{
// ログアウトに失敗。NError.messageを利用してメッセージを表示します。
}
```
### 会員退会機能
会員退会機能を使用するには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->deleteMember();
/// 会員退会に成功
void ASampleGameModeBase::OnDeleteMemberSuccess()
{
}
void ASampleGameModeBase::OnDeleteMemberFailure(FNError NError)
{
// 会員退会に失敗。NError.messageを利用してメッセージを表示します。
}
```
### ログイン検証機能
ログイン完了後、ログイン情報を開発会社のサーバから GAMEPOTサーバに伝達してログイン検証を行えます。
詳細は、[ログイン検証リクエスト](/docs/ja/game-gamepotserver#%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B2%80%EC%A6%9D%EC%9A%94%EC%B2%AD)をご参照ください。
## 外部アカウントとの連携
一つのゲームアカウントに複数の外部アカウントを連携したり、解除できます。
### アカウント連携機能
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 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商品の照会機能
ストアに登録されている商品情報の照会機能を使用するには、以下のコードを使用します。
```
[Case1]
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseItems();
[Case2]
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseDetailListAsync();
// getPurchaseDetailListAsyncに成功
void ASampleGameModeBase::OnSdkPurchaseDetailListSuccess(TArray Items)
{
}
// getPurchaseDetailListAsyncに失敗
void ASampleGameModeBase::OnSdkPurchaseDetailListFailure(FNError NError)
{
}
USTRUCT()
struct FNPurchaseItem
{
UPROPERTY()
FString productId; // 商品 ID
UPROPERTY()
FString type; // 商品タイプ。「inapp」に固定
UPROPERTY()
FString price; // 価格 googleストア: $0.99、その他のストア: 0.99
UPROPERTY()
FString price_amount;
UPROPERTY()
FString price_amount_micros; // (UIに表示する場合に推奨)通貨と価格を合わせた値。 ONE Storeの場合、通貨単位は伝達されません。例) $0.99
UPROPERTY()
FString price_currency_code; // 通貨コード 例) 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; // 決済アイテム ID
UPROPERTY()
FString gamepotOrderId; // GAMEPOTで作成した order id
UPROPERTY()
FString uniqueId; // 開発会社で別途管理する領収証 ID
UPROPERTY()
FString serverId; // 決済を行ったキャラクターのサーバ ID
UPROPERTY()
FString playerId; // 決済を行ったキャラクターのキャラクター ID
UPROPERTY()
FString etc; // 決済を行ったキャラクターのその他の情報
UPROPERTY()
FString signature; // ストア signature
UPROPERTY()
FString originalJSONData; // 領収証 Data
}
```
### 決済アイテムの支給機能
決済ストアの領収書の内訳と対照して検証をすべて完了した場合のみ、開発会社のサーバに支給リクエストを転送するように設定できます。
詳細は、[アイテム支給のリクエスト](/docs/ja/game-gamepotserver#%EC%95%84%EC%9D%B4%ED%85%9C%EC%A7%80%EA%B8%89%EC%9A%94%EC%B2%AD)をご参照ください。
### MyCard決済
MyCardと連携させるための FacServiceID / KEYの値は、MyCard側に確認してからダッシュボードで設定してください。
1. ダッシュボード > 決済 > IAPストアタイプ: Google項目 > 価格の追加 > 通貨(例: TWD)/価格情報を入力し、保存します。
2. ダッシュボード > プロジェクトの設定 > 外部決済項目に MyCardを追加し、その 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);
```
- MyCard使用中の決済アイテムの呼び出し形式は、以下の APIを使用してください。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseThirdPaymentsItems();
```
1. $S(PluginDir)/GamePot_Android_UPL.xmlファイルをエディタで開きます。
```
...
...
....
...
dependencies {
...
implementation(name: 'gamepot-billing-mycard', ext: 'aar')
...
defaultConfig {
...
resValue "string", "gamepot_store", "google"
resValue "string", "gamepot_payment", "mycard" // ストアが googleの場合にのみ動作します。
```
5 ../ThirdParty/Android/libs/gamepot-billing-mycard.aarフォルダ内に gamepot-billing-mycard.aarが含まれているか確認します。
### 外部決済
外部決済モジュールと連携するには、まず[外部決済とのサービス連携](/docs/ja/game-gamepot-projectmgmt#%EC%99%B8%EB%B6%80%EA%B2%B0%EC%A0%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EC%97%B0%EB%8F%99)を参照して設定を完了し、以下のコードを使用します。
```
// productId: マーケットに登録されている商品 ID
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->purchaseThirdPayments(FString productId);
// 商品情報リストを呼び出すためのAPI
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
TArray itemList = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPurchaseThirdPaymentsItems();
```
## SDK独自提供のログイン UI
GAMEPOT Unreal SDKが提供する完成された形のログインUIを使用できます。
### SDK独自提供のログイン UIの呼び出し
GAMEPOT Unreal SDKが提供するログインUIを呼び出すには、以下のコードを使用してください。
```
USTRUCT()
struct FNLoginUIInfo
{
//画像ロゴ挿入の有無
UPROPERTY()
bool showLogo;
//UIで表示するLogin Type
UPROPERTY()
TArray loginTypes; //google, facebook...
}
//呼び出すログイン UIタイプ
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->showLoginWithUI(FNLoginUIInfo NLoginUIInfo);
void ASampleGameModeBase::OnLoginSuccess(FNUserInfo NUserInfo)
{
// ログインに成功
}
void ASampleGameModeBase::OnLoginCancel()
{
// ログインをキャンセル
}
void ASampleGameModeBase::OnLoginFailure(FNError NError)
{
// ログインに失敗。error.messageを利用してメッセージを表示します。
}
// メンテナンス(ダッシュボードでメンテナンスが有効化している場合に呼び出す)
void ASampleGameModeBase::OnLoginMaintenance(FNAppStatus NAppStatus)
{
// パラメータで渡された status情報に基づいてポップアップを作って表示します。以下の二つの方式のうち一つを選択してポップアップを構成します。
// ケース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 |
2. 画像ファイル名を ic_stat_gamepot_login_logo.pngに変更します。
## クーポン機能
ユーザーがクーポンを入力すると使用処理する機能を使うには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
FGamePotSDKPluginModule::GetSharedGamePotSdk()->coupon(FString couponNumber); // クーポン番号
FGamePotSDKPluginModule::GetSharedGamePotSdk()->coupon(FString couponNumber, FString userData); // クーポン番号、ユーザー情報
}
void ASampleGameModeBase::OnCouponSuccess(FString msg)
{
/// クーポン使用に成功
}
void ASampleGameModeBase::OnCouponFailure(FNError NError)
{
// クーポン使用に失敗。error.messageを使用してメッセージを表示します。
}
```
### アイテムの支給
クーポン使用に成功すると、開発会社のサーバにアイテム支給をリクエストします。
詳細は、[アイテム支給のリクエスト](/docs/ja/game-gamepotserver#%EC%95%84%EC%9D%B4%ED%85%9C%EC%A7%80%EA%B8%89%EC%9A%94%EC%B2%AD)をご参照ください。
## プッシュ通知機能
一般プッシュ通知、夜間プッシュ通知、プッシュ型広告の通知機能を有効化または無効化することができます。 プッシュ型広告機能を使用する場合、trueに設定します。(プッシュ型広告が falseの場合、一般/夜間プッシュ通知の設定に関係なく、プッシュ通知は届きません)
### 一般プッシュ通知の設定
一般プッシュ通知を設定するには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushStatus(bool pushEnable);
void ASampleGameModeBase::OnPushSuccess()
{
/// プッシュ通知の状態変更に関するサーバ通信に成功
}
void ASampleGameModeBase::OnPushFailure(FNError NError)
{
// プッシュ通知の状態変更に失敗。error.messageを利用してメッセージを表示します。
}
```
### 夜間プッシュ通知の設定
夜間プッシュ通知を設定するには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushNightStatus(bool nightPushEnable);
void ASampleGameModeBase::OnPushNightSuccess()
{
/// 夜間プッシュ通知の状態変更に関するサーバ通信成功
}
void ASampleGameModeBase::OnPushNightFailure(FNError NError)
{
// 夜間プッシュ通知の状態変更に失敗。error.messageを利用してメッセージを表示します。
}
```
### プッシュ型広告の設定
プッシュ型広告を設定するには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushADStatus(bool adPushEnable);
void ASampleGameModeBase::OnPushAdSuccess()
{
/// プッシュ型広告の状態変更に関するサーバ通信成功
}
void ASampleGameModeBase::OnPushFailure(FNError NError)
{
// プッシュ型広告の状態変更に失敗。error.messageを利用してメッセージを表示します。
}
```
#### 一般/夜間/プッシュ型広告を一度に設定
ログイン前にプッシュ通知を許可するかどうかを確認するゲームの場合は、ログインの後に以下のコードを呼び出します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setPushStatus(bool pushEnable, bool nightPushEnable, bool adPushEnable);
void ASampleGameModeBase::OnPushStatusSuccess()
{
/// プッシュ通知の状態変更に関するサーバ通信に成功
}
void ASampleGameModeBase::OnPushStatusFailure(FNError NError)
{
// プッシュ通知の状態変更に失敗。error.messageを利用してメッセージを表示します。
}
```
### プッシュ通知の状態確認
現在のプッシュ通知の状態を確認するには、以下のコードを使用します。
```
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FNPushInfo NPushInfo = FGamePotSDKPluginModule::GetSharedGamePotSdk()->getPushStatus();
USTRUCT()
struct FNPushInfo
{
UPROPERTY()
bool enable; // 一般プッシュ通知を許可するかどうか
UPROPERTY()
bool night; // 夜間プッシュ通知を許可するかどうか
UPROPERTY()
bool ad; // プッシュ型広告を許可するかどうか
}
```
## お知らせの画像表示機能
ダッシュボードの**お知らせ**メニューにアップロードした画像が表示されるように設定できます。推奨画像サイズは、次の通りです。
- サイズ: 720x1200(Portrait)、1280x640(Landscape)
- 容量: 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のテーマを変更して呼び出すには、以下のコードを使用します。
```
// ケース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 headerBackGradient;
// タイトル領域の下段ラインのカラー
UPROPERTY()
FString headerBottomColor;
// アイコン画像のファイル名(aos - drawable / ios - bundle)
UPROPERTY()
FString headerIconDrawable;
// 名前
UPROPERTY()
FString headerTitle;
// タイトルカラー
UPROPERTY()
FString headerTitleColor;
// コンテンツ
// 背景カラー(gradient)
UPROPERTY()
TArray contentBackGradient;
// アイコン画像のファイル名(aos - drawable / ios - bundle)
UPROPERTY()
FString contentIconDrawable;
// アイコンのカラー
UPROPERTY()
FString contentIconColor;
// チェックボタンのカラー
UPROPERTY()
FString contentCheckColor;
// チェック内容のカラー
UPROPERTY()
FString contentTitleColor;
// 見るフレーズのカラー
UPROPERTY()
FString contentShowColor;
// 下段(ゲーム開始)
// 背景カラー(gradient)
UPROPERTY()
TArray footerBackGradient;
// ゲーム開始ボタンの背景カラー(gradient)
UPROPERTY()
TArray footerButtonGradient;
// ゲーム開始ボタンのフレームカラー
UPROPERTY()
TArray footerButtonOutlineColor;
// ゲーム開始フレーズ
UPROPERTY()
TArray footerTitle;
// ゲーム開始フレーズのカラー
UPROPERTY()
TArray footerTitleColor;
//一般プッシュの表示有無
UPROPERTY()
bool showPush;
// 夜間プッシュの表示有無
UPROPERTY()
bool showNightPush;
// 「すべて同意」フレーズ変更時
UPROPERTY()
FString allMessage;
// 「サービス利用約款」フレーズ変更時
UPROPERTY()
FString termMessage;
// 「個人情報の取扱方針」フレーズ変更時
UPROPERTY()
FString privacyMessage;
// 「一般プッシュ」フレーズ変更時
UPROPERTY()
FString pushMessage;
// 「夜間プッシュ」フレーズ変更時
UPROPERTY()
FString nightPushMessage;
UPROPERTY()
FString pushDetailURL;
UPROPERTY()
FString nightPushDetailURL;
}
```
- それぞれの変数は、以下の画像に表示された領域に適用されます。

#### GDPR約款のチェックリスト機能
ダッシュボードで有効化した GDPRの約款項目をリストの形で取得するには、以下のコードを使用します。
```
//返されるデータ形式は FStringタイプで、string[]の形式です。例> "[ 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 headerBackGradient;
// 名前
UPROPERTY()
FString headerTitle;
// タイトルカラー
UPROPERTY()
FString headerTitleColor;
UPROPERTY()
TArray contentBackGradient;
UPROPERTY()
TArray listHeaderBackGradient;
UPROPERTY()
FString listHeaderTitleColor;
UPROPERTY()
TArray listContentBackGradient;
UPROPERTY()
FString listContentTitleColor;
// 背景カラー(gradient)
UPROPERTY()
TArray footerBackGradient;
// ボタンの背景カラー(gradient)
UPROPERTY()
TArray footerButtonGradient;
UPROPERTY()
FString footerTitleColor;
UPROPERTY()
FString descHTML;
UPROPERTY()
FString descColor;
UPROPERTY()
FString listHeaderTitle;
UPROPERTY()
FString footerTitle;
}
```
## 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` | サーバ ID | 128 |
| `FNSendLogCharacter.PLAYER_ID` | 任意 | `FString` | キャラクター ID | 128 |
| `FNSendLogCharacter.USERDATA` | 任意 | `FString` | その他の情報 | 128 |
```
USTRUCT()
struct FNSendLogCharacter
{
UPROPERTY()
FString NAME;
UPROPERTY()
FString PLAYER_ID;
UPROPERTY()
FString SERVER_ID;
UPROPERTY()
FString LEVEL;
UPROPERTY()
FString USERDATA;
}
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
FNSendLogCharacter info;
info.NAME = TEXT("tester");
info.PLAYER_ID = TEXT("player_id");
bool result = FGamePotSDKPluginModule::GetSharedGamePotSdk()->characterInfo(info.ToJsonString());
// 結果値 true: 検証に成功。ログが GAMEPOTサーバに転送されます。
// 結果値 false: 検証に失敗。logcatを確認します。
}
```
### setUserDataの設定
ログイン後、当該会員に追加情報を入れる場合に使用します。 キーの最大数は50個に制限 値の最大長さは1024バイトに制限 これらの情報は会員の詳細項目でのみ確認できます。
```
ex)
TSharedPtr JsonObject = MakeShareable(new FJsonObject);
JsonObject->SetStringField("appversion", "1.0.23");
JsonObject->SetStringField("server", "s1");
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->setUserData(JsonObject);
void AGamePotSampleGameModeBase_Main::OnSetUserDataSuccess()
{
// 成功
}
void AGamePotSampleGameModeBase_Main::OnSetUserDataFailure(FNError NError)
{
// 失敗
}
```
## 3rd Party SDK連携
GAMEPOT Unreal SDKは、3rd Party SDKとの連携に対応しています。
### 3rd Party SDKログイン連携
3rd Party SDKと連携してログイン機能を使用するには、表を参照して以下のコードにパラメータ値を入力し、コードを使用します。
- **パラメータおよびコード**
| パラメータ名 | 必須の有無 | タイプ | 説明 |
| --- | --- | --- | --- |
| `userid` | 必須 | `FString` | ユーザーの固有 ID 値に「:」(コロン)は使用不可 |
```
FString userid = TEXT("memberid of 3rd party sdk");
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
FGamePotSDKPluginModule::GetSharedGamePotSdk()->loginByThirdPartySDK(userid);
```
- 自動ログインに対応しないため、毎回呼び出す必要があります。
### 3rd Party SDKとの決済連携
3rd Party SDKと連携して決済機能を使用するには、表を参照して以下のコードにパラメータ値を入力し、コードを使用します。
- **パラメータおよびコード**
| パラメータ名 | 必須の有無 | タイプ | 説明 |
| --- | --- | --- | --- |
| `productid` | 必須 | `FString` | ダッシュボードに登録されているアイテム ID |
| `transactionid` | 必須 | `FString` | 決済領収証番号(GPA-xxx-xxxx-xxxx) |
| `store` | 必須 | 決済ストア(`google`, `apple`, `one`, `galaxy`) | |
| `currency` | 任意 | `FString` | 通貨(KRW、USD) |
| `price` | 任意 | `double` | 決済アイテム金額 |
| `paymentid` | 任意 | `FString` | 決済 ID 一般的には store_idと同じ |
| `uniqueid` | 任意 | `FString` | 開発会社で使用する固有 ID |
```
FString productId = "purchase_001";
FString transactionId = "GPA-xxx-xxxx-xxxx";
FString currency = "KRW";
double price = 1200;
FString paymentId = "google";
FString uniqueId = "developer unique id";
if (FGamePotSDKPluginModule::IsGamePotSdkAvailable())
{
FGamePotSDKPluginModule::GetSharedGamePotSdk()->sendPurchaseByThirdPartySDK(FString productId, FString transactionId, FString currency, double price, FString store, FString paymentId, FString uniqueId);
}
```