マテリアルスロットに同名のマテリアルを割り当てる

スタティックメッシュのマテリアルスロット名と同じ名前のマテリアルを割り当てていく。

コンテンツブラウザのアセット

#
# コンテンツブラウザで選択しているスタティックメッシュアセットのマテリアルスロットに
# スロット名と同じ名前のマテリアルを割り当てる
#
import unreal

# StaticMeshクラスからマテリアルスロット名を取得する関数
def get_material_slot_names(static_mesh):
    # StaticMeshComponentクラスを生成する
    staticMeshComponent = unreal.StaticMeshComponent()
    # StaticMeshをコンポーネントに割り当てる
    staticMeshComponent.set_static_mesh(static_mesh)
    # StaticMeshComponentからget_material_slot_names()関数を呼び出す
    return unreal.StaticMeshComponent.get_material_slot_names(staticMeshComponent)

# コンテントブラウザから選択しているアセットを取得する
utilityBase = unreal.GlobalEditorUtilityBase.get_default_object()
assetList = utilityBase.get_selected_assets()

if len(assetList) > 0:
    for asset in assetList:
        # アセットがスタティックメッシュか確認する
        if(asset.get_class().get_name() == 'StaticMesh'):
            
            # 関数を使ってスロット名を取得する
            slot_names = get_material_slot_names(asset)
            #print(slot_names)

            # アセットのパスを調べる
            asset_path = asset.get_path_name()

            # ひとつ上の階層からマテリアルを探す(../Materialsとか)
            asset_path = asset_path.rsplit('/', 3)[0] + '/'

            # split()は左から分割するが、rsplit()は右から分割する。
            # rsplitの2番目の引数は何分割するか、という数字
            # この場合、右から1個目の"/"で分割する
            #/Game/Materials/BlendMaterials/SM_BlendMesh.SM_BlendMesh
            #/Game/Materials/BlendMaterials/

            # アセットパスにあるマテリアルを取得する
            allMaterials = unreal.EditorAssetLibrary.list_assets(asset_path, True, True)

            # スロットごとに該当するマテリアルがあるか調べ、あるなら割り当てる
            for i in range(len(slot_names)):
                flag = 0

                # マテリアルが割り当てられていない、または割り当てられているマテリアル名が違う名前の場合
                if(asset.get_material(i) == None):
                    # 同じマテリアル名を見つけて割り当てる
                    for mat in allMaterials:
                        if str(slot_names[i]) in mat:
                            mat_asset = unreal.EditorAssetLibrary.find_asset_data(mat).get_asset()
                            asset.set_material(i, mat_asset)
                            print("Found and Set Material: " + mat_asset.get_name())
                            flag = 1
                            break
                    if(flag == 0):
                        print("Couldn't find Material: " + str(slot_names[i]))
                elif(asset.get_material(i).get_name() != slot_names[i]):
                    # 同じマテリアル名を見つけて割り当てる
                    for mat in allMaterials:
                        if str(slot_names[i]) in mat:
                            mat_asset = unreal.EditorAssetLibrary.find_asset_data(mat).get_asset()
                            asset.set_material(i, mat_asset)
                            print("Found and Set Material: " + mat_asset.get_name())
                            flag = 1
                            break
                    if(flag == 0):
                        print("Couldn't find Material: " + str(slot_names[i]))

Slotの名称はStaticMeshComponentクラスからしか参照できないので、関数でStaticMeshComponentを生成してStaticMeshクラスを割り当て、そこから呼び出すという処理を加えている。

レベルエディタのマテリアルスロット

レベル上のスタティックメッシュアクターにマテリアルスロットを参照にして同じ名前のマテリアルを割り当てていきます。

import unreal
 
 # レベルエディタ上で選択しているアクターを取得
selectedActors = unreal.EditorLevelLibrary.get_selected_level_actors()
 
if len(selectedActors) > 0:
    # アクターのStaticMeshComponentを取得
    staticMeshComponent = selectedActors[0].get_component_by_class(unreal.StaticMeshComponent)
    
    # StaticMeshComponentからスロット名を取得
    slot_name = staticMeshComponent.get_material_slot_names()
    
    # StaticMeshComponentからStaticMeshクラスを取得
    staticMesh = staticMeshComponent.static_mesh
 
    # StaticMeshのパスを取得(コンテンツブラウザ)
    asset_path = staticMesh.get_path_name()

    # 1階層上のパスを取得する
    asset_path = asset_path.rsplit('/', 2)[0] + '/'
    print (asset_path)
 
    # パス上のマテリアルを取得する
    allMaterials = unreal.EditorAssetLibrary.list_assets(asset_path, True, True)
 
    for i in range(staticMesh.get_num_sections(0)):
        for mat in allMaterials:
            if str(slot_name[i]) in mat:
                # マテリアルクラスを取得する
                asset = unreal.EditorAssetLibrary.find_asset_data(mat).get_asset()
                
                # マテリアルを割り当てる
                staticMesh.set_material(i, asset)
                break
タイトルとURLをコピーしました