Lyra ゲーム設定

Lyra ゲーム サンプルのゲーム設定の概要について説明します。

Lyra ゲーム設定

Lyra は、ユーザー インターフェース (UI) とその基盤となるデータを作成するプロセスを簡素化するために使用される GameSettings プラグインを備えています。このプラグインは、コンフィギュレーション ファイルまたはサーバーに格納する必要のあるデータの管理を担っています。

たとえば、プレイヤーが森を探検するフォトグラファーで、レアな野生動物を記録するタスクが割り当てられたとします。キャラクターがレベルの特定の箇所に立ち入ると、Game Settings プラグインがサーバーにあるデータを管理してレベルと通信して、キャラクターが現在位置するエリアにどのレアな野生動物が出現する必要があるかを決定します。

このフレームワークには、次のようにいくつかの主要な部分があります。

  • UGameSettingRegistry - Game Setting Registry は一連の設定です。単一のレジストリを部分的または全体的にユーザーに公開することができます。ただし、1 つ以上のゲームの設定を登録する必要があります。主要なゲーム設定を含まない設定を必要とするその他のシステムがゲーム内にある場合は、別のレジストリを使用することをお勧めします。

  • UGameSetting - すべての設定の基本クラスを定義します。UI のリストにあるすべての設定は、ゲーム設定とみなされます。このクラスは、名前、説明、依存関係、編集条件などの主要な概念を処理します。

  • UGameSettingValue - Get と Set を行う必要のある値を含むすべての設定の基本クラスを実装します。いくつかの設定はこのクラスを直接継承し、代わりに次を使用します。

     UGameSettingValueScalarDynamic, 
     UGameSettingValueDiscreteDynamic_Bool, 
     UGameSettingValueDiscreteDynamic_Number,  
     UGameSettingValueDiscreteDynamic_Enum.
    • UGameSettingCollection - 組織設定を定義します。ゲーム設定コレクションは、複数の設定をグループ化するために使用されます。たとえば、リストにヘッダを生成するコレクションが必要な場合、そのコレクションはそのヘッダのグループを表します。たとえば、リストにヘッダを生成するコレクションが必要な場合、そのコレクションはそのヘッダのグループを表します。

  • FGameSettingEditCondition - 各設定には、関連付けられている一連の編集条件があります。これらの編集条件により、設定が無効、非表示、または破棄された場合にクエリするロジックをエンコードすることができます。

設定を作成する

コードで記述する設定のメソッドのほとんどは、次のようになります。

UGameSettingValueScalarDynamic* Setting = NewObject<UGameSettingValueScalarDynamic>();
Setting->SetDevName(TEXT("OverallVolume"));
Setting->SetDisplayName(LOCTEXT("OverallVolume_Name", "Overall"));
Setting->SetDescriptionRichText(LOCTEXT("OverallVolume_Description", "Adjusts the volume of everything."));
Setting->SetDynamicGetter(GET_LOCAL_SETTINGS_FUNCTION_PATH(GetOverallVolume));
Setting->SetDynamicSetter(GET_LOCAL_SETTINGS_FUNCTION_PATH(SetOverallVolume));
Setting->SetDefaultValue(GetDefault<ULyraSettingsLocal>()->GetOverallVolume());
Setting->SetDisplayFormat(UGameSettingValueScalarDynamic::ZeroToOnePercent);
Setting->AddEditCondition(FWhenPlayingAsPrimaryPlayer::Get());

すべての設定には、レジストリ全体で一意である DevName があり、DisplayName が必要です。

DescriptionRichText はほとんどの設定に必要で、必要とされるすべての設定を確認するためにチェックされます。リッチ テキストは UMG リッチ テキスト ウィジェットのフォーマットの標準です。これは、検索のインデックス作成時にプレーン テキストが解析されるためです。DynamicGetter および DynamicSetter は、ランタイム時に設定にアクセスする機能を提供します。次を使用して継続的にデータにアクセスするには、次のように記述します。

LocalPlayer->GetLocalSettings()->GetOverallVolume()

これを各設定に宣言するのは冗長であるため、代わりに動的ゲッターとセッターでは、提供されるマクロを使用してビルトされる FGameSettingDataSourceDynamic を取ります。

DynamicSetter および DynamicGetter は、

[メタデータ プロパティ指定子](programming-and-scripting/programming-language-implementation/cpp-in-unreal-engine/Metadata)(UFUNCTION/UPROPERTY)
を使用して LocalPlayer からデータにアクセスできる必要があります。指定子を使用すると、初期化時にこれらの条件が確認されます。

