メインコンテンツまでスキップ

Module 5: Unreal Engine - Put it all together

Last updated on February 12, 2024

UI とクラウドセーブ実装との接続


このセクションでは、クラウドセーブを使用してゲームのサウンドオプションを保存したりロードしたりするオプションメニューの接続方法を説明します。

  1. まず、OptionsWidget クラス cpp ファイルを開きます。ここには NativeOnActivated() という関数があります。これはオプションメニューが開いたときに呼び出されます。この関数には、OnOptionsWidgetActivated というデリゲートの呼び出しがあります。後ほど、このデリゲートを使用して、クラウドセーブからゲームのサウンドオプション (例:音楽や SFX の音量) をロードします。

    void UOptionsWidget::NativeOnActivated()
    {
    Super::NativeOnActivated();

    InitOptions();

    if (OnOptionsWidgetActivated.IsBound())
    {
    OnOptionsWidgetActivated.Broadcast(GetOwningPlayer(), TDelegate<void()>::CreateUObject(this, &ThisClass::InitOptions));
    }
    }
  2. OptionsWidget クラス cpp ファイルには、NativeOnDeactivated() という関数もあります。これはオプションメニューが閉じたときに呼び出されます。この関数にも、OnOptionsWidgetDeactivated というデリゲートの呼び出しがあります。後ほど、このデリゲートを使用して、クラウドセーブにゲームのサウンドオプションを保存します。

    void UOptionsWidget::NativeOnDeactivated()
    {
    Super::NativeOnDeactivated();

    FinalizeOptions();

    if (OnOptionsWidgetDeactivated.IsBound())
    {
    OnOptionsWidgetDeactivated.Broadcast(GetOwningPlayer(), TDelegate<void()>::CreateUObject(this, &ThisClass::FinalizeOptions));
    }
    }
  3. 次に、CloudSaveSubsystem_Starter を使用してオプションメニューをクラウドセーブに接続しましょう。前のセクションからわかるように、クラウドセーブとの間でプレイヤーレコードの設定と取得を行うには、レコードキーが必要です。Byte Wars プロジェクトでは、レコードキーは既に /Source/AccelByteWars/TutorialModules/Module-5/CloudSaveModels.h で定義されています。

    #define GAME_OPTIONS_KEY FString(TEXT("GameOptions"))
    #define SOUND_OPTIONS_KEY FString(TEXT("Sound"))
    #define SOUND_OPTIONS_MUSIC_KEY FString(TEXT("musicvolume"))
    #define SOUND_OPTIONS_SFX_KEY FString(TEXT("sfxvolume"))
  4. ゲームのサウンドオプションは、GAME_OPTIONS_KEY のサブカテゴリである SOUND_OPTIONS_KEY によって分類されます。SOUND_OPTIONS_KEY には、2 つのサブゲームオプションがあり、SOUND_OPTIONS_MUSIC_KEYSOUND_OPTIONS_SFX_KEY で定義されています。まとめると、カテゴリ階層は次のようになります。

    GameOptions-Sound:
    musicvolume,
    sfxvolume
  5. それではまず、これらのレコードキーを使用して、クラウドセーブからゲームのサウンドオプションを読み込みましょう。CloudSaveSubsystem_Starter クラス cpp ファイルを開き、次の関数に以下のコードを追加します。以下のコードは、ロード画面を表示し、クラウドセーブからゲームオプションを取得するリクエストを送信します。リクエストが完了すると、ロード画面が非表示になり、リクエスト結果に基づいてゲームオプションが更新されます。

    void UCloudSaveSubsystem_Starter::OnLoadGameSoundOptions(const APlayerController* PC, TDelegate<void()> OnComplete)
    {
    if (!PC)
    {
    UE_LOG_CLOUDSAVE_ESSENTIALS(Warning, TEXT("Cannot get game options from Cloud Save. Player Controller is null."));
    return;
    }

    UAccelByteWarsGameInstance* GameInstance = Cast<UAccelByteWarsGameInstance>(GetGameInstance());
    ensure(GameInstance);

    UPromptSubsystem* PromptSubsystem = GameInstance->GetSubsystem<UPromptSubsystem>();
    ensure(PromptSubsystem);

    PromptSubsystem->ShowLoading();

    // Get game options from Cloud Save.
    GetPlayerRecord(
    PC,
    FString::Printf(TEXT("%s-%s"), *GAME_OPTIONS_KEY, *SOUND_OPTIONS_KEY),
    FOnGetCloudSaveRecordComplete::CreateWeakLambda(this, [this, GameInstance, PromptSubsystem, OnComplete](bool bWasSuccessful, FJsonObject& Result)
    {
    UE_LOG_CLOUDSAVE_ESSENTIALS(Warning, TEXT("Get game options from Cloud Save was successful: %s"), bWasSuccessful ? TEXT("True") : TEXT("False"));

    PromptSubsystem->HideLoading();

    // Update the local game options based on the Cloud Save record.
    if (bWasSuccessful)
    {
    GameInstance->SetMusicVolume(Result.GetNumberField(SOUND_OPTIONS_MUSIC_KEY));
    GameInstance->SetSFXVolume(Result.GetNumberField(SOUND_OPTIONS_SFX_KEY));
    }

    OnComplete.ExecuteIfBound();
    })
    );
    }
  6. 引き続き CloudSaveSubsystem_Starter クラス cpp ファイルで、次の関数に以下のコードを追加して、ゲームのサウンドオプションをクラウドセーブに保存する機能を実装しましょう。以下のコードは、ロード画面を表示し、クラウドセーブにゲームオプションを設定するリクエストを送信します。リクエストが完了すると、ロード画面が非表示になります。

    void UCloudSaveSubsystem_Starter::OnSaveGameSoundOptions(const APlayerController* PC, TDelegate<void()> OnComplete)
    {
    if (!PC)
    {
    UE_LOG_CLOUDSAVE_ESSENTIALS(Warning, TEXT("Cannot set game options from Cloud Save. Player Controller is null."));
    return;
    }

    UAccelByteWarsGameInstance* GameInstance = Cast<UAccelByteWarsGameInstance>(GetGameInstance());
    ensure(GameInstance);

    UPromptSubsystem* PromptSubsystem = GameInstance->GetSubsystem<UPromptSubsystem>();
    ensure(PromptSubsystem);

    PromptSubsystem->ShowLoading(LOCTEXT("Saving", "Saving"));

    // Construct game options to save.
    FJsonObject GameOptionsData;
    GameOptionsData.SetNumberField(SOUND_OPTIONS_MUSIC_KEY, GameInstance->GetMusicVolume());
    GameOptionsData.SetNumberField(SOUND_OPTIONS_SFX_KEY, GameInstance->GetSFXVolume());

    // Save the game options to Cloud Save.
    SetPlayerRecord(
    PC,
    FString::Printf(TEXT("%s-%s"), *GAME_OPTIONS_KEY, *SOUND_OPTIONS_KEY),
    GameOptionsData,
    FOnSetCloudSaveRecordComplete::CreateWeakLambda(this, [this, PromptSubsystem, OnComplete](bool bWasSuccessful)
    {
    UE_LOG_CLOUDSAVE_ESSENTIALS(Warning, TEXT("Set game options from Cloud Save was successful: %s"), bWasSuccessful ? TEXT("True") : TEXT("False"));

    PromptSubsystem->HideLoading();
    OnComplete.ExecuteIfBound();
    }
    ));
    }
  7. それでは OnOptionsWidgetActivated デリゲートと OnOptionsWidgetDeactivated デリゲートをバインドしましょう。クラウドセーブとの間でゲームのサウンドオプションをロードおよび保存するには、それぞれ OnLoadGameSoundOptions 関数と OnSaveGameSoundOptions 関数を呼び出すこれらのデリゲートをバインドする必要があります。CloudSaveSubsystem_Starter クラス cpp ファイルで、次の関数にこれらのデリゲートをバインドできます。

    void UCloudSaveSubsystem_Starter::BindDelegates()
    {
    UOptionsWidget::OnOptionsWidgetActivated.AddUObject(this, &ThisClass::OnLoadGameSoundOptions);
    UOptionsWidget::OnOptionsWidgetDeactivated.AddUObject(this, &ThisClass::OnSaveGameSoundOptions);
    }
  8. 最後に、サブシステムが初期化解除されたら、これらのデリゲートをアンバインドしましょう。CloudSaveSubsystem_Starter クラス cpp ファイルで、次の関数にあるこれらのデリゲートをアンバインドできます。

    void UCloudSaveSubsystem_Starter::UnbindDelegates()
    {
    UOptionsWidget::OnOptionsWidgetActivated.RemoveAll(this);
    UOptionsWidget::OnOptionsWidgetDeactivated.RemoveAll(this);
    }
  9. お疲れさまでした。CloudSaveSubsystem_Starter を使用してクラウドセーブとの間でゲームのサウンドオプションをロードしたり保存したりするオプションメニューを接続しました。

リソース