Bootstrap Chameleon Logo

在虚幻引擎中执行Python命令

介绍在UE中执行Python命令的最常用的方法:命令行菜单, 工具界面Remote Control

在Output窗口中执行

我们可以直接在虚幻引擎编辑器的 Output 窗口中通过命令行执行 Python 命令。在调试和探索虚幻引擎 Python 编辑器接口时,我们通常会直接在命令行中进行操作。

Python hello world gif in Unreal Editor

Python 和 Python(REPL)

一个 REPL(发音为“REP-UL”)是通过交互方式使用 Python 与计算机进行交互的方式。为了实现这一点,计算机需要完成以下四个步骤:

  1. 读取用户输入(即您输入的 Python 命令)。
  2. 评估您的代码(以确定您的意思)。
  3. 打印任何结果(以便您查看计算机的响应)。
  4. 回到步骤 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

Extra
chameleon_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,并在场景中创建模型的指令。 Remote control settings in Unreal project settings

这可以视为一种低配版的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)

参考链接

Scripting the Unreal Editor Using Python