KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UGameDataManager.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved. Unauthorized copying, modification, or distribution of this file, via any medium is strictly prohibited. Proprietary and confidential.
2
7#include "UGameDataManager.h"
8#include "GameLogging.h"
10#include "FComponentHelper.h"
11
12// #define HITSTOP_PATH TEXT("/Game/CustomContents/MasterData/DT_HitStop.DT_HitStop")
13// #define KNOCKBACK_PATH TEXT("/Game/CustomContents/MasterData/DT_Knockback.DT_Knockback")
14// #define CHARACTERINFO_PATH TEXT("/Game/CustomContents/MasterData/DT_CharacterInfo.DT_CharacterInfo")
15// #define CHARACTERASSET_PATH TEXT("/Game/CustomContents/MasterData/DT_CharacterAsset.DT_CharacterAsset")
16#define COLORDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_ColorData.DT_ColorData")
17#define COLORSTYLEDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_ColorStyleData.DT_ColorStyleData")
18#define RESOURCETEXTUREDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_ResourceTextureData.DT_ResourceTextureData")
19#define LEVELDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_LevelData.DT_LevelData")
20#define LISTENDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_ListenData.DT_ListenData")
21#define READDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_ReadData.DT_ReadData")
22#define WORDDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_WordStudyData.DT_WordStudyData")
23#define HOWTOPLAYDATA_PATH TEXT("/Game/CustomContents/MasterData/DT_HowToPlayPageData.DT_HowToPlayPageData")
24
25
37
38void UGameDataManager::Initialize(FSubsystemCollectionBase& Collection)
39{
40 Super::Initialize(Collection);
41
43}
44
46{
47 // Clear_HitStopTable();
48 // Clear_KnockbackTable();
49 // Clear_CharacterInfoData();
50 // Clear_CharacterAssetData();
59
60 Super::Deinitialize();
61}
62
64{
65 // LoadData_HitStopTable();
66 // LoadData_KnockbackTable();
67 // LoadData_CharacterInfoData();
68 // LoadData_CharacterAssetData();
77}
78
79#pragma region HIT_STOP
81{
82 HitStopCache.Reset();
83 bLoadHitStop = false;
84}
85
87{
88 HitStopCache.Reset();
89 bLoadHitStop = false;
90
91 UDataTable* TableObj = HitStopTable.LoadSynchronous();
92 if (!TableObj)
93 {
94 PRINTLOG(TEXT("Load failed: %s"), *HitStopTable.ToString());
95 return;
96 }
97
98 static const FString ContextString(TEXT("HitStopTable"));
99 for (const FName& RowName : TableObj->GetRowNames() )
100 {
101 if (const FHitStopData* Row = TableObj->FindRow<FHitStopData>(RowName, ContextString, true))
102 {
103 HitStopCache.Add(Row->Type, *Row);
104 }
105 }
106
107 bLoadHitStop = true;
108}
109
111{
112 if (!bLoadHitStop)
113 return false;
114
115 if (const FHitStopData* Found = HitStopCache.Find(Type))
116 {
117 Out = *Found;
118 return true;
119 }
120
121 PRINTLOG(TEXT("DataGetFail : %s"), *UEnum::GetValueAsString(Type) );
122 return false;
123}
124
126{
127 if (!bLoadHitStop)
128 return 0.0f;
129
130 if (const FHitStopData* Found = HitStopCache.Find(Type))
131 return Found->Duration;
132
133 return 0.0f;
134}
135
136#pragma endregion HIT_STOP
137
138#pragma region KNOCKBACK
144
146{
147 KnockbackCache.Reset();
148 bLoadKnockback = false;
149
150 UDataTable* TableObj = KnockbackTable.LoadSynchronous();
151 if (!TableObj)
152 {
153 PRINTLOG(TEXT("Load failed: %s"), *KnockbackTable.ToString());
154 return;
155 }
156
157 static const FString ContextString(TEXT("KnockbackTable"));
158 for (const FName& RowName : TableObj->GetRowNames() )
159 {
160 if (const FKnockbackData* Row = TableObj->FindRow<FKnockbackData>(RowName, ContextString, true))
161 {
162 KnockbackCache.Add(Row->Type, *Row);
163 }
164 }
165
166 bLoadKnockback = true;
167}
168
170{
171 if (!bLoadKnockback)
172 return false;
173
174 if (const FKnockbackData* Found = KnockbackCache.Find(Type))
175 {
176 Out = *Found;
177 return true;
178 }
179
180 PRINTLOG(TEXT("DataGetFail : %s"), *UEnum::GetValueAsString(Type) );
181 return false;
182}
183#pragma endregion KNOCKBACK
184
185#pragma region CHARACTER_INFO_DATA
191
193{
194 CharacterInfoCache.Reset();
195 bLoadCharacterInfo = false;
196
197 UDataTable* TableObj = CharacterInfoTable.LoadSynchronous();
198 if (!TableObj)
199 {
200 PRINTLOG(TEXT("Load failed: %s"), *CharacterInfoTable.ToString());
201 return;
202 }
203
204 static const FString ContextString(TEXT("CharacterInfoTable"));
205 for (const FName& RowName : TableObj->GetRowNames() )
206 {
207 if (const FCharacterInfoData* Row = TableObj->FindRow<FCharacterInfoData>(RowName, ContextString, true))
208 {
209 CharacterInfoCache.Add(Row->Type, *Row);
210 }
211 }
212
213 bLoadCharacterInfo = true;
214}
215
217{
219 return false;
220
221 if (const FCharacterInfoData* Found = CharacterInfoCache.Find(Type))
222 {
223 Out = *Found;
224 return true;
225 }
226
227 PRINTLOG(TEXT("DataGetFail : %s"), *UEnum::GetValueAsString(Type) );
228 return false;
229}
230#pragma endregion CHARACTER_INFO_DATA
231
232#pragma region CHARACTER_ASSET_DATA
238
240{
241 CharacterAssetCache.Reset();
242 bLoadCharacterAsset = false;
243
244 UDataTable* TableObj = CharacterAssetTable.LoadSynchronous();
245 if (!TableObj)
246 {
247 PRINTLOG(TEXT("Load failed: %s"), *CharacterAssetTable.ToString());
248 return;
249 }
250
251 static const FString ContextString(TEXT("CharacterAssetTable"));
252 for (const FName& RowName : TableObj->GetRowNames() )
253 {
254 if (const FCharacterAssetData* Row = TableObj->FindRow<FCharacterAssetData>(RowName, ContextString, true))
255 {
256 CharacterAssetCache.Add(Row->CharacterType, *Row);
257 }
258 }
259
260 bLoadCharacterAsset = true;
261}
262
264{
266 return false;
267
268 if (const FCharacterAssetData* Found = CharacterAssetCache.Find(Type))
269 {
270 Out = *Found;
271 return true;
272 }
273
274 PRINTLOG(TEXT("DataGetFail : %s"), *UEnum::GetValueAsString(Type) );
275 return false;
276}
277#pragma endregion CHARACTER_ASSET_DATA
278
279#pragma region COLOR_DATA
281{
282 ColorDataCache.Reset();
283 bLoadColorData = false;
284}
285
287{
288 ColorDataCache.Reset();
289 bLoadColorData = false;
290
291 UDataTable* TableObj = ColorDataTable.LoadSynchronous();
292 if (!TableObj)
293 {
294 PRINTLOG(TEXT("Load failed: %s"), *ColorDataTable.ToString());
295 return;
296 }
297
298 static const FString ContextString(TEXT("ColorDataTable"));
299 for (const FName& RowName : TableObj->GetRowNames())
300 {
301 if (const FColorData* Row = TableObj->FindRow<FColorData>(RowName, ContextString, true))
302 {
303 ColorDataCache.Add(Row->Index, *Row);
304 }
305 }
306
307 bLoadColorData = true;
308}
309
310bool UGameDataManager::GetColorData(int32 Index, FColorData& Out) const
311{
312 if (!bLoadColorData)
313 return false;
314
315 if (const FColorData* Found = ColorDataCache.Find(Index))
316 {
317 Out = *Found;
318 return true;
319 }
320
321 PRINTLOG(TEXT("DataGetFail : ColorData Index %d"), Index);
322 return false;
323}
324
325TArray<FColorData> UGameDataManager::GetColorDataByLevel(int32 Level) const
326{
327 TArray<FColorData> Result;
328
329 if (!bLoadColorData)
330 return Result;
331
332 for (const auto& Pair : ColorDataCache)
333 {
334 if (Pair.Value.Level == Level)
335 {
336 Result.Add(Pair.Value);
337 }
338 }
339
340 return Result;
341}
342
344{
345 TArray<int32> Keys;
346
347 if (!bLoadColorData)
348 return Keys;
349
350 ColorDataCache.GetKeys(Keys);
351 return Keys;
352}
353#pragma endregion COLOR_DATA
354
355#pragma region COLOR_STYLE_DATA
361
363{
364 ColorStyleDataCache.Reset();
365 bLoadColorStyleData = false;
366
367 UDataTable* TableObj = ColorStyleDataTable.LoadSynchronous();
368 if (!TableObj)
369 {
370 PRINTLOG(TEXT("Load failed: %s"), *ColorStyleDataTable.ToString());
371 return;
372 }
373
374 static const FString ContextString(TEXT("ColorStyleDataTable"));
375 for (const FName& RowName : TableObj->GetRowNames())
376 {
377 if (const FColorStyleData* Row = TableObj->FindRow<FColorStyleData>(RowName, ContextString, true))
378 {
379 // RowName을 Enum으로 변환
380 FString EnumString = RowName.ToString();
381 EColorStyleType ColorType = static_cast<EColorStyleType>(
382 StaticEnum<EColorStyleType>()->GetValueByNameString(EnumString)
383 );
384
385 ColorStyleDataCache.Add(ColorType, *Row);
386 }
387 }
388
389 bLoadColorStyleData = true;
390}
391
393{
395 return false;
396
397 if (const FColorStyleData* Found = ColorStyleDataCache.Find(Type))
398 {
399 Out = *Found;
400 return true;
401 }
402
403 PRINTLOG(TEXT("DataGetFail : ColorStyleData Type %s"), *UEnum::GetValueAsString(Type));
404 return false;
405}
406
407TMap<EColorStyleType, FColorStyleData> UGameDataManager::GetAllColorStyleData() const
408{
410 return TMap<EColorStyleType, FColorStyleData>();
411
412 return ColorStyleDataCache;
413}
414#pragma endregion COLOR_STYLE_DATA
415
416#pragma region RESOURCE_TEXTURE_DATA
422
424{
427
428 UDataTable* TableObj = ResourceTextureDataTable.LoadSynchronous();
429 if (!TableObj)
430 {
431 PRINTLOG(TEXT("Load failed: %s"), *ResourceTextureDataTable.ToString());
432 return;
433 }
434
435 static const FString ContextString(TEXT("ResourceTextureDataTable"));
436 for (const FName& RowName : TableObj->GetRowNames())
437 {
438 if (const FResourceTextureData* Row = TableObj->FindRow<FResourceTextureData>(RowName, ContextString, true))
439 {
440 // RowName을 Enum으로 변환
441 FString EnumString = RowName.ToString();
442 EResourceTextureType TextureType = static_cast<EResourceTextureType>(
443 StaticEnum<EResourceTextureType>()->GetValueByNameString(EnumString)
444 );
445
446 ResourceTextureDataCache.Add(TextureType, *Row);
447 }
448 }
449
451}
452
454{
456 return false;
457
458 if (const FResourceTextureData* Found = ResourceTextureDataCache.Find(Type))
459 {
460 Out = *Found;
461 return true;
462 }
463
464 PRINTLOG(TEXT("DataGetFail : ResourceTextureData Type %s"), *UEnum::GetValueAsString(Type));
465 return false;
466}
467
469{
471 return nullptr;
472
473 if (const FResourceTextureData* Found = ResourceTextureDataCache.Find(Type))
474 {
475 // TSoftObjectPtr를 동기적으로 로드
476 return Found->Texture.LoadSynchronous();
477 }
478
479 return nullptr;
480}
481#pragma endregion RESOURCE_TEXTURE_DATA
482
483#pragma region LEVEL_DATA
485{
486 LevelDataCache.Reset();
487 bLoadLevelData = false;
488}
489
491{
492 LevelDataCache.Reset();
493 bLoadLevelData = false;
494
495 UDataTable* TableObj = LevelDataTable.LoadSynchronous();
496 if (!TableObj)
497 {
498 PRINTLOG(TEXT("Load failed: %s"), *LevelDataTable.ToString());
499 return;
500 }
501
502 static const FString ContextString(TEXT("LevelDataTable"));
503 for (const FName& RowName : TableObj->GetRowNames())
504 {
505 if (const FLevelData* Row = TableObj->FindRow<FLevelData>(RowName, ContextString, true))
506 {
507 LevelDataCache.Add(Row->Index, *Row);
508 }
509 }
510
511 bLoadLevelData = true;
512}
513
514bool UGameDataManager::GetLevelData(int32 Step, int32 Level, FLevelData& Out) const
515{
516 if (!bLoadLevelData)
517 return false;
518
519 for (const auto& Pair : LevelDataCache)
520 {
521 if (Pair.Value.Step == Step && Pair.Value.Level == Level)
522 {
523 Out = Pair.Value;
524 return true;
525 }
526 }
527
528 PRINTLOG(TEXT("DataGetFail : LevelData Step %d, Level %d"), Step, Level);
529 return false;
530}
531#pragma endregion LEVEL_DATA
532
533#pragma region LISTEN_DATA
535{
536 ListenDataCache.Reset();
537 bLoadListenData = false;
538}
539
541{
542 ListenDataCache.Reset();
543 bLoadListenData = false;
544
545 UDataTable* TableObj = ListenDataTable.LoadSynchronous();
546 if (!TableObj)
547 {
548 PRINTLOG(TEXT("Load failed: %s"), *ListenDataTable.ToString());
549 return;
550 }
551
552 static const FString ContextString(TEXT("ListenDataTable"));
553 for (const FName& RowName : TableObj->GetRowNames())
554 {
555 if (const FListenData* Row = TableObj->FindRow<FListenData>(RowName, ContextString, true))
556 {
557 ListenDataCache.Add(Row->Index, *Row);
558 }
559 }
560
561 bLoadListenData = true;
562}
563
564bool UGameDataManager::GetListenData(int32 Index, FListenData& Out) const
565{
566 if (!bLoadListenData)
567 return false;
568
569 if (const FListenData* Found = ListenDataCache.Find(Index))
570 {
571 Out = *Found;
572 return true;
573 }
574
575 PRINTLOG(TEXT("DataGetFail : ListenData Index %d"), Index);
576 return false;
577}
578
579TArray<FListenData> UGameDataManager::GetListenDataByStepAndLevel(int32 Step, int32 Level) const
580{
581 TArray<FListenData> Result;
582
583 if (!bLoadListenData)
584 return Result;
585
586 for (const auto& Pair : ListenDataCache)
587 {
588 if (Pair.Value.Step == Step && Pair.Value.Level == Level)
589 {
590 Result.Add(Pair.Value);
591 }
592 }
593
594 return Result;
595}
596
597TArray<FListenData> UGameDataManager::GetListenDataByCategory(const FString& Category) const
598{
599 TArray<FListenData> Result;
600
601 if (!bLoadListenData)
602 return Result;
603
604 for (const auto& Pair : ListenDataCache)
605 {
606 if (Pair.Value.Category.Equals(Category))
607 {
608 Result.Add(Pair.Value);
609 }
610 }
611
612 return Result;
613}
614
616{
617 TArray<int32> Keys;
618
619 if (!bLoadListenData)
620 return Keys;
621
622 ListenDataCache.GetKeys(Keys);
623 return Keys;
624}
625#pragma endregion LISTEN_DATA
626
627#pragma region READ_DATA
629{
630 ReadDataCache.Reset();
631 bLoadReadData = false;
632}
633
635{
636 ReadDataCache.Reset();
637 bLoadReadData = false;
638
639 UDataTable* TableObj = ReadDataTable.LoadSynchronous();
640 if (!TableObj)
641 {
642 PRINTLOG(TEXT("Load failed: %s"), *ReadDataTable.ToString());
643 return;
644 }
645
646 static const FString ContextString(TEXT("ReadDataTable"));
647 for (const FName& RowName : TableObj->GetRowNames())
648 {
649 if (const FReadData* Row = TableObj->FindRow<FReadData>(RowName, ContextString, true))
650 {
651 ReadDataCache.Add(Row->Index, *Row);
652 }
653 }
654
655 bLoadReadData = true;
656}
657
658bool UGameDataManager::GetReadData(int32 Index, FReadData& Out) const
659{
660 if (!bLoadReadData)
661 return false;
662
663 if (const FReadData* Found = ReadDataCache.Find(Index))
664 {
665 Out = *Found;
666 return true;
667 }
668
669 PRINTLOG(TEXT("DataGetFail : ReadData Index %d"), Index);
670 return false;
671}
672
673TArray<FReadData> UGameDataManager::GetReadDataByLevel(int32 Level) const
674{
675 TArray<FReadData> Result;
676
677 if (!bLoadReadData)
678 return Result;
679
680 for (const auto& Pair : ReadDataCache)
681 {
682 if (Pair.Value.Level == Level)
683 {
684 Result.Add(Pair.Value);
685 }
686 }
687
688 return Result;
689}
690
692{
693 TArray<int32> Keys;
694
695 if (!bLoadReadData)
696 return Keys;
697
698 ReadDataCache.GetKeys(Keys);
699 return Keys;
700}
701#pragma endregion READ_DATA
702
703#pragma region WORD_DATA
709
711{
712 WordStudyDataCache.Reset();
713 bLoadWordStudyData = false;
714
715 UDataTable* TableObj = WordStudyDataTable.LoadSynchronous();
716 if (!TableObj)
717 {
718 PRINTLOG(TEXT("Load failed: %s"), *WordStudyDataTable.ToString());
719 return;
720 }
721
722 static const FString ContextString(TEXT("WordStudyDataTable"));
723 for (const FName& RowName : TableObj->GetRowNames())
724 {
725 if (const FWordStudyData* Row = TableObj->FindRow<FWordStudyData>(RowName, ContextString, true))
726 {
727 WordStudyDataCache.Add(Row->Index, *Row);
728 }
729 }
730
731 bLoadWordStudyData = true;
732}
733
735{
737 return false;
738
739 if (const FWordStudyData* Found = WordStudyDataCache.Find(Index))
740 {
741 Out = *Found;
742 return true;
743 }
744
745 PRINTLOG(TEXT("DataGetFail : WordData Index %d"), Index);
746 return false;
747}
748
749TArray<FWordStudyData> UGameDataManager::GetAllWordStudyData() const
750{
751 TArray<FWordStudyData> Result;
752
754 return Result;
755
756 for (const auto& Pair : WordStudyDataCache)
757 {
758 Result.Add(Pair.Value);
759 }
760
761 return Result;
762}
763#pragma endregion WORD_DATA
764
765#pragma region HOW_TO_PLAY_DATA
771
773{
776
777 UDataTable* TableObj = HowToPlayPageDataTable.LoadSynchronous();
778 if (!TableObj)
779 {
780 PRINTLOG(TEXT("Load failed: %s"), *HowToPlayPageDataTable.ToString());
781 return;
782 }
783
784 static const FString ContextString(TEXT("HowToPlayPageDataTable"));
785 for (const FName& RowName : TableObj->GetRowNames())
786 {
787 if (const FHowToPlayPageData* Row = TableObj->FindRow<FHowToPlayPageData>(RowName, ContextString, true))
788 {
789 // RowName을 Enum으로 변환
790 FString EnumString = RowName.ToString();
791 EHowToPlayPageType PageType = static_cast<EHowToPlayPageType>(
792 StaticEnum<EHowToPlayPageType>()->GetValueByNameString(EnumString)
793 );
794
795 HowToPlayPageDataCache.Add(PageType, *Row);
796 }
797 }
798
800}
801
803{
805 return false;
806
807 if (const FHowToPlayPageData* Found = HowToPlayPageDataCache.Find(Type))
808 {
809 Out = *Found;
810 return true;
811 }
812
813 PRINTLOG(TEXT("DataGetFail : HowToPlayPageData Type %s"), *UEnum::GetValueAsString(Type));
814 return false;
815}
816
817TArray<FHowToPlayPageData> UGameDataManager::GetAllHowToPlayPageData() const
818{
819 TArray<FHowToPlayPageData> Result;
820
822 return Result;
823
824 for (const auto& Pair : HowToPlayPageDataCache)
825 {
826 Result.Add(Pair.Value);
827 }
828
829 return Result;
830}
831#pragma endregion HOW_TO_PLAY_DATA
ECharacterType
EDamageType
Definition EDamageType.h:9
UCharacterData 클래스를 선언합니다.
EColorStyleType
FComponentHelper 구조체를 선언합니다.
EHowToPlayPageType
HowToPlay 페이지 타입
EResourceTextureType
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
#define COLORDATA_PATH
#define WORDDATA_PATH
#define HOWTOPLAYDATA_PATH
#define READDATA_PATH
#define RESOURCETEXTUREDATA_PATH
#define COLORSTYLEDATA_PATH
#define LISTENDATA_PATH
#define LEVELDATA_PATH
UGameDataManager 클래스를 선언합니다.
virtual void Initialize(FSubsystemCollectionBase &Collection) override
UTexture2D * GetTexture(EResourceTextureType Type) const
TMap< ECharacterType, FCharacterAssetData > CharacterAssetCache
virtual void Deinitialize() override
TMap< int32, FListenData > ListenDataCache
TSoftObjectPtr< UDataTable > ResourceTextureDataTable
TSoftObjectPtr< UDataTable > ColorDataTable
bool GetKnockbackData(EDamageType Type, FKnockbackData &Out) const
bool GetWordStudyData(int32 Index, FWordStudyData &Out) const
TMap< int32, FWordStudyData > WordStudyDataCache
TMap< int32, FColorData > ColorDataCache
bool GetReadData(int32 Index, FReadData &Out) const
TArray< FListenData > GetListenDataByStepAndLevel(int32 Step, int32 Level) const
TArray< FListenData > GetListenDataByCategory(const FString &Category) const
TMap< EDamageType, FKnockbackData > KnockbackCache
TMap< EHowToPlayPageType, FHowToPlayPageData > HowToPlayPageDataCache
bool GetLevelData(int32 Step, int32 Level, FLevelData &Out) const
TSoftObjectPtr< UDataTable > CharacterInfoTable
bool GetResourceTextureData(EResourceTextureType Type, FResourceTextureData &Out) const
TMap< int32, FLevelData > LevelDataCache
TArray< FColorData > GetColorDataByLevel(int32 Level) const
bool GetCharacterInfoData(ECharacterType Type, FCharacterInfoData &Out) const
TMap< EResourceTextureType, FResourceTextureData > ResourceTextureDataCache
TSoftObjectPtr< UDataTable > ReadDataTable
TMap< EColorStyleType, FColorStyleData > GetAllColorStyleData() const
TMap< EColorStyleType, FColorStyleData > ColorStyleDataCache
TArray< FReadData > GetReadDataByLevel(int32 Level) const
TArray< int32 > GetAllListenDataKeys() const
TSoftObjectPtr< UDataTable > CharacterAssetTable
TArray< FWordStudyData > GetAllWordStudyData() const
TSoftObjectPtr< UDataTable > LevelDataTable
bool GetListenData(int32 Index, FListenData &Out) const
float GetHitStopDelayTime(EDamageType Type) const
bool GetColorStyleData(EColorStyleType Type, FColorStyleData &Out) const
bool GetCharacterAssetData(ECharacterType Type, FCharacterAssetData &Out) const
bool GetHowToPlayPageData(EHowToPlayPageType Type, FHowToPlayPageData &Out) const
TArray< int32 > GetAllReadDataKeys() const
bool GetHitStopData(EDamageType Type, UPARAM(ref) FHitStopData &Out) const
TSoftObjectPtr< UDataTable > HitStopTable
TMap< int32, FReadData > ReadDataCache
TMap< ECharacterType, FCharacterInfoData > CharacterInfoCache
TSoftObjectPtr< UDataTable > KnockbackTable
TSoftObjectPtr< UDataTable > HowToPlayPageDataTable
TMap< EDamageType, FHitStopData > HitStopCache
TSoftObjectPtr< UDataTable > ListenDataTable
TSoftObjectPtr< UDataTable > ColorStyleDataTable
TArray< int32 > GetAllColorDataKeys() const
TSoftObjectPtr< UDataTable > WordStudyDataTable
bool GetColorData(int32 Index, FColorData &Out) const
TArray< FHowToPlayPageData > GetAllHowToPlayPageData() const
색상 데이터를 정의하는 구조체
Definition FColorData.h:19
static T * LoadAsset(const TCHAR *Path)
HowToPlay 페이지 데이터
레벨 데이터를 정의하는 구조체
Definition FLevelData.h:19
듣기 학습 데이터를 정의하는 구조체
Definition FListenData.h:19
읽기 학습 데이터를 정의하는 구조체
Definition FReadData.h:19
단어 학습 데이터를 정의하는 구조체