カスタム設定

設定でビルトイン クラスを使用することで、ほとんどのニーズに対応できます。ただし、設定により複雑なロジックを必要とする場合もあります。たとえば、ゲームでパッケージ化されているすべての言語を取得する必要がある場合などです。

UGameSettingValueDiscrete_Language* Setting = NewObject<UGameSettingValueDiscrete_Language>();
Setting->SetDevName(TEXT("Language"));
Setting->SetDisplayName(LOCTEXT("LanguageSetting_Name", "Language"));
Setting->SetDescriptionRichText(LOCTEXT("LanguageSetting_Description", "The language of the game."));
Matchmaking->AddSetting(Setting);

UGameSettingValueDiscrete_Language directly mutates the language and culture settings we have stored.

編集条件

FGameSettingEditCondition のすべての編集条件サブクラスは、次のいずれかの条件が適用される必要がある場合、設定を無効にするか、非表示にするか、リセットを回避するか、または分析から設定を削除します。

  • FWhenCondition - インライン ラムダとして条件を記述する機能を提供します。

  • FWhenPlatformHasTrait - プラットフォームの特性に基づいて設定を非表示または無効にするために使用されます。例として以下のような特性が挙げられます。

    • プラットフォームがキーボードとマウスをサポートしているか?

    • プラットフォームが画面解像度の変更をサポートしているか?

ソース コードの例をいくつか確認していくと、Lyra の設定やその他の一般的な領域を排除する際に、#if PLATFORM_FEATURE などのチェックを使用しておらず、代わりに、プラットフォームの特性に基づいていることがわかわります。これは、PIE でテストする際に、他のプラットフォームをテストするオプションを使用でき、すべてを動的に再評価できるためです。そのため、できる限り、FWhenPlatformHasTrait を使用することをお勧めします。

  • FWhenPlayingAsPrimaryPlayer - 特定の設定に他のローカル プレイヤーがアクセスしないようにする必要がある場合は、これらのインスタンスを使用して特定の条件を編集することで、最初のプレイヤーのみが使用できるようにすることができます。

たとえば、LyraGameSettingRegistry_Video.cpp クラスにある Resolution 設定は、次のようになります。

Setting->AddEditDependency(WindowModeSetting);
Setting->AddEditCondition(MakeShared<FWhenCondition>([WindowModeSetting](const ULocalPlayer*, FGameSettingEditableState& InOutEditState) {

    if (WindowModeSetting->GetValue<EWindowMode::Type>() == EWindowMode::Windowed)

    {

        InOutEditState.Disable(LOCTEXT("ResolutionWindowed_Disabled", "When the Window Mode is set to <strong>Windowed</>, the resolution is freely resized with the window."));

    }

    else if (WindowModeSetting->GetValue<EWindowMode::Type>() == EWindowMode::WindowedFullscreen)

    {

        InOutEditState.Disable(LOCTEXT("ResolutionWindowedFullscreen_Disabled", "When the Window Mode is set to <strong>Windowed Fullscreen</>, the resolution must match the native desktop resolution."));

    }
}));

編集条件は、設定を enableddisabled、または hidden に切り替えるかどうかを追跡します。この編集条件は、ユーザーがランタイム時にプロジェクト設定を変更しようとした場合、デバッガーまで追跡できる説明を提供できるように作成されています。下の画像では、Window Mode の編集条件が Disabled に切り替えられています。その結果、エンジンは、設定を変更できない理由をユーザーが理解できるように、ユーザーにメッセージを返します。

LyraWarningWindow

ユーザー インターフェース

ユーザー インターフェースは、UGameSettingVisualData`クラスと UGameSettingPanel クラスで構成されています。ゲーム設定パネルは、表示処理を担っており、レジストリとフィルタを提供することで、自分の設定をパネルに表示させることができます。そのような設定の定義方法を決定するため、ゲーム設定ビジュアル データには、UGameSettingListEntryBaseUGameSetting` クラスに接続するために設定が使用するルールが記載されています。

LyraGameSettingRegistry

GameSettingsRegistryVisualData には、パネルの表示方法の詳細が含まれています。

データ ソース

`FGameSettingDataSource`
`FGameSettingDataSourceDynamic`

`GET_SHARED_SETTINGS_FUNCTION_PATH`
`GET_LOCAL_SETTINGS_FUNCTION_PATH`
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル