Unreal 5.1 python edit blueprint components

Hello!

I’m trying to make a python script to attach Static Mesh Components to a Skeletal Mesh Component inside a Blueprint Class.

This is what I want:
image

image

With this code I can create the same structure:

#---create_bluprint_actor---#

factory = unreal.BlueprintFactory()
factory.set_editor_property("ParentClass", unreal.Actor)

# make the blueprint
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
bp_actor = asset_tools.create_asset(blueprint_name, asset_path, None, factory)

unreal.EditorAssetLibrary.save_loaded_asset( bp_actor )

# get the root data handle
subsystem = unreal.get_engine_subsystem(unreal.SubobjectDataSubsystem)
root_data_handle = subsystem.k2_gather_subobject_data_for_blueprint(bp_actor)[0]

skeletalmesh = unreal.SkeletalMeshComponent 

#add new component
sub_handle, fail_reson = subsystem.add_new_subobject(
            params=unreal.AddNewSubobjectParams(
                parent_handle=root_data_handle,
                new_class=skeletalmesh,
                blueprint_context=bp_actor))
#rename
subsystem.rename_subobject(handle=sub_handle, new_name=unreal.Text("skeleton"))


root_data_handle = subsystem.k2_gather_subobject_data_for_blueprint(bp_actor)[2]

for x in range(1,7,1):
	
	staticmesh = unreal.StaticMeshComponent

	#add new component
	sub_handle, fail_reson = subsystem.add_new_subobject(
	            params=unreal.AddNewSubobjectParams(
	                parent_handle=root_data_handle,
	                new_class=staticmesh,
	                blueprint_context=bp_actor))
	#rename
	subsystem.rename_subobject(handle=sub_handle, new_name=unreal.Text( "piece" + str(x) ))

But how do I change the properties of each Component?

For the skeleton I need to set the Skeletal Mesh Asset to a custom skeletal mesh in the content browser, and for the pieces I need to set the Static Mesh slot to a unreal.load_asset( “mypiece” ) and set the Parent Socket to the bone I want to parent it to.

Any help would be highly appreciated!

Update:

I’ve figured out almost everything by reading this amazing tutorial:

All thats left is to set the “Parent Socket”, does anyone know how to do that?
I want to set it to one of the bones, for example “piece0”.

Hey Havard,
Nice work on script.
I have some idea of doing a similar thing in unreal 4.27.
I am wanting to have a python script that basically going over a list of blueprint assets in content browser and with each blueprint I want check whether if the static mesh component is has a mesh or not.
Any help would be much appreciated!

Hi Tracera

It’s a bit out of topic to this tread but I can try to help, dont know if this works in unreal 4.27, tested it in 5.1. This loops trough all the components inside a blueprint and checks if it has a “static_mesh” assigned.

import unreal

bp_asset = unreal.load_asset( '/Game/BP_myblueprint' )

subsystem: unreal.SubobjectDataSubsystem = unreal.get_engine_subsystem(unreal.SubobjectDataSubsystem)
root_data_handle: unreal.SubobjectDataHandle = subsystem.k2_gather_subobject_data_for_blueprint(context=bp_asset)

objects = []
#get components in blueprint
for handle in root_data_handle:
	subobject = subsystem.k2_find_subobject_data_from_handle( handle )
	objects.append( unreal.SubobjectDataBlueprintFunctionLibrary.get_object( subobject ) )

#remove duplicates
objects = list(dict.fromkeys(objects))

#check if StaticMeshComponent and check the static_mesh parameter
for object in objects:
	if "StaticMeshComponent" in str(object):
		static_mesh = object.get_editor_property("static_mesh")

		if str(static_mesh) == "None":
			print( "StaticMeshComponent: " + str(object) + " has no static_mesh" )
1 Like

Thanks Havard! That’s awesome and I have tested in Unreal 5 and it works perfectly. But not so much in 4.27. Will keep looking for other method of doing it!

1 Like

Hey, nice work. Do you know if there is any way to access the editor graph and its nodes from a blueprint?

I think we are still missing how to attach a blueprint component to a mesh socket inside of a blueprint.

Has anyone figured this out? I like Håvard_stardust am also unable to find how to do this.

Hey Havard,
I’m trying to do the same thing, I have created a new blueprint and a new component, then how do I change the properties of each Component? Have you solved this problem?
Any help would be highly appreciated!

import unreal

def set_static_mesh_for_blueprint(bp, mesh):
    bp_asset = unreal.load_asset(bp.package_name)
    mesh_asset = unreal.load_asset(mesh.package_name)

    subsystem: unreal.SubobjectDataSubsystem = unreal.get_engine_subsystem(unreal.SubobjectDataSubsystem)
    root_data_handle: unreal.SubobjectDataHandle = subsystem.k2_gather_subobject_data_for_blueprint(context=bp_asset)

    objects = []
    #get components in blueprint
    for handle in root_data_handle:
        subobject = subsystem.k2_find_subobject_data_from_handle( handle )
        objects.append( unreal.SubobjectDataBlueprintFunctionLibrary.get_object( subobject ) )


    #check if StaticMeshComponent and check the static_mesh parameter
    for object in objects:
        if "StaticMeshComponent" in str(object):
            static_mesh = object.get_editor_property("static_mesh")
            #print(static_mesh)
            
            if str(static_mesh) == "None":
                print( "StaticMeshComponent: " + str(object) + " has no static_mesh" )
                break

            object.set_editor_property("static_mesh", mesh_asset)

asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
prefabs = asset_registry.get_assets_by_path("/Game/Blueprints/Actors")
meshes = asset_registry.get_assets_by_path("/Game/Meshes/StaticMeshes")


i = 0
for prefab in prefabs:
    set_static_mesh_for_blueprint(prefab, meshes[i])
    i = i + 1

Here’s how I did it.
In my example I made a mass static mesh change script that for each actor it gets the corresponding static mesh from another folder

In particular the line “object.set_editor_property(“static_mesh”, mesh_asset)” is what makes the change