5#include "CoreMinimal.h"
7#include "Blueprint/UserWidget.h"
9#include "Engine/DeveloperSettings.h"
10#include "StructUtils/InstancedStruct.h"
11#include "UserGameSettings.generated.h"
22#pragma region SettingProcessor
103USTRUCT(BlueprintType)
115#pragma region SettingValue
117USTRUCT(BlueprintType)
123USTRUCT(BlueprintType)
129 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category =
"Value")
133USTRUCT(BlueprintType)
139 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category =
"Value")
143USTRUCT(BlueprintType)
149 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category =
"Value")
153USTRUCT(BlueprintType)
159 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category =
"Value")
160 FString Value = FString();
166#pragma region Settings
168USTRUCT(BlueprintType)
184 template <
typename T>
187 template <
typename T>
198 UPROPERTY(EditAnywhere, Category =
"Settings")
201 UPROPERTY(EditAnywhere, Category = "Settings")
204 UPROPERTY(EditAnywhere, Category = "Settings")
207 UPROPERTY(EditAnywhere, Category = "Settings", meta = (BaseStruct = "/Script/
CK_UE.
SettingProcessor", ExcludeBaseStruct))
215USTRUCT(BlueprintType)
224 virtual void SetSettingValue(
const FInstancedStruct& SettingValue)
override;
227 UPROPERTY(EditAnywhere, Category =
"Settings")
230 UPROPERTY(EditAnywhere, Category = "Settings")
233 UPROPERTY(EditAnywhere, Category = "Settings")
234 float InitialValue = 0.0f;
237 float CurrentValue = 0.0f;
241USTRUCT(BlueprintType)
250 virtual void SetSettingValue(
const FInstancedStruct& SettingValue)
override;
253 UPROPERTY(EditAnywhere, Category =
"Settings")
254 bool bDefaultValue = false;
256 UPROPERTY(EditAnywhere, Category = "Settings")
257 bool bInitialValue = 0.0f;
260 bool bIsToggled = false;
264USTRUCT(BlueprintType)
273 virtual void SetSettingValue(
const FInstancedStruct& SettingValue)
override;
276 template <
typename TDropdownOption>
277 const FName& GetKeyByValue(
const TDropdownOption& Value)
const;
279 template <
typename TDropdownOption>
280 const TDropdownOption& GetOptions()
const;
282 template <
typename TDropdownOption>
283 const TDropdownOption& GetOptions(
const FName& Key)
const;
285 FName GetSelectionKey()
const;
286 bool HasValidSelection()
const;
289 UPROPERTY(EditAnywhere, Category =
"Settings", meta = (BaseStruct =
"/Script/CK_UE.DropdownSettingsOptionBase", ExcludeBaseStruct))
290 TMap<FName, FInstancedStruct> DropdownOptions;
292 UPROPERTY(EditAnywhere, Category = "Settings")
293 FName InitialKey = NAME_None;
296 FName SelectedKey = NAME_None;
300USTRUCT(BlueprintType)
306 UPROPERTY(EditAnywhere, Category =
"Settings")
311USTRUCT(BlueprintType)
317 UPROPERTY(EditAnywhere, Category =
"Settings")
318 mutable int32 Value = 0.0f;
322USTRUCT(BlueprintType, DisplayName="Dropdown Setting IntPair Option")
328 UPROPERTY(EditAnywhere, Category =
"Settings")
329 mutable FIntPoint Value = FIntPoint();
333USTRUCT(BlueprintType)
339 UPROPERTY(EditAnywhere, Category =
"Settings")
340 mutable
float Value = 0.0f;
344USTRUCT(BlueprintType, DisplayName = "Dropdown Setting UClass Option")
350 UPROPERTY(EditAnywhere, Category =
"Settings")
351 mutable TSubclassOf<UObject> ObjectClass;
360UCLASS(Config=Game, DefaultConfig, Blueprintable, BlueprintType, meta=(DisplayName=
"User Game Settings"))
369 FORCEINLINE
const TMap<EUserGameSetting, FInstancedStruct>&
GetSettings()
const
381 return TEXT(
"CK_UE");
385 template <
typename T>
388 template <
typename T>
391 template <
typename TFieldW
idget>
392 TSubclassOf<TFieldWidget> GetSettingFieldWidgetClass()
const;
395 UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category =
"Settings", meta = (BaseStruct =
"/Script/CK_UE.SettingsBase", ExcludeBaseStruct))
399 UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "WidgetClass", meta = (BlueprintBaseOnly))
404#pragma region Templates
409 const FInstancedStruct* SettingStruct =
Settings.Find(SettingType);
411 if (SettingStruct ==
nullptr)
416 const T* Setting = SettingStruct->GetPtr<T>();
418 if (Setting ==
nullptr)
429 FInstancedStruct* SettingStruct =
Settings.Find(SettingType);
431 if (SettingStruct ==
nullptr)
436 return SettingStruct->GetMutablePtr<T>();
439template <
typename TFieldW
idget>
442 static_assert(TIsDerivedFrom<TFieldWidget, UUserWidget>::IsDerived,
"TFieldWidget은 UUserWidget을 상속해야 합니다.");
444 auto Result = Algo::FindByPredicate(
SettingFieldWidgetClass, [](
const TSubclassOf<USettingFieldWidget>& WidgetClass)
446 return WidgetClass && WidgetClass->IsChildOf(TFieldWidget::StaticClass());
449 if (Result && *Result)
451 return (*Result).Get();
455 LOG_ERROR(LogCK,
"위젯 클래스가 정상적으로 설정되지 않은 것 같습니다.");
463 if (OtherSetting ==
nullptr)
473 return static_cast<T*
>(OtherSetting);
479 if (OtherSetting ==
nullptr)
489 return static_cast<const T*
>(OtherSetting);
492template <
typename TDropdownOption>
495 for (
const TPair<FName, FInstancedStruct>& DropdownOption :
DropdownOptions)
497 const TDropdownOption* Option = DropdownOption.Value.GetPtr<TDropdownOption>();
499 if (Option && Option->Value == Value.Value)
501 return DropdownOption.Key;
505 static const FName DefaultKey = NAME_None;
509template <
typename TDropdownOption>
512 for (
const TPair<FName, FInstancedStruct>& DropdownOption :
DropdownOptions)
514 const TDropdownOption* Option = DropdownOption.Value.GetPtr<TDropdownOption>();
522 static const TDropdownOption EmptyOption;
526template <
typename TDropdownOption>
530 if (Value ==
nullptr)
532 static const TDropdownOption EmptyOption;
536 const TDropdownOption* Option = Value->GetPtr<TDropdownOption>();
542 static const TDropdownOption EmptyOption;
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
static constexpr FGlobalUserSettingsRuntime None
Definition GlobalUserSettingsRuntime.cpp:6
Definition CK_UE.Build.cs:6
Definition UserGameSettings.h:362
FORCEINLINE const TMap< EUserGameSetting, FInstancedStruct > & GetSettings() const
Definition UserGameSettings.h:369
T * GetMutableSettingOption(EUserGameSetting SettingType)
Definition UserGameSettings.h:427
TMap< EUserGameSetting, FInstancedStruct > Settings
Definition UserGameSettings.h:396
FORCEINLINE TMap< EUserGameSetting, FInstancedStruct > & GetMutableSettings()
Definition UserGameSettings.h:374
virtual FORCEINLINE FName GetCategoryName() const override
Definition UserGameSettings.h:379
T GetSettingOption(EUserGameSetting SettingType) const
Definition UserGameSettings.h:407
TSubclassOf< TFieldWidget > GetSettingFieldWidgetClass() const
Definition UserGameSettings.h:440
TSet< TSubclassOf< USettingFieldWidget > > SettingFieldWidgetClass
Definition UserGameSettings.h:400
Definition UserGameSettings.h:78
Definition UserGameSettings.h:335
Definition UserGameSettings.h:313
Definition UserGameSettings.h:324
Definition UserGameSettings.h:346
Definition UserGameSettings.h:302
Definition UserGameSettings.h:266
const TDropdownOption & GetOptions() const
Definition UserGameSettings.h:510
TMap< FName, FInstancedStruct > DropdownOptions
Definition UserGameSettings.h:290
const FName & GetKeyByValue(const TDropdownOption &Value) const
Definition UserGameSettings.h:493
Definition UserGameSettings.h:69
Definition GlobalUserSettingsRuntime.h:5
Definition UserGameSettings.h:87
Definition UserGameSettings.h:217
Definition UserGameSettings.h:96
Definition UserGameSettings.h:105
Definition UserGameSettings.h:42
Definition UserGameSettings.h:26
virtual ~FSettingProcessor()=default
Definition UserGameSettings.h:125
Definition UserGameSettings.h:145
Definition UserGameSettings.h:135
Definition UserGameSettings.h:155
Definition UserGameSettings.h:119
Definition UserGameSettings.h:170
FText Label
Definition UserGameSettings.h:199
static void CopyBaseSetting(const FSettingsBase &Source, FSettingsBase &Target)
Definition UserGameSettings.cpp:296
virtual ~FSettingsBase()=default
FInstancedStruct SettingProcessor
Definition UserGameSettings.h:208
bool operator!=(const FSettingsBase &Other) const
Definition UserGameSettings.cpp:290
virtual const UScriptStruct * GetSettingsStruct() const
Definition UserGameSettings.cpp:250
bool bAllowImmediateApply
Definition UserGameSettings.h:205
virtual void ApplySettings(const UUserGameSettings *RuntimeSettings, UGameInstance *GameInstance) const
Definition UserGameSettings.cpp:265
virtual void SetSettingValue(const FInstancedStruct &SettingValue)
Definition UserGameSettings.cpp:262
bool operator==(const FSettingsBase &Other) const
Definition UserGameSettings.cpp:278
virtual void CopySettings(FSettingsBase *OtherSetting)
Definition UserGameSettings.cpp:238
virtual FInstancedStruct GetSettingValue() const
Definition UserGameSettings.cpp:256
FText Tooltip
Definition UserGameSettings.h:202
static T * CastSetting(FSettingsBase *OtherSetting)
Definition UserGameSettings.h:461
Definition UserGameSettings.h:243
Definition UserGameSettings.h:60
Definition UserGameSettings.h:51