BlueprintImplementableEvent doesn't get called in PostEditChangeProperty

Hi,

As the title says, whenever I call my event function inside of PostEditChangeProperty (or another function called by it) the event doesn’t get triggered in blueprint.

I’ve debugged through my code and see that when changing a property the code executes the call, LOGs just fine but the blueprint event doesn’t fire. Same behaviour happens when using BlueprintNativeEvent.

Firing the event from OnConstruction works just fine though.


UFUNCTION(BlueprintImplementableEvent, Category = "Level Generator")
void BuildLevel();

void ALevelGenerator::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
    BuildLevel();
    Super::PostEditChangeProperty(PropertyChangedEvent);
}

void ALevelGenerator::OnConstruction(const FTransform &Transform)
{
    Super::OnConstruction(Transform);
    BuildLevel();
}

Hey Cafeoh-

I tried created an Actor class with a BlueprintImplementableEvent called on PostEditChangeProperty. The function was called when a blueprint of my class was added to the viewport / compiled as expected. If possible, could you provide additional setup details or a small sample project that reproduces the issue you’re seeing?

This is an old issue, but it seems to still be a issue that I just ran into. I had the same code as Cafeoh and also didn’t see the BP event execute when changing properites.

I think what Cafeoh did (and what I did) was to change the properties for an instantiated(spawned) object in the editor. When I later changed properties on the base BP class, the event executed. Multiple times, actually, even when just changing the properties once. However, that is not what I want.

I saw a suggestion to use this:

if (!IsTemplate())
{
	OnPropertyChangedEvent();
}

But it doesn’t work either. The weird part is that it seems like the base BP class is turned into a temporary instantiated object, and then deleted again.

 LogBlueprintUserMessages:  [BP_GridManager_C_0] Hello
 LogBlueprintUserMessages:  [BP_GridManager_C_1] Hello
 LogBlueprintUserMessages:  [BP_GridManager_C_0] Hello
 LogBlueprintUserMessages:  [BP_GridManager_C_2] Hello

That is what shows up in the log if I change the base class without any true spawned instances of GridManager in the scene.

So I have no clue how to have a spawned GridManager update itself when changing its properties in the editor.

Not sure why they did this, no events will fire while “in editor” e.g. during PostEditChangeProperty (but not OnConstruction for some reason). You can override by adding this before you call the event:

TGuardValue<bool> AutoRestore(GAllowActorScriptExecutionInEditor, true)