サブシステムの実装 - Wallet Essentials - (Unreal Engine モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
サブシステムの展開
Byte Wars は、AccelByte Gaming Services (AGS) Online Subsystem (OSS) をラップするために WalletEssentialsSubsystem という Game Instance Subsystem を使用しています。このサブシステムは、AGS OSS が提供する FOnlineWalletAccelByte を利用します。このチュートリアルでは、サブシステムのスターター版を使用して、必要な関数をゼロから実装します。
スターターパックの内容
このチュートリアルに従うために、WalletEssentialsSubsystem_Starter という名前のスターターサブシステムクラスが用意されています。リソースセクションで確認できます。以下のファイルが含まれています:
- ヘッダーファイル:
Source/AccelByteWars/TutorialModules/Monetization/WalletEssentials/WalletEssentialsSubsystem_Starter.h - CPP ファイル:
Source/AccelByteWars/TutorialModules/Monetization/WalletEssentials/WalletEssentialsSubsystem_Starter.cpp
WalletEssentialsSubsystem_Starter クラスには、いくつかの便利なコンポーネントが含まれています:
- AGS OSS
FOnlineWalletAccelByteインターフェースの宣言と初期化。これにより、AGS Software Development Kit (SDK) 機能へのアクセスが提供されます。
private:
FOnlineWalletV2AccelBytePtr WalletInterface;
void UWalletEssentialsSubsystem_Starter::Initialize(FSubsystemCollectionBase& Collection)
{
// ...
const FOnlineSubsystemAccelByte* Subsystem = static_cast<FOnlineSubsystemAccelByte*>(Online::GetSubsystem(GetWorld()));
ensure(Subsystem);
WalletInterface = Subsystem->GetWalletV2Interface();
ensure(WalletInterface);
// ...
}
- Player Controller からローカルユーザー番号を取得するためのヘルパー関数。これは、このサブシステムの主要なユーザーであるウィジェットが Player Controller を使用してプレイヤーを参照するのに対し、OSS インターフェースはリクエストしているユーザーを識別するためにローカルユーザー番号を必要とするため、必要です。
private:
// ...
static int32 GetLocalUserNumFromPlayerController(const APlayerController* PlayerController);
さらに、モデルファイル Source/AccelByteWars/TutorialModules/Monetization/WalletEssentials/WalletEssentialsModel.h があり、バックエンドレスポンスを処理するために使用されるデリゲートと、サブシステムがデータの取得に失敗したときに表示される事前定義されたローカライズされたテキストが定義されています。
#define TEXT_BALANCE_ERROR NSLOCTEXT("AccelByteWars", "balance_error", "NaN")
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnGetWalletInfoComplete, bool /*bWasSuccessful*/, const FAccelByteModelsWalletInfoResponse& /*Response*/);
ウォレット情報のクエリの実装
-
WalletEssentialsSubsystem_Starterヘッダーファイルを開き、バックエンドからウォレット情報をリクエストするために以下の関数を宣言します。public:
void QueryOrGetWalletInfoByCurrencyCode(
const APlayerController* OwningPlayer,
const FString& CurrencyCode,
const bool bAlwaysRequestToService = true) const; -
バックエンドレスポンスを処理するために、以下のデリゲートとハンドラー関数を宣言します。
public:
// ...
FOnGetWalletInfoComplete OnQueryOrGetWalletInfoCompleteDelegates;private:
// ...
void OnQueryOrGetWalletInfoByCurrencyCodeComplete(
int32 LocalUserNum,
bool bWasSuccessful,
const FAccelByteModelsWalletInfoResponse& Response,
const FString& Error) const; -
WalletEssentialsSubsystem_StarterCPP ファイルに移動し、QueryOrGetWalletInfoByCurrencyCode()関数を実装します。この関数は、プレイヤーのウォレット情報を取得するリクエストを送信します。void UWalletEssentialsSubsystem_Starter::QueryOrGetWalletInfoByCurrencyCode(
const APlayerController* OwningPlayer,
const FString& CurrencyCode,
const bool bAlwaysRequestToService) const
{
const int32 LocalUserNum = GetLocalUserNumFromPlayerController(OwningPlayer);
WalletInterface->GetWalletInfoByCurrencyCodeV2(LocalUserNum, CurrencyCode, bAlwaysRequestToService);
} -
OnQueryOrGetWalletInfoByCurrencyCodeComplete()関数を実装します。この関数は、バックエンドレスポンスからのデータを使用してOnQueryOrGetWalletInfoCompleteDelegatesデリゲートをトリガーします。void UWalletEssentialsSubsystem_Starter::OnQueryOrGetWalletInfoByCurrencyCodeComplete(
int32 LocalUserNum,
bool bWasSuccessful,
const FAccelByteModelsWalletInfoResponse& Response,
const FString& Error) const
{
OnQueryOrGetWalletInfoCompleteDelegates.Broadcast(bWasSuccessful, Response);
} -
引き続き CPP ファイルで、
Initialize()関数に移動し、その内容を以下のコードに置き換えます。これにより、OnQueryOrGetWalletInfoByCurrencyCodeComplete()関数がFOnlineWalletAccelByteインターフェースの実際のレスポンスデリゲートにバインドされます。void UWalletEssentialsSubsystem_Starter::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
const FOnlineSubsystemAccelByte* Subsystem = static_cast<FOnlineSubsystemAccelByte*>(Online::GetSubsystem(GetWorld()));
ensure(Subsystem);
WalletInterface = Subsystem->GetWalletV2Interface();
ensure(WalletInterface);
WalletInterface->OnGetWalletInfoV2CompletedDelegates->AddUObject(this, &ThisClass::OnQueryOrGetWalletInfoByCurrencyCodeComplete);
} -
Deinitialize()関数に移動し、その内容を以下のコードに置き換えます。これにより、OnQueryOrGetWalletInfoByCurrencyCodeComplete()関数がアンバインドされます。void UWalletEssentialsSubsystem_Starter::Deinitialize()
{
Super::Deinitialize();
WalletInterface->OnGetWalletInfoV2CompletedDelegates->RemoveAll(this);
}