Quick answer: Once a child Blueprint sets a variable to anything (even briefly), Unreal stores it as an override and stops inheriting from the parent. To re-inherit, click the yellow Reset to Default arrow next to the variable in Class Defaults. For C++ UPROPERTY changes, reload the Blueprint asset to pick up new native defaults.
Here is how to fix Unreal Blueprint child class variables that stay locked at an old default value, no matter what you change in the parent. You update BaseEnemy.HealthMax from 100 to 150, save, recompile, but every existing child blueprint (Goblin, Skeleton, Wolf) still shows 100. The fix involves understanding that Blueprint inheritance copies defaults at save time, and any local override permanently breaks the link.
The Symptom
You change a default value in a parent Blueprint or in a C++ UPROPERTY. Save, recompile. Open a child class — the value is unchanged. Spawn an instance — instances also use the old value. New child Blueprints created after the parent change pick up the new default; only existing children are stuck.
What Causes This
Override snapshot. When you set a variable on a child Blueprint, Unreal stores that value as an override in the child’s class defaults. From that point on, the parent’s default is no longer inherited — the local value wins.
Accidental override during editing. Even briefly setting a value (then changing your mind) can establish an override. The yellow arrow in the Details panel appears whenever an override is present.
C++ default reload required. When you change a UPROPERTY default in C++, the Blueprint must be reloaded to recapture the native default. Hot reload alone does not always reload Blueprint assets.
Reparent kept old class defaults. If you reparent a Blueprint to a different parent class, defaults that existed in the old parent may persist as overrides in the child even if the new parent has different defaults.
The Fix
Step 1: Reset the override on the child Blueprint. Open the child Blueprint, go to Class Defaults, find the variable. If a yellow circular arrow appears next to it, an override is in place. Click the arrow to clear it — the variable now inherits from the parent.
Step 2: Bulk-reset across many child Blueprints. If you have dozens of children with overrides, write a small editor utility:
// EditorUtility Blueprint or Python script
import unreal
def reset_var(asset_path, var_name):
asset = unreal.load_asset(asset_path)
cdo = unreal.get_class_default_object(asset.generated_class())
parent_cdo = unreal.get_class_default_object(asset.generated_class().get_super_class())
parent_value = unreal.get_editor_property(parent_cdo, var_name)
unreal.set_editor_property(cdo, var_name, parent_value)
unreal.EditorAssetLibrary.save_asset(asset_path)
Step 3: Reload Blueprints after C++ changes. When updating native UPROPERTY defaults, after recompile right-click each affected Blueprint in the Content Browser and choose Asset Actions → Reload. This refreshes the snapshot of inherited C++ defaults.
Step 4: Avoid editing values you do not intend to override. The Class Defaults panel is wider than most monitors and accidental click-drag on a number field can establish an override. If you accidentally do so, immediately click the reset arrow.
Step 5: For runtime defaults, use Initialize functions.
// Override-resistant pattern: set defaults in BeginPlay, not as variable defaults
void ABaseEnemy::BeginPlay()
{
Super::BeginPlay();
if (HealthMax <= 0)
{
HealthMax = GetGlobalDefaultHealth(); // Pulls from data table or config
}
HealthCurrent = HealthMax;
}
Why Inheritance Works This Way
Blueprint defaults are serialized into the asset. Without snapshot semantics, a downstream change to a parent default could silently change the behavior of every child — sometimes desirable, sometimes catastrophic. The override system gives designers explicit control: once you set a value, it stays set.
The downside is the reset workflow when you do want propagation. The yellow arrow is the lever; learning to glance at it before assuming inheritance saves hours of confused debugging.
“The yellow arrow is truth. If it is there, the parent default is being ignored. Click it to re-inherit.”
Related Issues
For Niagara rendering issues, see Niagara Not Rendering in PIE. For procedural mesh issues, see Procedural Mesh Collision.
Hover the variable. See the yellow arrow. Click. Inherit again.