在UE4中打开Python开发插件

1.打开插件管理器 Edit - Plugins

s001.jpg

2.在搜索框搜索python,把它们勾选激活,这个时候应该会提示重启UE4

s002.jpg

3.重启UE4后,打开 Edit - Project Settings
在左侧栏的Plugins中找到Python,右边窗口勾选 Developer Mode
开启开发者模式。

s004.jpg

Startup Scripts这一栏是每次打开UE4自启动脚本,可以点后面的+号添加多个脚本。

s005.jpg

Additional Path这一栏是添加一些需要在UE4环境中调用的脚本,类似与添加sys.path环境。

s006.jpg

记得要使它们生效,都要重启UE4

4.测试调用加载到UE4环境中的py模块
可以在你的Additional Path里,添加一个someFunction.py的文件。
文件里写一个简单的函数:

def add(x, y):
  print x+y

打开Output Log窗口

s007.jpg

将输入栏的cmd切换为Python
逐行输入:
import someFunction as sf
sf.add(8, 9)
可以看到输出的结果,这就说明python在UE4里运行成功了。

s008.jpg

用Python导入元素

可以参考官方文档:
https://docs.unrealengine.com/en-US/PythonAPI/class/AssetImportTask.html

这里给出一个示例代码供参考

import unreal

# 声明需要导入的资源路径
image_path = '/Users/Shared/UE4_test/d-1.jpg'
fbx_path = '/Users/Shared/UE4_test/test_object.fbx'

# 这个函数是创建导入资源的任务
def buildImportTask(filename, destination_path, options=None):
  task = unreal.AssetImportTask()
  task.set_editor_property('automated', True)
  task.set_editor_property('destination_name', '')
  task.set_editor_property('destination_path', destination_path)
  task.set_editor_property('filename', filename)
  task.set_editor_property('replace_existing', True)
  task.set_editor_property('save', True)
  if options:
    task.set_editor_property('options', options)
  return task

# 这个函数为执行导入函数的任务
def executeImportTasks(tasks):
  unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks(tasks)
  for task in tasks:
    for path in task.get_editor_property('imported_object_paths'):
      print 'Imported: {0}'.format(path)

# 这个函数是导入的参数设定,也可以不指定参数,则为默认值
# 关于参数的释义,可以在这里查看
# https://docs.unrealengine.com/en-US/PythonAPI/class/FbxImportUI.html
def buildStaticMeshImportOptions():
  options = unreal.FbxImportUI()

  options.set_editor_property('import_mesh', True)
  options.set_editor_property('import_textures', False)
  options.set_editor_property('import_materials', True)
  options.set_editor_property('import_as_skeletal', False)

  options.static_mesh_import_data.set_editor_property('import_translation', unreal.Vector(50.0, 0.0, 0.0))
  options.static_mesh_import_data.set_editor_property('import_rotation', unreal.Rotator(0.0, 110.0, 0.0))
  options.static_mesh_import_data.set_editor_property('import_uniform_scale', 1.0)

  options.static_mesh_import_data.set_editor_property('combine_meshes', True)
  options.static_mesh_import_data.set_editor_property('generate_lightmap_u_vs', True)
  options.static_mesh_import_data.set_editor_property('auto_generate_collision', True)

  return options

# 调用上面声明的函数 进行导入操作
def importAssets():
  image_task = buildImportTask(image_path, '/Game/Textures')
  fbx_task = buildImportTask(fbx_path, '/Game/fbx', options=buildStaticMeshImportOptions())
  executeImportTasks([image_task, fbx_task])

将上述的代码存储到UE4 python的环境路径中
python的环境路径上面有讲过,在这个地方
文件名我存储为 /Users/Shared/UE4_test/testAssetImport.py

s011.jpg

在output log窗口运行它(shift+enter是换行)

s009.jpg

执行完成后,现在可以看到内容浏览窗口下,已经导入的资源了。

s010.jpg

用Python保存资源

指定资源路径,进行保存

def saveAsset(path='', force_save=True):
  retuen unreal.EditorAssetLibrary.save_asset(asset_to_save=path,
                                              only_if_is_dirty=not force_save)

保存整个资源目录

# 参数recursive是 是否递归保存路径下的子目录

def saveDirectory(path='', force_save=True, recursive=True):
  return unreal.EditorAssetLibray.save_directory(directory_path=path,
                                                 only_if_is_dirty=not force_save,
                                                 recursive=recursive)

获取所有修改后未保存的资源

def getAllDirtyPackages():
  packages = []
  for x in unreal.EditorLoadingAndSavingUtils.get_dirty_content_packages():
    packages.append(x)
  for x in unreal.EditorLoadingAndSavingUtils.get_dirty_map_packages():
    packages.append(x)
  return packages

保存所有修改后未保存的资源

# show_dialog参数是是否显示提示对话框

def saveAllDirtyPackages(show_dialog=False):
  if show_dialog:
    return unreal.EditorLoadingAndSavingUtils.save_dirty_packages_with_dialog(save_map_packages=True,
                                                                              save_content_packages=True)
  else:
    return unreal.EditorLoadingAndSavingUtils.save_dirty_packages(save_map_packages=True,
                                                                  save_content_packages=True)

保存指定列表内多个资源

# save_packages方法里有个only_dirty的参数
# 如果为True的话,表明如果是修改后未保存的资源才会进行保存

def savePackages(packages=[], show_dialog=False):
  if show_dialog:
    return unreal.EditorLoadingAndSavingUtils.save_packages_with_dialog(packages_to_save=packages,
                                                                        only_diry=False)
  else:
    return unreal.EditorLoadingAndSavingUtils.save_packages(packages_to_save=packages,
                                                            only_dirty=False)

更多的可以查看帮助文档:
https://docs.unrealengine.com/en-US/PythonAPI/class/EditorLoadingAndSavingUtils.html


From zero to hero