DataConfigSystem is a simple and lightweight global system for loading game data using GameplayTags. Originally designed for loading game configuration data like DataTables and DataAssets, but basically can be used for loading any UObject-derived asset in a centralized, type-safe manner.
- GameplayTag-based asset management - Store and retrieve any UObject-derived assets using GameplayTags
- Asynchronous loading - Non-blocking asset loading with full Blueprint and C++ support
- Developer Settings integration - Easy configuration through Project Settings UI
- Custom Blueprint node - Dedicated "Async Load Data" node with automatic type casting
- Asset validation - Built-in validation system with class filtering and automatic cleanup
- Flexible architecture - Supports DataTables, DataAssets, Blueprint classes, and any UObject-derived assets
- Lightweight - Minimal performance overhead with intelligent caching system
- Unreal Engine 5.0+
- GameplayTags plugin (usually enabled by default)
Note: release version of plugin may differ from the source code version in the repository due to minor fixes. Releases are updated on major updates. See commits for relevant changes
cd YourUnrealProject/Plugins
git clone https://github.com/YourUsername/DataConfigSystem.git
- Download the plugin files
- Extract to
YourUnrealProject/Plugins/DataConfigSystem/
- Regenerate project files (right-click
.uproject
→ "Generate Visual Studio project files") - Build the project in your IDE or through the editor
- Enable the plugin:
Edit → Plugins → Project → Data Config System
Method 3: Download already packaged plugin from Releases
- Open Project Settings → Game → Data Configuration Settings
- Configure Class Filters to specify which asset types are allowed (e.g.,
DataTable
,PrimaryDataAsset
) - Add your assets to the Data map using GameplayTags as keys
The plugin provides a custom Blueprint node that automatically handles type casting and async loading:
You can also use the subsystem functions directly:
// Header file
UCLASS()
class YOURGAME_API AYourActor : public AActor
{
GENERATED_BODY()
private:
UPROPERTY()
class UDataConfigSubsystem* DataConfigSubsystem;
UFUNCTION()
void OnDataLoadComplete(UObject* LoadedObject);
UFUNCTION()
void OnDataLoadFailed();
};
// Implementation
void AYourActor::BeginPlay()
{
Super::BeginPlay();
// Get the subsystem
if (UGameInstance* GameInstance = GetGameInstance())
{
DataConfigSubsystem = GameInstance->GetSubsystem<UDataConfigSubsystem>();
}
// Load data synchronously
FGameplayTag PlayerStatsTag = FGameplayTag::RequestGameplayTag("Config.PlayerStats");
if (UDataTable* PlayerStats = Cast<UDataTable>(DataConfigSubsystem->GetDataSync(PlayerStatsTag)))
{
// Use your data table
UE_LOG(LogTemp, Log, TEXT("Loaded PlayerStats DataTable"));
}
// Load data asynchronously
FOnDataLoadComplete OnComplete;
FOnDataLoadFailed OnFailed;
OnComplete.BindDynamic(this, &AYourActor::OnDataLoadComplete);
OnFailed.BindDynamic(this, &AYourActor::OnDataLoadFailed);
DataConfigSubsystem->LoadDataAsync(PlayerStatsTag, OnComplete, OnFailed);
}
void AYourActor::OnDataLoadComplete(UObject* LoadedObject)
{
if (UDataTable* DataTable = Cast<UDataTable>(LoadedObject))
{
UE_LOG(LogTemp, Log, TEXT("Async load completed: %s"), *DataTable->GetName());
}
}
void AYourActor::OnDataLoadFailed()
{
UE_LOG(LogTemp, Warning, TEXT("Failed to load data"));
}
template<typename T>
T* LoadDataOfType(const FGameplayTag& DataTag)
{
if (DataConfigSubsystem)
{
return Cast<T>(DataConfigSubsystem->GetDataSync(DataTag));
}
return nullptr;
}
if (UDataTable* MyTable = LoadDataOfType<UDataTable>(FGameplayTag::RequestGameplayTag("Config.Items")))
{
// Work with strongly typed data table
}
- Data Map - Core mapping of GameplayTags to asset references
- Class Filters - Restricts which asset types can be added
- Validation Settings - Controls automatic asset validation behavior
The system includes comprehensive validation:
- Strict Validation - Automatically validates assets against class filters
- Auto Remove Invalid Assets - Cleans up invalid entries automatically
- Verbose Logging - Detailed validation logs for debugging
// Synchronous loading
UFUNCTION(BlueprintCallable, Category="Data Config")
UObject* GetDataSync(FGameplayTag DataTag);
// Asynchronous loading
UFUNCTION(BlueprintCallable, Category="Data Config")
void LoadDataAsync(FGameplayTag DataTag, FOnDataLoadComplete OnComplete, FOnDataLoadFailed OnFailed);
// Utility functions
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Data Config")
bool HasDataForTag(FGameplayTag DataTag) const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Data Config")
UClass* GetExpectedClassForTag(FGameplayTag DataTag) const;
// Asset management
UFUNCTION(BlueprintCallable, BlueprintPure, Category="Data Configuration")
const TMap<FGameplayTag, TSoftObjectPtr<UObject>>& GetData() const;
UFUNCTION(BlueprintCallable, Category="Data Configuration")
UObject* LoadObjectForTag(FGameplayTag DataTag) const;
// Validation (Editor only)
UFUNCTION(Category="Data Configuration")
void ValidateAllAssets();
UFUNCTION(Category="Data Configuration")
void ClearInvalidAssets();
We welcome contributions! Please see our contributing guidelines:
- Fork the repository
- Create a feature branch
- Make your changes with appropriate tests
- Submit a pull request
- Stalker7274 (Roma) — Subsystem & asset loading architecture
- PsinaDev (Kim) — Blueprint nodes & Developer Settings integration
This project is licensed under the MIT License - see the LICENSE file for details.
For issues, feature requests, and support:
- GitHub Issues: DataConfigSystem Issues