Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
UserGameSettings.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "CK_UE.h"
7#include "Blueprint/UserWidget.h"
9#include "Engine/DeveloperSettings.h"
10#include "StructUtils/InstancedStruct.h"
11#include "UserGameSettings.generated.h"
12
13
15class UGameInstance;
19struct FSettingsBase;
20
21
22#pragma region SettingProcessor
23
24USTRUCT(BlueprintType)
26{
27 GENERATED_BODY()
28
29public:
30 virtual ~FSettingProcessor() = default;
31
32public:
33 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const;
34
35protected:
36 static FGlobalUserSettingsRuntime GetCurrentGlobalUserSettingsRuntime();
37 static void SetGlobalUserSettingsRuntime(const FGlobalUserSettingsRuntime& Runtime);
38};
39
40USTRUCT(BlueprintType)
42{
43 GENERATED_BODY()
44
45public:
46 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
47};
48
49USTRUCT(BlueprintType)
51{
52 GENERATED_BODY()
53
54public:
55 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
56};
57
58USTRUCT(BlueprintType)
60{
61 GENERATED_BODY()
62
63public:
64 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
65};
66
67USTRUCT(BlueprintType)
69{
70 GENERATED_BODY()
71
72public:
73 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
74};
75
76USTRUCT(BlueprintType)
78{
79 GENERATED_BODY()
80
81public:
82 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
83};
84
85USTRUCT(BlueprintType)
87{
88 GENERATED_BODY()
89
90public:
91 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
92};
93
94USTRUCT(BlueprintType)
96{
97 GENERATED_BODY()
98
99public:
100 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
101};
102
103USTRUCT(BlueprintType)
105{
106 GENERATED_BODY()
107
108public:
109 virtual void ApplySettings(const FSettingsBase& Settings, const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const override;
110};
111
112#pragma endregion
113
114
115#pragma region SettingValue
116
117USTRUCT(BlueprintType)
119{
120 GENERATED_BODY()
121};
122
123USTRUCT(BlueprintType)
125{
126 GENERATED_BODY()
127
128public:
129 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category = "Value")
130 bool bValue = false;
131};
132
133USTRUCT(BlueprintType)
135{
136 GENERATED_BODY()
137
138public:
139 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category = "Value")
140 int32 Value = 0;
141};
142
143USTRUCT(BlueprintType)
145{
146 GENERATED_BODY()
147
148public:
149 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category = "Value")
150 float Value = 0.0f;
151};
152
153USTRUCT(BlueprintType)
155{
156 GENERATED_BODY()
157
158public:
159 UPROPERTY(EditAnywhere, BlueprintReadWrite, SaveGame, Category = "Value")
160 FString Value = FString();
161};
162
163#pragma endregion
164
165
166#pragma region Settings
167
168USTRUCT(BlueprintType)
170{
171 GENERATED_BODY()
172
173public:
174 virtual ~FSettingsBase() = default;
175
176public:
177 virtual void CopySettings(FSettingsBase* OtherSetting);
178 virtual const UScriptStruct* GetSettingsStruct() const;
179 virtual FInstancedStruct GetSettingValue() const;
180 virtual void SetSettingValue(const FInstancedStruct& SettingValue);
181 virtual void ApplySettings(const UUserGameSettings* RuntimeSettings, UGameInstance* GameInstance) const;
182
183public:
184 template <typename T>
185 static T* CastSetting(FSettingsBase* OtherSetting);
186
187 template <typename T>
188 static const T* CastSetting(const FSettingsBase* OtherSetting);
189
190public:
191 bool operator==(const FSettingsBase& Other) const;
192 bool operator!=(const FSettingsBase& Other) const;
193
194protected:
195 static void CopyBaseSetting(const FSettingsBase& Source, FSettingsBase& Target);
196
197public:
198 UPROPERTY(EditAnywhere, Category = "Settings")
199 FText Label = FText::GetEmpty();
200
201 UPROPERTY(EditAnywhere, Category = "Settings")
202 FText Tooltip = FText::GetEmpty();
203
204 UPROPERTY(EditAnywhere, Category = "Settings")
206
207 UPROPERTY(EditAnywhere, Category = "Settings", meta = (BaseStruct = "/Script/CK_UE.SettingProcessor", ExcludeBaseStruct))
208 FInstancedStruct SettingProcessor;
209
210public:
211 static const FSettingsBase None;
212};
213
214
215USTRUCT(BlueprintType)
217{
218 GENERATED_BODY()
219
220public:
221 virtual const UScriptStruct* GetSettingsStruct() const override;
222 virtual void CopySettings(FSettingsBase* OtherSetting) override;
223 virtual FInstancedStruct GetSettingValue() const override;
224 virtual void SetSettingValue(const FInstancedStruct& SettingValue) override;
225
226public:
227 UPROPERTY(EditAnywhere, Category = "Settings")
228 float Min = 0.0f;
229
230 UPROPERTY(EditAnywhere, Category = "Settings")
231 float Max = 1.0f;
232
233 UPROPERTY(EditAnywhere, Category = "Settings")
234 float InitialValue = 0.0f;
235
236 UPROPERTY()
237 float CurrentValue = 0.0f;
238};
239
240
241USTRUCT(BlueprintType)
243{
244 GENERATED_BODY()
245
246public:
247 virtual const UScriptStruct* GetSettingsStruct() const override;
248 virtual void CopySettings(FSettingsBase* OtherSetting) override;
249 virtual FInstancedStruct GetSettingValue() const override;
250 virtual void SetSettingValue(const FInstancedStruct& SettingValue) override;
251
252public:
253 UPROPERTY(EditAnywhere, Category = "Settings")
254 bool bDefaultValue = false;
255
256 UPROPERTY(EditAnywhere, Category = "Settings")
257 bool bInitialValue = 0.0f;
258
259 UPROPERTY()
260 bool bIsToggled = false;
261};
262
263
264USTRUCT(BlueprintType)
266{
267 GENERATED_BODY()
268
269public:
270 virtual const UScriptStruct* GetSettingsStruct() const override;
271 virtual void CopySettings(FSettingsBase* OtherSetting) override;
272 virtual FInstancedStruct GetSettingValue() const override;
273 virtual void SetSettingValue(const FInstancedStruct& SettingValue) override;
274
275public:
276 template <typename TDropdownOption>
277 const FName& GetKeyByValue(const TDropdownOption& Value) const;
278
279 template <typename TDropdownOption>
280 const TDropdownOption& GetOptions() const;
281
282 template <typename TDropdownOption>
283 const TDropdownOption& GetOptions(const FName& Key) const;
284
285 FName GetSelectionKey() const;
286 bool HasValidSelection() const;
287
288public:
289 UPROPERTY(EditAnywhere, Category = "Settings", meta = (BaseStruct = "/Script/CK_UE.DropdownSettingsOptionBase", ExcludeBaseStruct))
290 TMap<FName, FInstancedStruct> DropdownOptions;
291
292 UPROPERTY(EditAnywhere, Category = "Settings")
293 FName InitialKey = NAME_None;
294
295 UPROPERTY(Transient)
296 FName SelectedKey = NAME_None;
297};
298
299
300USTRUCT(BlueprintType)
302{
303 GENERATED_BODY()
304
305public:
306 UPROPERTY(EditAnywhere, Category = "Settings")
307 FText Tooltip = FText::GetEmpty();
308};
309
310
311USTRUCT(BlueprintType)
313{
314 GENERATED_BODY()
315
316public:
317 UPROPERTY(EditAnywhere, Category = "Settings")
318 mutable int32 Value = 0.0f;
319};
320
321
322USTRUCT(BlueprintType, DisplayName="Dropdown Setting IntPair Option")
324{
325 GENERATED_BODY()
326
327public:
328 UPROPERTY(EditAnywhere, Category = "Settings")
329 mutable FIntPoint Value = FIntPoint();
330};
331
332
333USTRUCT(BlueprintType)
335{
336 GENERATED_BODY()
337
338public:
339 UPROPERTY(EditAnywhere, Category = "Settings")
340 mutable float Value = 0.0f;
341};
342
343
344USTRUCT(BlueprintType, DisplayName = "Dropdown Setting UClass Option")
346{
347 GENERATED_BODY()
348
349public:
350 UPROPERTY(EditAnywhere, Category = "Settings")
351 mutable TSubclassOf<UObject> ObjectClass;
352};
353
354#pragma endregion
355
356
360UCLASS(Config=Game, DefaultConfig, Blueprintable, BlueprintType, meta=(DisplayName="User Game Settings"))
361class CK_UE_API UUserGameSettings : public UDeveloperSettings
362{
363 GENERATED_BODY()
364
365public:
366 const TMap<EUserGameSetting, FInstancedStruct> GetSettings(const EUserGameSettingCategory Category) const;
367
368public:
369 FORCEINLINE const TMap<EUserGameSetting, FInstancedStruct>& GetSettings() const
370 {
371 return Settings;
372 }
373
374 FORCEINLINE TMap<EUserGameSetting, FInstancedStruct>& GetMutableSettings()
375 {
376 return Settings;
377 }
378
379 FORCEINLINE virtual FName GetCategoryName() const override
380 {
381 return TEXT("CK_UE");
382 }
383
384public:
385 template <typename T>
386 T GetSettingOption(EUserGameSetting SettingType) const;
387
388 template <typename T>
389 T* GetMutableSettingOption(EUserGameSetting SettingType);
390
391 template <typename TFieldWidget>
392 TSubclassOf<TFieldWidget> GetSettingFieldWidgetClass() const;
393
394protected:
395 UPROPERTY(Config, EditAnywhere, BlueprintReadWrite, Category = "Settings", meta = (BaseStruct = "/Script/CK_UE.SettingsBase", ExcludeBaseStruct))
396 TMap<EUserGameSetting, FInstancedStruct> Settings;
397
398protected:
399 UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "WidgetClass", meta = (BlueprintBaseOnly))
400 TSet<TSubclassOf<USettingFieldWidget>> SettingFieldWidgetClass;
401};
402
403
404#pragma region Templates
405
406template <typename T>
408{
409 const FInstancedStruct* SettingStruct = Settings.Find(SettingType);
410
411 if (SettingStruct == nullptr)
412 {
413 return T();
414 }
415
416 const T* Setting = SettingStruct->GetPtr<T>();
417
418 if (Setting == nullptr)
419 {
420 return T();
421 }
422
423 return *Setting;
424}
425
426template <typename T>
428{
429 FInstancedStruct* SettingStruct = Settings.Find(SettingType);
430
431 if (SettingStruct == nullptr)
432 {
433 return nullptr;
434 }
435
436 return SettingStruct->GetMutablePtr<T>();
437}
438
439template <typename TFieldWidget>
440TSubclassOf<TFieldWidget> UUserGameSettings::GetSettingFieldWidgetClass() const
441{
442 static_assert(TIsDerivedFrom<TFieldWidget, UUserWidget>::IsDerived, "TFieldWidget은 UUserWidget을 상속해야 합니다.");
443
444 auto Result = Algo::FindByPredicate(SettingFieldWidgetClass, [](const TSubclassOf<USettingFieldWidget>& WidgetClass)
445 {
446 return WidgetClass && WidgetClass->IsChildOf(TFieldWidget::StaticClass());
447 });
448
449 if (Result && *Result)
450 {
451 return (*Result).Get();
452 }
453 else
454 {
455 LOG_ERROR(LogCK, "위젯 클래스가 정상적으로 설정되지 않은 것 같습니다.");
456 return nullptr;
457 }
458}
459
460template <typename T>
462{
463 if (OtherSetting == nullptr)
464 {
465 return nullptr;
466 }
467
468 if (OtherSetting->GetSettingsStruct() != T::StaticStruct())
469 {
470 return nullptr;
471 }
472
473 return static_cast<T*>(OtherSetting);
474}
475
476template <typename T>
477const T* FSettingsBase::CastSetting(const FSettingsBase* OtherSetting)
478{
479 if (OtherSetting == nullptr)
480 {
481 return nullptr;
482 }
483
484 if (OtherSetting->GetSettingsStruct() != T::StaticStruct())
485 {
486 return nullptr;
487 }
488
489 return static_cast<const T*>(OtherSetting);
490}
491
492template <typename TDropdownOption>
493const FName& FDropdownSettings::GetKeyByValue(const TDropdownOption& Value) const
494{
495 for (const TPair<FName, FInstancedStruct>& DropdownOption : DropdownOptions)
496 {
497 const TDropdownOption* Option = DropdownOption.Value.GetPtr<TDropdownOption>();
498
499 if (Option && Option->Value == Value.Value)
500 {
501 return DropdownOption.Key;
502 }
503 }
504
505 static const FName DefaultKey = NAME_None;
506 return DefaultKey;
507}
508
509template <typename TDropdownOption>
510const TDropdownOption& FDropdownSettings::GetOptions() const
511{
512 for (const TPair<FName, FInstancedStruct>& DropdownOption : DropdownOptions)
513 {
514 const TDropdownOption* Option = DropdownOption.Value.GetPtr<TDropdownOption>();
515
516 if (Option)
517 {
518 return *Option;
519 }
520 }
521
522 static const TDropdownOption EmptyOption;
523 return EmptyOption;
524}
525
526template <typename TDropdownOption>
527const TDropdownOption& FDropdownSettings::GetOptions(const FName& Key) const
528{
529 const FInstancedStruct* Value = DropdownOptions.Find(Key);
530 if (Value == nullptr)
531 {
532 static const TDropdownOption EmptyOption;
533 return EmptyOption;
534 }
535
536 const TDropdownOption* Option = Value->GetPtr<TDropdownOption>();
537 if (Option)
538 {
539 return *Option;
540 }
541
542 static const TDropdownOption EmptyOption;
543 return EmptyOption;
544}
545
546#pragma endregion
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
EUserGameSetting
Definition EUserGameSettingHeader.h:18
EUserGameSettingCategory
Definition EUserGameSettingHeader.h:9
static constexpr FGlobalUserSettingsRuntime None
Definition GlobalUserSettingsRuntime.cpp:6
Definition CK_UE.Build.cs:6
Definition SettingFieldWidget.h:24
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