前言

python ue 自动化

本人在工作过程中需要去接入自动化流程,故撰写本篇。

(原生ue-Python真的好难用,悲)

文档

Unreal 5.0 Python API

Unreal 4.27 Python 官方文档

如何在ue中使用python – PingCode

一、启动python插件

你需要在Unreal Engine中启用Python插件。

  1. 打开Unreal Engine编辑器,进入项目。
  2. 选择“编辑”菜单,然后选择“插件”。
  3. 在插件窗口中,搜索“Python”。
  4. 启用“Python Editor Script Plugin”和“Sequencer Scripting”插件。
  5. 重新启动编辑器以使更改生效。

启用Python插件后,你就可以在Unreal Engine中使用Python脚本了。

二、执行pyhon脚本

调成cmd模式

执行

py “O:\GR\GR_Thunk2\Tools\PbDelcare\RefreshVXCommon.py”

三、使用Python API

  1. 操作资产

你可以使用Python API来操作Unreal Engine中的资产,例如导入、导出、重命名资产等。

import unreal

导入资产

asset_tools = unreal.AssetToolsHelpers.get_asset_tools()

import_task = unreal.AssetImportTask()

import_task.filename = “path/to/your/asset.fbx”

import_task.destination_path = “/Game/YourFolder”

import_task.automated = True

asset_tools.import_asset_tasks([import_task])

重命名资产

asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()

asset_registry.rename_assets([(“/Game/YourFolder/OldAssetName”, “/Game/YourFolder/NewAssetName”)])

  1. 创建和修改关卡

你可以使用Python API来创建和修改关卡中的元素,例如添加、删除Actor等。

import unreal

获取当前关卡

world = unreal.EditorLevelLibrary.get_editor_world()

添加一个静态网格体

actor_location = unreal.Vector(0.0, 0.0, 0.0)

actor_rotation = unreal.Rotator(0.0, 0.0, 0.0)

static_mesh_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor, actor_location, actor_rotation)

static_mesh_actor.set_actor_label(“MyStaticMeshActor”)

设置静态网格

static_mesh = unreal.EditorAssetLibrary.load_asset(“/Game/YourStaticMesh”)

static_mesh_actor.static_mesh_component.set_static_mesh(static_mesh)

四、创建自定义工具

你可以使用Python创建自定义工具,以提高工作效率。例如,你可以创建一个自定义工具来批量处理资产或自动化常见任务。

  1. 创建自定义工具窗口

你可以使用Unreal Engine的Slate框架创建自定义工具窗口。

import unreal

class MyCustomTool:

​ def init(self):

​ self.window = None

​ def create_window(self):

​ if self.window is None:

​ self.window = unreal.SWindow()

​ self.window.set_title(“My Custom Tool”)

​ self.window.set_content(self.build_ui())

​ unreal.EditorUtilityLibrary.add_window(self.window)

​ def build_ui(self):

​ vertical_box = unreal.SVerticalBox()

​ button = unreal.SButton()

​ button.set_text(“Click Me”)

​ button.set_on_clicked(self.on_button_clicked)

​ vertical_box.add_child(button)

​ return vertical_box

​ def on_button_clicked(self):

​ unreal.log(“Button clicked!”)

​ return unreal.SButtonReply.handled()

tool = MyCustomTool()

tool.create_window()

  1. 批量处理资产

你可以使用Python脚本来批量处理资产,例如重命名、移动或删除资产。

import unreal

def batch_rename_assets(asset_path, old_name, new_name):

​ asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()

​ assets = asset_registry.get_assets_by_path(asset_path, recursive=True)

​ for asset in assets:

​ if old_name in asset.asset_name:

​ new_asset_name = asset.asset_name.replace(old_name, new_name)

​ new_asset_path = f”{asset.package_path}/{new_asset_name}”

​ unreal.EditorAssetLibrary.rename_asset(asset.object_path, new_asset_path)

batch_rename_assets(“/Game/YourFolder”, “OldName”, “NewName”)

五、Python与蓝图结合

Python脚本可以与Unreal Engine的蓝图系统结合使用,以创建更复杂的功能。

  1. 调用蓝图函数

你可以在Python脚本中调用蓝图中的函数。

import unreal

获取蓝图类

blueprint_class = unreal.EditorAssetLibrary.load_blueprint_class(“/Game/YourBlueprint”)

获取蓝图实例

blueprint_instance = unreal.EditorLevelLibrary.spawn_actor_from_class(blueprint_class, unreal.Vector(0.0, 0.0, 0.0))

调用蓝图函数

unreal.EditorUtilityLibrary.call_function_by_name_with_arguments(blueprint_instance, “YourFunctionName”, [“Argument1”, “Argument2”])

  1. 在蓝图中调用Python函数

你可以在蓝图中调用Python函数,以实现更复杂的功能。首先,你需要创建一个Python函数,并使用unreal模块中的装饰器将其注册为蓝图节点。

import unreal

@unreal.uclass()

class MyPythonFunctionLibrary(unreal.BlueprintFunctionLibrary):

​ @unreal.ufunction(static=True, blueprint_callable=True)

​ def my_python_function(arg1, arg2):

​ unreal.log(f”Arg1: {arg1}, Arg2: {arg2}”)

​ return arg1 + arg2

然后,你可以在蓝图中使用“调用Python函数”节点来调用这个Python函数。

六、自动化工作流程

使用Python脚本自动化工作流程可以显著提高生产力。以下是一些自动化工作流程的示例。

  1. 自动化导入和设置资产

你可以编写Python脚本自动化导入和设置资产的过程。

import unreal

def import_and_setup_assets(asset_folder, destination_path):

​ asset_tools = unreal.AssetToolsHelpers.get_asset_tools()

​ import_task = unreal.AssetImportTask()

​ import_task.filename = asset_folder

​ import_task.destination_path = destination_path

​ import_task.automated = True

​ asset_tools.import_asset_tasks([import_task])

​ asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()

​ assets = asset_registry.get_assets_by_path(destination_path, recursive=True)

​ for asset in assets:

​ # 设置资产属性

​ static_mesh = unreal.EditorAssetLibrary.load_asset(asset.object_path)

​ static_mesh.set_editor_property(“collision_trace_flag”, unreal.CollisionTraceFlag.CTF_USE_COMPLEX_AS_SIMPLE)

import_and_setup_assets(“path/to/your/assets”, “/Game/YourFolder”)

  1. 批量处理关卡

你可以编写Python脚本批量处理关卡,例如批量添加或删除Actor。

import unreal

def batch_add_actor_to_levels(actor_class, levels):

​ for level in levels:

​ world = unreal.EditorLevelLibrary.load_level(level)

​ actor_location = unreal.Vector(0.0, 0.0, 0.0)

​ actor_rotation = unreal.Rotator(0.0, 0.0, 0.0)

​ actor = unreal.EditorLevelLibrary.spawn_actor_from_class(actor_class, actor_location, actor_rotation)

​ actor.set_actor_label(“BatchAddedActor”)

levels = [“/Game/YourLevel1”, “/Game/YourLevel2”]

batch_add_actor_to_levels(unreal.StaticMeshActor, levels)

七、调试和优化Python脚本

调试和优化Python脚本可以帮助你发现并解决问题,提高脚本的性能和稳定性。

  1. 使用日志和断点

你可以使用unreal.log函数打印日志消息,帮助你调试脚本。

import unreal

def example_function():

​ unreal.log(“This is a log message.”)

​ # 断点

​ breakpoint()

example_function()

  1. 优化性能

优化Python脚本的性能可以提高工作效率。例如,你可以使用批量操作来减少API调用次数,或者使用多线程来并行处理任务。

import unreal

import threading

def batch_process_assets(asset_paths):

​ for asset_path in asset_paths:

​ asset = unreal.EditorAssetLibrary.load_asset(asset_path)

​ # 批量处理资产

​ asset.set_editor_property(“some_property”, “new_value”)

def process_assets_in_threads(asset_paths, num_threads=4):

​ chunk_size = len(asset_paths) // num_threads

​ threads = []

​ for i in range(num_threads):

​ start = i * chunk_size

​ end = start + chunk_size if i != num_threads - 1 else len(asset_paths)

​ thread = threading.Thread(target=batch_process_assets, args=(asset_paths[start:end],))

​ threads.append(thread)

​ thread.start()

​ for thread in threads:

​ thread.join()

asset_paths = [“/Game/YourAsset1”, “/Game/YourAsset2”, “/Game/YourAsset3”]

process_assets_in_threads(asset_paths)

八、实际应用案例

了解一些实际应用案例可以帮助你更好地理解和应用Python编程。

  1. 项目管理工具

你可以编写Python脚本来管理项目,例如自动生成项目结构、管理资产和关卡等。

import os

import unreal

def create_project_structure(base_path):

​ folders = [

​ “/Game/Assets”,

​ “/Game/Blueprints”,

​ “/Game/Materials”,

​ “/Game/Textures”

​ ]

​ for folder in folders:

​ folder_path = os.path.join(base_path, folder)

​ if not os.path.exists(folder_path):

​ os.makedirs(folder_path)

​ unreal.log(f”Created folder: {folder_path}”)

create_project_structure(“path/to/your/project”)

  1. 自动化测试

你可以使用Python脚本编写自动化测试,以确保项目的质量和稳定性。

import unreal

def run_automated_tests():

​ test_framework = unreal.AutomationLibrary()

​ test_results = test_framework.run_tests(“Functional Tests”)

​ for result in test_results:

​ unreal.log(f”Test: {result.test_name}, Result: {result.result}”)

run_automated_tests()

九、主要官方库

库名 主要作用
unreal.EditorAssetLibrary Utility class to do most of the common functionalities with the ContentBrowser
unreal.AssetRegistryHelpers Asset Registry Helpers
unreal.ObjectBase Type for all Unreal exposed object instances
EditorUtilityLibrary

十、其他python库

sys 处理

import sys

if len(sys.argv) > 1:

​ script_name = sys.argv[0] # 脚本名称

​ first_arg = sys.argv[1] # 第一个参数

​ print(f”脚本: {script_name}, 参数1: {first_arg}”)

else:

​ print(“未提供参数”)

cmd : python script.py hello

十一、总结

在Unreal Engine中使用Python可以显著提高开发效率和生产力。通过启用Python插件、编写Python脚本、使用Python API、创建自定义工具、与蓝图结合、自动化工作流程、调试和优化脚本,你可以实现许多复杂的功能和自动化任务。同时,利用学习资源和社区支持,不断提升自己的技能和知识。希望本文能帮助你更好地在Unreal Engine中使用Python,实现你的创意和项目目标。