UE4エディタでpythonを使って参照しているアセットをコピーする


UE4で拡張のPakを作るためにあるアセットが参照しているアセットを全て取ってきたかったのでpythonスクリプトでやってみました。

アセットを選択しておいて[File] > [Execute Python Script]実行でスクリプトで指定したフォルダに参照しているアセットを全てコピーします。
スクリプトではまだ未対応ですが可能であれば参照の置き換えもしたいです。
※ UE4.26.2を利用しています。
※ Python Editor Script PluginとEditorScritpting Utilities Pluginの有効化が必要です。

import unreal
from copy import copy

# 引数のアセットの依存するアセットをすべて取得
def get_list_dependencies(asset_data):
  asset_package_name = asset_data.get_editor_property('package_name')
  option = unreal.AssetRegistryDependencyOptions()
  dependencies = unreal.AssetRegistryHelpers.get_asset_registry().get_dependencies(asset_package_name, option)
  list = set()
  if dependencies:
    for dependency in dependencies:
      try:
        dependency_asset = unreal.EditorAssetLibrary.find_asset_data(dependency)
      except:
        continue

      list.add(unreal.StringLibrary.conv_name_to_string(dependency))
      dep_list = get_list_dependencies(dependency_asset)
      for dep in dep_list:
        list.add(unreal.StringLibrary.conv_name_to_string(dep))

  return list

# 選択されているアセットを取得   
utility_base = unreal.GlobalEditorUtilityBase.get_default_object()
asset_list = unreal.EditorUtilityLibrary.get_selected_asset_data()

# 選択されていなければ終了
if len(asset_list) <= 0:
  exit()

# とりあえず1つだけ処理
target = asset_list[0]

# 依存するアセットと選択されたアセットを取得
sources = get_list_dependencies(target)
target_package_name = target.get_editor_property('package_name')
sources.add(unreal.StringLibrary.conv_name_to_string(target_package_name))
print(sources)

# 取得したアセットを特定のフォルダにフラットにコピー
for source in sources:
  unreal.EditorAssetLibrary.duplicate_asset(source, "/Content/Test/" + source.split("/")[-1])