介绍在UE中执行Python命令的最常用的方法:命令行,菜单, 工具界面, Remote Control
在Output窗口中执行¶
我们可以直接在虚幻引擎编辑器的 Output 窗口中通过命令行执行 Python 命令。在调试和探索虚幻引擎 Python 编辑器接口时,我们通常会直接在命令行中进行操作。
Python 和 Python(REPL)¶
一个 REPL(发音为“REP-UL”)是通过交互方式使用 Python 与计算机进行交互的方式。为了实现这一点,计算机需要完成以下四个步骤:
- 读取用户输入(即您输入的 Python 命令)。
- 评估您的代码(以确定您的意思)。
- 打印任何结果(以便您查看计算机的响应)。
- 回到步骤 1(以继续对话)。
正因为我们可以在REPL的这4个步骤的循环中,不断迭代和前进,我们可以在探索中学习,就像第一次进入森林的小孩一样,发现周围各种好玩的一切。更多关于学习和迭代的内容可见这里:learning_ue_with_python
通过菜单执行¶
在使用TAPython的情况下,我们可以将任何的Python代码,挂载在菜单项中。可以是单个语句或者多行语句或者是一个python文件。 支持挂载的菜单项位置可见这里
事实上,下面command:
后面的代码与在Output 窗口执行的效果几乎是一样的。
{
"OnMainMenu": {
"items": [
{
"name": "TAPython Example: Hello World",
"command": "print('Hello world.')"
}
]
}
}
或者执行某个工具Package中的函数
"OnMainMenu": {
"items": [
{
"name": "Call Function",
"command": "import Utilities; print(Utilities.Utils.get_selected_asset())"
}
]
}
NOTE
"command"中的代码是在全局命名空间中执行的(和在Outline的Python 命令行是一样的)。
也就是说,如果你在command中定义了一个变量,那么它将是全局变量
TIP
我们可以用print(globals())
打印出所有的全局变量的变量名和值
通过TAPython Unreal API¶
执行Python命令¶
除了上面的方法,我们也可以通过扩展的EditorAPI来调用Python代码。
unreal.PythonBPLib.exec_python_command("some_global_var = 'some value'")
同样,其中的代码也执行在全局空间中。
比如下面的代码中,就利用这一特点,将两个不同的ChameleonTool工具,连接到了一起:
def subscribe_macropad_input(self):
if not self.keypad:
self.keypad = MacroPad.MyKeyPad(button_count=14, start_note=60, rotary_count=2)
self.keypad.add_key_callback(id=8, on_key_down=self.create_grass_around_cam)
self.keypad.add_key_callback(id=9, on_key_down=self.toggle_smalls)
unreal.PythonBPLib.exec_python_command("chameleon_midi.add_subscriber(chameleon_zelda_map.keypad)") # self == chameleon_zelda_map
Extrachameleon_midi
是负责与下图中的实体键盘交互的工具self
是场景控制工具subscribe_macropad_input
将self中的具体执行逻辑与实体键盘通过观察者模式进行关联
ExecuteConsoleCommand¶
在官方文档中有介绍过,通过在Cmd命令行中通过py "some_py_file_path.py"
运行py脚本文件。
在TAPython中,unreal.PythonBPLib.execute_console_command提供了在Python中执行UE Cmd命令行的功能,所以下面的代码与在Cmd窗口中的等价。(实际工作中,通过这个方法之间运行一个py文件是比较少见的)
unreal.PythonBPLib.execute_console_command('py "some_py_file_path.py"')
Shelf¶
在Built-in工具中,Shelf工具中,我们可以将python代码片断拖拽到工具中(是的,这是一个类似maya shelf的功能,我很喜欢maya的shelf:D)
在现在版本的"Shelf"中,实际上也是通过unreal.PythonBPLib.exec_python_command
执行的python 命令。
Remote Control¶
UE Python Remote Control是个很强大的功能。它可以让我们在外部软件,或者其他的python工程中,向UE编辑器发送并执行遥控命令。比如我们可以在dcc软件中,直接给UE发送导入fbx,并在场景中创建模型的指令。
这可以视为一种低配版的live-link,我们可以在没有UE live-link的dcc或者其他软件中使用它
其他¶
Unreal Engine 在4.23 中添加了通过配置菜单运行Python 菜单的方法,Customized ToolMenuEntry 的方法
TAPython与它相比使用会更加简单和快捷,并且兼容ToolMenuEntry能够使用的Anchor挂点。
~~在官方的Python介绍中,还有提到其他执行Python命令,比如通过 主菜单:Tools - Execute Python Script...
,在指定python文件后,执行其中的内容。事实上,这种方法很少被使用,我们有更好的方法来代替它~~
REPL:(Read Eval Print Loop)