Change Parent Material of Multiple Material Instances at Once

Is there a way to change the parent material of multiple material instance all at once? For example, I have 50 material instances and I want them to all have the same parent material.

I have tried scripting it with a blueprint but havent had any luck.

Thanks

3 Likes

In python itā€™s pretty simple:

import unreal as ue

editor_util = ue.EditorUtilityLibrary()
editor_asset_lib = ue.EditorAssetLibrary()
material_lib = ue.MaterialEditingLibrary()

def SetParentMaterial():
    default_material_path = "Material'/Game/Props/Reparent.Reparent'"
    materialToReparent = editor_asset_lib.load_asset(default_material_path)

    selected_assets = editor_util.get_selected_assets()
    for asset in selected_assets:
        material_lib.set_material_instance_parent(asset, materialToReparent)
        editor_asset_lib.save_loaded_asset(asset,False)

SetParentMaterial()

Be careful: this doesnā€™t have any check inside it, be sure to select the correct materials and the correct parent path!
Always try with a single asset before running a batch!

4 Likes

hey, I also tried this method and unreal is keep crashing :frowning:

Did you setup python scripting correctly?
It could be tricky if you are using it for the first time.
What error are you getting with the crash?


hereā€™s my crash, and I have no idea :frowning:
engine version is 4.27

Did you set the correct path in ā€œdefault_material_pathā€ (it has to be the parent material path).
Are you selecting the materials instances to reparent when launching the python script?
That error really doesnā€™t ring me any bell, Iā€™d make a plugin in C++ and share it with you but right now Iā€™m pretty busy, sorry

1 Like

In the future its best for you to create like this:
-M_MasterMaterial
ā€“MI_MasterInstance
ā€”MI_ChildInstance

That way, you can change the parent on the MI_MasterInstance and cascade down for every other object.

2 Likes

Thanks for searching the answer together :joy: I also made this python code into blueprint, but it also occurred crash :frowning: maybe engine is the problemā€¦

I made you a plugin, it works for me (I hope it does for you too):


MaterialReparenterAutosave.zip (509.5 KB) (Faster)
Automatically saves the materials after replacing the parent

MaterialReparenterUndo.zip (509.0 KB) (Safer)
Mark the assets as modified (and you can undo the operation with CTRL+Z), you need to save them manually to make the edit permanent.

3 Likes

OMG Thanks for the plugin!!
Btw, did you use ā€˜SetParentInternalā€™ c++ function for this plugin?
I really want to know what caused the crash, and if you share c++ code for me, it would be also greatfulā€¦ :smile:

1 Like

I made it with blueprints only, you can open the AssetActionUtility BP in the plugin folder!

The python code was working for me but, as I said, there were no ā€œchecksā€, casting in python is not the same as BP or C++.

I thought it wasnā€™t possible to achieve this with BP only, otherwise I wouldnā€™t have wasted both mine and your time :sweat_smile:

Please donā€™t forget to mark the post as solution!

Yeah! I checked the BP you gave to me :smile:
The reason why crash occured was because I did not access to material directly, but access it via static mesh actor. Not 100% sure, but the BP you made didnā€™t occur the crash.

Iā€™m sorry that I did not post the original question, so I cannot mark the solutionā€¦ :frowning: :sob:

Truly thank u for solving the problem, thanks for spending your precious time for me, you made my day

1 Like

Remember, if thereā€™s the word ā€œactorā€ it means that they are placed in world, if you have to access assets in editor you need to cast ā€œselected assetā€ to its specific class and then use the function that you need (in this case to replace the parent)

Oh, Iā€™m sorry, I didnā€™t notice it.
Donā€™t worry, I flagged the post and a mod has already marked it for you!

You are very welcome, Iā€™m happy that it worked and I shared it because I think it could be useful to other useful to other users in the future (because this is an issue that could occur very easily).
Thatā€™s why imho itā€™s important to ā€œmark a thread as solvedā€, when Iā€™m looking for a solution I try to avoid posts that donā€™t have one (sometimes they can point you the right direction where to look but you have to find a way by yourself!)

Have a nice day!
If you are interested in editor scripting, I took a useful course that I would recommend that covers C++, BP and Python!

1 Like

Nice Solution!

A very handy plugin, thank you so much Ares9323!

1 Like

Has anyone gotten the plugin from @Ares9323 to work with material instances/interfaces as the parent? Nearly every time I try it with those my editor crashes.

Which engine version are you using?
Have you tried using it with few instances at a time? (There could be an issue with some material in particular that may cause your crashes)

Of course now when I try to reproduce it, it works fine. :man_shrugging: Iā€™m using 5.1.1 at the moment.

1 Like

I have found that, if I have the asset loaded in the editor and I try to change its parent, UE crashes.

I first have to remove the asset from the editor and then change its parent.

1 Like

Thatā€™s good to know, but knowing Unreal I would have expected something similar :sweat_smile:

Probably, thereā€™s a way to automatically close windows of instances before doing the replace but I didnā€™t think about that when I posted it (because it was a simple script made to help the OP).

Itā€™s always better to close editor windows when you are renaming/moving/replacing stuff (and donā€™t forget to use ā€œFix Up Redirectorsā€ after moving files, especially if they have references and youā€™re using source control)

1 Like