UE5.6 マテリアルペアレントを複製したものに差し替え
code:python
import unreal
def duplicate_and_replace_parent_material():
# -------------------------------------------------------------
# 【設定項目】保存先フォルダとサフィックスをここで指定してください
# -------------------------------------------------------------
TARGET_FOLDER = "/Game/DuplicatedMaterials" # 例: Content/DuplicatedMaterials
SUFFIX = "_Copied"
# Unrealクラスのロード
editor_utility = unreal.EditorUtilityLibrary()
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
editor_asset_subsystem = unreal.get_editor_subsystem(unreal.EditorAssetSubsystem)
# コンテンツブラウザで現在選択されているアセットを取得
selected_assets = editor_utility.get_selected_assets()
if not selected_assets:
unreal.log_warning("コンテンツブラウザでアセットが選択されていません。")
return
# 指定フォルダが存在しない場合は作成
if not editor_asset_subsystem.does_directory_exist(TARGET_FOLDER):
editor_asset_subsystem.make_directory(TARGET_FOLDER)
for asset in selected_assets:
# マテリアルインスタンス(Constant)かどうかをチェック
if not isinstance(asset, unreal.MaterialInstanceConstant):
unreal.log(f"スキップ: {asset.get_name()} はマテリアルインスタンスではありません。")
continue
# 1. 親マテリアル(Parent)の取得(プロパティから直接取得)
parent_material = asset.get_editor_property("parent")
if not parent_material:
unreal.log_warning(f"{asset.get_name()} に親マテリアルが設定されていません。")
continue
parent_name = parent_material.get_name()
new_material_name = f"{parent_name}{SUFFIX}"
new_material_path = f"{TARGET_FOLDER}/{new_material_name}"
target_parent = None
# 2. 既に指定場所に複製されたマテリアルが存在するか確認
if editor_asset_subsystem.does_asset_exist(new_material_path):
unreal.log(f"既存のアセットを発見: {new_material_path} を流用します。")
target_parent = editor_asset_subsystem.load_asset(new_material_path)
else:
# 存在しない場合は複製
unreal.log(f"マテリアルを複製中: {parent_material.get_path_name()} -> {new_material_path}")
duplicated_asset = asset_tools.duplicate_asset(new_material_name, TARGET_FOLDER, parent_material)
if duplicated_asset:
target_parent = duplicated_asset
else:
unreal.log_error(f"マテリアルの複製に失敗しました: {new_material_name}")
continue
# 3. 選択していたマテリアルインスタンスの親を差し替え
if target_parent:
asset.set_editor_property("parent", target_parent)
# アセットの保存と変更の確定
editor_asset_subsystem.save_asset(asset.get_path_name())
unreal.log(f"成功: {asset.get_name()} の親マテリアルを {target_parent.get_name()} に変更しました。")
# スクリプトの実行
duplicate_and_replace_parent_material()