void UGameplayTagsManager::LoadGameplayTagTables(TArray<FString>& TagTableNames) { if (GameplayTagTables.Num() == 0 && TagTableNames.Num() > 0) { for (auto It(TagTableNames.CreateConstIterator()); It; ++It) { const FString& FileName = *It; UDataTable* TagTable = LoadObject<UDataTable>(NULL, *FileName, NULL, LOAD_None, NULL); // Handle case where the module is dynamically-loaded within a LoadPackage stack, which would otherwise // result in the tag table not having its RowStruct serialized in time. Without the RowStruct, the tags manager // will not be initialized correctly. if (TagTable && IsLoading()) { FLinkerLoad* TagLinker = TagTable->GetLinker(); if (TagLinker) { TagTable->GetLinker()->Preload(TagTable); } } GameplayTagTables.Add(TagTable); } } #if WITH_EDITOR // Hook into notifications for object re-imports so that the gameplay tag tree can be reconstructed if the table changes if (GIsEditor && GameplayTagTables.Num() > 0 && !RegisteredObjectReimport) { RegisteredObjectReimport = true; FEditorDelegates::OnAssetPostImport.AddUObject(this, &UGameplayTagsManager::OnObjectReimported); } #endif }
// Called when the game starts void UTestLoadCSVComponent::BeginPlay() { Super::BeginPlay(); // ... // 加载csv,并且显示第一行数据 UDataTable* csv = LoadObject<UDataTable>(NULL, TEXT("DataTable'/Game/csv/test1.test1'")); if (csv != NULL && csv->GetRowNames().Num() > 0) { // 获取id=1的那行的数据 FTestDataRow* row = csv->FindRow<FTestDataRow>(TEXT("1"), TEXT("")); if (row != NULL) { Debug(FString::Printf(TEXT("csv, row time="), row->time)); } } // 动态读取csv文件,不过,这个只能在Editor模式运行,如果需要在发布版中运行,那么自己新建一个类 FString FilePath = FPaths::ConvertRelativePathToFull(FPaths::GameDir()) + FString::Printf(TEXT("csv/test1.csv")); FString Data; if (FFileHelper::LoadFileToString(Data, *FilePath)) { UDataTable* DataTable = NewObject<UDataTable>(GetTransientPackage(), FName(TEXT("CSV_Test"))); DataTable->RowStruct = FTestDataRow::StaticStruct(); DataTable->CreateTableFromCSVString(Data); Debug(FString::Printf(TEXT("%d"), DataTable->GetRowNames().Num())); } }
static UDataTable* CreateGameplayDataTable() { FString CSV(TEXT(",Tag,CategoryText,")); CSV.Append(TEXT("\r\n0,Damage")); CSV.Append(TEXT("\r\n1,Damage.Basic")); CSV.Append(TEXT("\r\n2,Damage.Type1")); CSV.Append(TEXT("\r\n3,Damage.Type2")); CSV.Append(TEXT("\r\n4,Damage.Reduce")); CSV.Append(TEXT("\r\n5,Damage.Buffable")); CSV.Append(TEXT("\r\n6,Damage.Buff")); CSV.Append(TEXT("\r\n7,Damage.Physical")); CSV.Append(TEXT("\r\n8,Damage.Fire")); CSV.Append(TEXT("\r\n9,Damage.Buffed.FireBuff")); CSV.Append(TEXT("\r\n10,Damage.Mitigated.Armor")); CSV.Append(TEXT("\r\n11,Lifesteal")); CSV.Append(TEXT("\r\n12,Shield")); CSV.Append(TEXT("\r\n13,Buff")); CSV.Append(TEXT("\r\n14,Immune")); CSV.Append(TEXT("\r\n15,FireDamage")); CSV.Append(TEXT("\r\n16,ShieldAbsorb")); CSV.Append(TEXT("\r\n17,Stackable")); CSV.Append(TEXT("\r\n18,Stack")); CSV.Append(TEXT("\r\n19,Stack.CappedNumber")); CSV.Append(TEXT("\r\n20,Stack.DiminishingReturns")); CSV.Append(TEXT("\r\n21,Protect.Damage")); CSV.Append(TEXT("\r\n22,SpellDmg.Buff")); CSV.Append(TEXT("\r\n23,GameplayCue.Burning")); UDataTable * DataTable = Cast<UDataTable>(StaticConstructObject(UDataTable::StaticClass(), GetTransientPackage(), FName(TEXT("TempDataTable")))); DataTable->RowStruct = FGameplayTagTableRow::StaticStruct(); DataTable->CreateTableFromCSVString(CSV); FGameplayTagTableRow * Row = (FGameplayTagTableRow*)DataTable->RowMap["0"]; if (Row) { check(Row->Tag == TEXT("Damage")); } return DataTable; }