PropFlow Catalyst is a Unreal Engine plugin that facilitates the bulk configuration of assets based on the assetisation of the configuration process.
- Rule-Driven Attribute Batch Modification: Modify multiple attributes in bulk using predefined rule templates, eliminating manual repetition.
- Configuration Pipeline Assetization: Save complete configuration workflows as version-controlled, shareable assets.
- Modular Configuration Design: Split large configuration tables into independent modules to reduce maintenance complexity.
-
Download the Plugin
- Clone this repository:
https://github.com/ZarzaNg/AruEditorUtilities.git
- Or download as a ZIP and extract it.
- Clone this repository:
-
Install to Your Project
- Copy the entire plugin folder to your project's
Plugins/directory:YourProject/ └── Plugins/ └── # Paste the downloaded plugin here
- Copy the entire plugin folder to your project's
-
Enable the Plugin
-
Access Asset Actions
-
Choose Operation Mode
-
🔥 Quick Operation
-
📁 Preset DataAsset Workflow
-
-
Modular Configuration
- Start with Quick Operation for single-batch tasks
- Use DataAsset presets for recurring complex workflows
- Always verify filter conditions before execution, a condition like "PropertyName=MyFloat" will include all the properties named "MyFloat" in different scopes.
- Use version control diff tools to inspect modifications.
Create a custom filter by inheriting FAruFilter and implementing the condition check logic:
USTRUCT()
struct FMyCustomFilter : public FAruFilter
{
GENERATED_BODY()
public:
virtual ~FMyCustomFilter() override {};
virtual bool IsConditionMet(const FProperty* InProperty, const void* InValue) const override
{
// Your custom condition check logic here
// InProperty: Metadata of the current property
// InValue: Memory address of the property value
// Example: Check if property name contains "Health"
return InProperty->GetName().Contains(TEXT("Health"));
}
};Create a custom operation by inheriting FAruPredicate and implementing the execution logic:
USTRUCT()
struct FMyCustomAction : public FAruPredicate
{
GENERATED_BODY()
public:
virtual ~FMyCustomAction() override {};
virtual bool Execute(const FProperty* InProperty, void* InValue) const override
{
// Example: Double integer properties
if (FIntProperty* IntProp = CastField<FIntProperty>(InProperty))
{
int32 Value = IntProp->GetPropertyValue(InValue);
IntProp->SetPropertyValue(InValue, Value * 2);
// Return true if the operation is successful.
return true;
}
return false;
}
};This plugin provides AssetCollector/ capabilities to organize and validate assets using maintained tag objects.
-
Key Types
UAruAssetCollector(Source/AruEditorUtilities/Public/AssetCollector/AruAssetCollector.h)Collect(): Implement in Blueprint to populate internalAruAssetObjects.Get(): Retrieve all collected asset objects.ClearAssets(): Clear current collection results.AddInstance(UObject* SourceObject, const TArray<FName>& Tags): Create and append aUAruAssetObjectwith object and tags.
UAruAssetObject(Source/AruEditorUtilities/Public/AssetObject/AruAssetObject.h)- Maintains
ReferencedObject,AssetName, andAssetTags(TArray<FName>). - Exposes
AddAssetTag()andGetAssetTags()to manage and read tags.
- Maintains
-
Recommendations
- Use
UAruAssetCollector::AddInstance()to attach business-relevant tags during collection (e.g.,NeedsLOD,HasGameplayTag,MaterialVariantA). - Before actions/validations, read
UAruAssetObject::GetAssetTags()to perform include/require/mutually-exclusive checks and decide whether to proceed. - Combine with
ActionTags/ValidationTags(if used in your configs) to scope definitions by category.
- Use
-
Blueprint Flow (Conceptual)
- Derive from
UAruAssetCollectorand implementCollect():- Iterate assets (Content Browser query or custom source).
- For each match, call
AddInstance(Object, Tags)to create and store aUAruAssetObject. - Later, inspect
Get()results and evaluate tags to decide which action sets to run.
- Derive from
The collector maintains a pool of
UAruAssetObject, each carrying the sourceUObjectand a set ofFNametags. Build your checks around these tags to gate subsequent actions/validations.
We expanded proxy coverage so filters can perform Blueprint-defined checks across many value types without C++ changes.
-
Key Types and Locations
FAruFilter_Proxy/FAruFilter_BlueprintProxy(Source/AruEditorUtilities/Public/AssetFilters/AruFilter_Proxy.h)UAruFilterProxy(Blueprint-implementable proxy)
-
Overridable check entries (
UAruFilterProxy)CheckBoolValue(bool)CheckIntValue(int32)CheckFloatValue(float)CheckStringValue(const FString&)CheckTextValue(const FText&)CheckObjectValue(const UObject*)CheckNameValue(const FName&)CheckInstancedStructValue(const FInstancedStruct&)CheckGameplayTagValue(const FGameplayTag&)CheckGameplayTagContainerValue(const FGameplayTagContainer&)CheckEnumValue(int32, const UEnum*)
-
Usage
- Create a Blueprint class derived from
UAruFilterProxyand implement theCheck*functions you need (others can remain default). - In configs, use
FAruFilter_BlueprintProxy, setProxyClass, or provide an instancedProxyInstance. - At runtime, the filter routes to the appropriate
Check*entry based on the property type.
- Create a Blueprint class derived from
-
Working with tag checks
- If your
UAruAssetCollectorpopulated tags for filtering, incorporate that context inside your proxy checks to decide condition matches.
- If your
The proxy-based filter allows Blueprint-defined checks for various value kinds (bool, int, float, string, text, object, name, struct, GameplayTag(s), enum), making it easy to extend without C++ changes.
-
Key Types and Locations
FAruPredicate_Proxy/FAruPredicate_BlueprintProxy(Source/AruEditorUtilities/Public/AssetPredicates/AruPredicate_Proxy.h)UAruPredicateProxy(Blueprint-implementable proxy)
-
Overridable processing entries (
UAruPredicateProxy)ProcessBoolValue(bool)ProcessIntValue(int32)ProcessFloatValue(float)ProcessStringValue(const FString&)ProcessTextValue(const FText&)ProcessObjectValue(const UObject*)ProcessNameValue(const FName&)ProcessStructValue(const FInstancedStruct&)ProcessInstancedStructValue(const FInstancedStruct&)ProcessGameplayTagValue(const FGameplayTag&)ProcessGameplayTagContainerValue(const FGameplayTagContainer&)ProcessEnumValue(int64, const UEnum*)
-
Usage
- Create a Blueprint class derived from
UAruPredicateProxyand implement the relevantProcess*entries to transform/write back values. - In configs, use
FAruPredicate_BlueprintProxy, setProxyClass, or provide an instancedProxyInstance. - At runtime, the predicate chooses the appropriate
Process*entry based on property type and writes the returned value back.
- Create a Blueprint class derived from
Predicate proxy lets you transform target values in Blueprint per type, then write them back during execution.




