Getting nested struct value from blueprint variables with python?

I’m attempting something similar to https://forums.unrealengine.com/deve…le-from-python

Basically I want to copy the default values of a blueprint’s struct variable (the defaults of the struct as set in the BP defaults, not the struct definition defaults) so I can use them to change other game settings with a script.

Right now I’m trying to get the nested struct value with



blueprint = unreal.load_object(None, '/Game/Blueprints/XYZGameMode_BP.XYZGameMode_BP_C')
bp_cdo = unreal.get_default_object(blueprint)
print bp_cdo.get_editor_property("LevelData").get_editor_property("NestedValue")


But that fails with [FONT=courier new]Exception: StructBase: Failed to find property.... I can’t seem to get at the internal struct values in any way.

I should note that when I do something like “bp_cdo.get_editor_property(“StringVariable”)” the default value returns just fine.

Is what I’m trying to do possible?

If LevelData is a struct instance then that should work. How is your struct type defined?

User Defined Structs (structs defined as assets) use mangled internal names for properties, and I suspect that it would be impossible to find them from Python as things currently stand, though C++ defined structs should work just fine.

Thanks for the definitive reply, Jamie. In our case they are User Defined, but we could port them to C++ or move the data elsewhere easily :slight_smile:

Did you find a solution to this in python?

The only way worked for me is to extend python with C++.
Make sure the struct type is Blueprintable, by adding macro USTRUCT(Blueprintable). Then in my blueprint function library plugin, I defined my own C++ functions to read and write the user defined struct type variables. And finally I could access the data I wanted with Python back in editor…

Thought I’d elaborate further for anyone googling:

I’m trying to write a python script that modifies the members of a user-created struct.

It seems you cannot accomplish this with blueprint-created structs. Attempting to do so always results in “Failed to find property” error.

However, doing this with C++ is trivial. For instance, say I created the following struct in C++:

USTRUCT(BlueprintType)
struct FItemTest
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float FloatTest;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString StringTest;
	
};

I add this struct to a blueprint class. Now, to modify the default value of the struct, I run the following python script:

import unreal
bp_object = unreal.EditorAssetLibrary.load_blueprint_class('/Game/ProjectName/Characters/NPC_Test')
bp_default_object = unreal.get_default_object(bp_object)
bp_default_object.get_editor_property("ItemTest").set_editor_property("FloatTest", 1)

This successfully modifies the “FloatTest” struct member and sets the value to 1.

Can this access any property of any type by name within any number of struct layers? I am looking for a version of Set Editor Property from Kismet that… well… actually works. Apparently the original devs of Kismet never heard of structs.