Switchboard插件设置
按照下面的步骤修改插件的设置。
- 在 虚幻编辑器 的主菜单中,选择 编辑(Edit) > 项目设置(Project Settings) 可以打开 项目设置(Project Settings) 窗口。
- 在 项目设置(Project Settings) 窗口中,在 插件(Plugins) 部分中选择 Switchboard。
| 参数 | 说明 |
|---|---|
| Switchboard | |
| Python编译器路径(Python Interpreter Path) | Switchboard的默认Python版本是Python 3.7.7。要使用Python的其他版本,请更改此字段以指向你机器上的Python编译器。 |
| Switchboard路径(Switchboard Path) | Switchboard Python文件的位置。 |
| 命令行参数(Commandline Arguments) | Switchboard目前不允许使用任何命令行参数。 |
| Listener | |
| Listener路径(Listener Path) | SwitchboardListener可执行文件的位置。 |
| Listener命令行参数(Listener Commandline Arguments) | SwitchboardListener需要使用以下参数:
|
| OSC | |
| 默认Switchboard OSC Listener(Default Switchboard OSC Listener) | Switchboard需要OSC Listener才能使用镜头试拍录制器。如需更多详细信息,请参见使用Switchboard录制试拍镜头。 |
Switchboard设置
- 对所有设备插件通用的设置位于 设置(Settings) 面板顶部,包括在初始项目设置期间添加的值。
- 在你添加设备之后,这些设备的设置将附加到设置面板。
- 部分一般设置在设备的设置中是重复的,因此必要时可以覆盖各个设备的值。
- 如果要在特定的设备中覆盖设置,将显示不同的背景颜色。只要覆盖位置正确,更改全局设置就不会导致设备中的此设置发生更改。
下面的部分介绍了所有可以在“设置”面板中修改的设置。
| 参数 | 说明 |
|---|---|
| IP地址(IP Address) | 运行Switchboard和内部OSC服务器的机器的IP地址。如果运行Switchboard的计算机上有多个网络控制器,请在此处更改地址。 |
| 传输路径(Transport Path) | 目前未在Switchboard中使用。 |
项目设置
| 参数 | 说明 |
|---|---|
| 项目名称(Project Name) | Switchboard项目的名称。将用作存储设置和设备的文件名的基础。 |
| UProject | UE项目文件的本地路径。 |
| 引擎目录(Engine Dir) | 虚幻引擎目录的本地路径。 |
| 构建引擎(Build Engine) | 用于在Switchboard中启用从源编译引擎的标记。 |
| 贴图路径(Map Path) | 从 Content 文件夹到贴图的相对路径,将显示在Switchboard中的 关卡(Level) 下拉菜单中。 |
| 贴图过滤器(Map Filter) | 用于限制哪些贴图出现在“关卡”下拉菜单中的文件过滤器。 |
| OSC | |
| 服务器端口(Server Port) | 要在Switchboard中侦听的OSC服务器的端口。 |
| 客户端端口(Client Port) | 虚幻编辑器中指定的OSC客户端的端口。 |
| 源功能按钮(Source Control) | |
| P4项目路径(P4 Project Path) | Uproject中指定的虚幻项目的Perforce库路径。仅需要指定包含Uproject文件的库文件夹。 |
| P4引擎路径(P4 Engine Path) | 仅当你计划根据源编译引擎(而非仅编译项目)时,才需要使用P4引擎路径设置。如果需要更多详细信息,请参见同步和编译。 |
| 工作区名称(Workspace Name) | 映射至库项目路径的Perforce工作区的名称。 |
多用户服务器设置
| 参数 | 说明 |
|---|---|
| 服务器名称(Server Name) | 附加到项目名称的名称,用于创建完整的服务器名称。 |
| 命令行参数(Command Line Args) | 传递到多用户服务器可执行文件的可选参数。 |
| 自动加入(Auto Join) | 启用此选项,让每个虚幻或nDisplay设备自动加入多用户服务器。 |
| 清空历史记录(Clean History) | 将参数 -ConcertClean 传递到服务器,以便在启动时清空服务器会话的工作目录。 |
| 自动启动(Auto Launch) | 启用此选项以在首次启动虚幻或nDisplay设备时启动多用户服务器。服务器始终在与Switchboard所在的同一设备上运行。 |
虚幻设备设置
| 参数 | 说明 |
|---|---|
是录制设备(Is Recording Device) |
如果该设备类型即将用于录制序列,则启用此选项。 |
| 缓冲区大小(Buffer Size) | 连接到SwitchboardListener的套接字客户端的内部缓冲区大小。 |
| 命令行参数(Command Line Arguments) | 启动时传递至虚幻的可选命令行参数。 |
ExecCmds |
设置要在启动时作为命令行参数传递至虚幻的 |
Listener端口(Listener Port) |
Listener要侦听的端口号。默认端口为2980。 |
角色文件名(Roles Filename) |
包含虚拟制作角色的.ini文件的文件名。 |
舞台会话ID(Stage Session ID) |
用于对舞台监视器提供程序和监视器进行分组的ID。具有不同会话ID的实例在舞台监视器中对彼此不可见。 |
| UE4编辑器文件名(UE4 Editor filename) | 虚幻编辑器可执行文件的文件名。 |
GPU数量(Number of GPUs) |
当设备上有多个GPU时使用的GPU数量。 |
| 实例设置(Instance Settings) | |
IP地址(IP address) |
SwitchboardListener侦听的远程地址。 |
角色(Roles) |
支持选择角色.ini文件中提供的虚拟制作角色的下拉菜单。 |
| 是录制设备(Is Recording Device) | 覆盖以确定此设备是否用于录制。 |
| 命令行参数(Command Line Arguments) | 覆盖以获得可选命令行参数。 |
ExecCmds |
覆盖以获得虚幻的exec命令。 |
GPU数量(Number of GPUs) |
覆盖以获得要使用的GPU计数。 |
引擎目录(Engine Directory) |
覆盖以获得引擎的本地路径。 |
uProject路径(uProject Path) |
覆盖以获得uProject文件的本地路径。 |
KiPro设备设置
| 参数 | 说明 |
|---|---|
是录制设备(Is Recording Device) |
如果该设备类型即将用于录制序列,则启用此选项。 |
| IP地址(IP address) | KiPro Web服务器的地址。 |
| 停止后自动播放(Auto Play After Stop) | 启用此选项可以在录制结束时自动播放。 |
Live Link Face
| 参数 | 说明 |
|---|---|
是录制设备(Is Recording Device) |
如果该设备类型即将用于录制序列,则启用此选项。 |
| IP地址(IP address) | 目前未在Switchboard中使用。 |
nDisplay设备设置
| 参数 | 说明 |
|---|---|
| nDisplay配置文件(nDisplay Config File) | 支持.cfg和JSON格式。 |
| 使用所有可用内核(Use All Available Cores) | 启用此选项以使用所有内核。 |
| 纹理流送(Texture Streaming) | 切换纹理流送。 |
| 渲染API(Render API) | 选项为DirectX11或DirectX12。 |
| 渲染模式(Render Mode) | 允许选择nDisplay渲染模式。 |
| 额外命令行参数(Extra Cmd Line Args) | 启动时传递至nDisplay的可选命令行参数。 |
ExecCmds |
设置要在启动时作为命令行参数传递至虚幻的 |
GPU数量(Number of GPUs) |
当设备上有多个GPU时使用的GPU数量。 |
Listener端口(Listener Port) |
Listener要侦听的端口号。默认端口为2980。 |
角色(Roles) |
支持选择角色.ini文件中提供的虚拟制作角色的下拉菜单。 |
舞台会话ID(Stage Session ID) |
用于对舞台监视器提供程序和监视器进行分组的ID。具有不同会话ID的实例在舞台监视器中对彼此不可见。 |
对于每个nDisplay场景节点:
| 参数 | 说明 |
|---|---|
IP地址(IP address) |
SwitchboardListener侦听的远程地址。 |
角色(Roles) |
支持选择角色.ini文件中提供的虚拟制作角色的下拉菜单。 |
| 额外命令行参数(Extra Cmd Line Args) | 覆盖以获得可选的命令行参数。 |
| ExecCmds | 覆盖以获得nDisplay的exec命令 |
GPU数量(Number of GPUs) |
覆盖以获得要使用的GPU计数。 |
引擎目录(Engine Directory) |
覆盖以获得引擎的本地路径。 |
uProject路径(uProject Path) |
覆盖以获得uProject文件的本地路径。 |
Shogun设备设置
| 参数 | 说明 |
|---|---|
是录制设备(Is Recording Device) |
如果该设备类型即将用于录制序列,则启用此选项。 |
| IP地址(IP Address) | 运行Shogun的设备的地址。 |
| 保存路径(Save Path) | Shogun的捕获文件夹的路径。 |
SoundDevices设备设置
| 参数 | 说明 |
|---|---|
是录制设备(Is Recording Device) |
如果该设备类型即将用于录制序列,则启用此选项。 |
| IP地址(IP Address) | SoundDevices Web服务器的地址。 |
为Switchboard创建你自己的设备插件
根据你的项目需求和你使用的设备,可能需要在Switchboard中添加或扩展设备功能。此部分介绍如何在Python中创建你自己的设备插件。利用一些C++知识即可将Listener扩展成接受更多类型的消息,但本文不包含这方面的内容。
以下说明逐步介绍如何为Switchboard创建新的设备插件 SampleDevice,该插件可用作起点。
- 要使设备插件在加载后可以在Switchboard中发现,必须在
\Engine\Plugins\VirtualProduction\Switchboard\Source\Switchboard\switchboard\devices\中按照命名惯例<plugin_name>\plugin_<plugin_name>.py创建一个文件夹和Python文件。- 对于 SampleDevice 插件,请创建以下文件:
\Engine\Plugins\VirtualProduction\Switchboard\Source\Switchboard\switchboard\devices\sampledevice\plugin_sampledevice.py.
- 对于 SampleDevice 插件,请创建以下文件:
- 在
plugin_sampledevice.py文件中,扩展\Engine\Plugins\VirtualProduction\Switchboard\Source\Switchboard\switchboard\devices\device_base.py中定义的Device类。- 从
device_base.py中导入Device。 - 创建新类
DeviceSampleDevice,此类继承自Device。 -
从
switchboard/switchboard_logging.py导入LOGGER以报告错误。从switchboard.devices.device_base导入Device 从switchboard.switchboard_logging导入LOGGER
class DeviceSampleDevice(Device):` def init(self, name, ip_address, kwargs): super().__init__(name, ip_address, kwargs)
确认文件可以被Switchboard发现。启动Switchboard并展开 添加设备(Add Device) 下拉菜单。SampleDevice 出现在列表中。

- 从
- 将SampleDevice添加到你的Switchboard不会在视图中创建控件。要创建SampleDevice控件,请扩展
plugin_sampledevice.py中的DeviceWidget:- 从
device_widget_base.py导入DeviceWidget。 -
创建新类
DeviceWidgetSampleDevice,此类继承自DeviceWidget。从switchboard.devices.device_base导入Device 从switchboard.devices.device_widget_base导入DeviceWidget 从switchboard.switchboard_logging导入LOGGER
class DeviceSampleDevice(Device): def init(self, name, ip_address, kwargs): super().__init__(name, ip_address, kwargs)
class DeviceWidgetSampleDevice(DeviceWidget): def init(self, name, device_hash, ip_address, icons, parent=None): super().init(name, device_hash, ip_address, icons, parent=parent)
确认控件显示在Switchboard中。启动Switchboard并添加一个SampleDevice。一个最小化的SampleDevice控件将显示在视图中。

- 从
- 在添加新的SampleDevice时创建自定义对话框,方法是创建继承自
AddDeviceDialog的新类,并将其分配到DeviceSampleDevice类中的静态变量add_device_dialog。- 从
device_widget_base.py导入AddDeviceDialog。 - 从PySide2导入Qt模块
- 创建继承自
AddDeviceDialog的新类AddSampleDeviceDialog,并在调用基础类的构造函数时,将device_type参数设置成“SampleDevice”。 - 在新类的构造函数中,将QLineEdit文本框添加到对话框。
-
使用新类覆盖
DeviceSampleDevice中的add_device_dialog静态变量。从switchboard.devices.device_base导入Device 从switchboard.devices.device_widget_base导入AddDeviceDialog、DeviceWidget 从switchboard.switchboard_logging导入LOGGER
从PySide2导入QtWidgets、QtGui、QtCore
class AddSampleDeviceDialog(AddDeviceDialog): def init(self, existing_devices, parent=None): super().init(device_type="SampleDevice", existing_devices=existing_devices, parent=parent)
# 创建QTWidgets以添加到表单 self.additional_text_field = QtWidgets.QLineEdit(self)
# 将新选项附加到父类中定义的QTWidgets.QFormLayout对象 self.form_layout.addRow("Additional Text", self.additional_text_field)
class DeviceSampleDevice(Device): # 重载与设备插件关联的添加设备对话框对象 add_device_dialog = AddSampleDeviceDialog
def init(self, name, ip_address, kwargs): super().__init__(name, ip_address, kwargs)
class DeviceWidgetSampleDevice(DeviceWidget): def init(self, name, device_hash, ip_address, icons, parent=None): super().init(name, device_hash, ip_address, icons, parent=parent) `
确认新的设备对话框显示在Switchboard中。启动Switchboard并添加一个SampleDevice。额外的文本字段将显示在对话框中。

- 从
- Switchboard的右侧还可能有设备的控件,该控件包含其他选项卡式的扩展对话框,可以共享更多信息。要创建此选项卡,需要覆盖
Device基础类中的类方法plug_into_ui。- 创建新类
SampleDeviceTabView,此类继承自QtWidgets.QWidget。 - 在
DeviceSampleDevice中创建类成员tab_view以容纳控件的实例。 -
覆盖
DeviceSampleDevice中的类方法plug_into_ui,并使用新类SampleDeviceTabView初始化tab_view。从switchboard.devices.device_base导入Device 从switchboard.devices.device_widget_base导入AddDeviceDialog、DeviceWidget 从switchboard.switchboard_logging导入LOGGER
从PySide2导入QtWidgets、QtGui、QtCore
class AddSampleDeviceDialog(AddDeviceDialog): def init(self, existing_devices, parent=None): super().init(device_type="SampleDevice", existing_devices=existing_devices, parent=parent)
# 创建QTWidgets以添加到表单 self.additional_text_field = QtWidgets.QLineEdit(self)
# 将新选项附加到父类中定义的QTWidgets.QFormLayout self.form_layout对象 self.form_layout.addRow("Additional Text", self.additional_text_field)
class DeviceSampleDevice(Device): add_device_dialog = AddSampleDeviceDialog # 覆盖插件的默认对话框 tab_view = None
def init(self, name, ip_address, kwargs): super().__init__(name, ip_address, kwargs)
@classmethod def plug_into_ui(cls, menubar, tabs): ''' Implementation of base class function that allows plugin to inject UI elements. '''
if not cls.tab_view: cls.tab_view = SampleDeviceTabView(parent=tabs)
tabs.addTab(cls.tab_view, 'SampleDevice Tab')
class DeviceWidgetSampleDevice(DeviceWidget): def init(self, name, device_hash, ip_address, icons, parent=None): super().init(name, device_hash, ip_address, icons, parent=parent)
class SampleDeviceTabView(QtWidgets.QWidget): def init(self, parent): QtWidgets.QWidget.init(self, parent)

- 创建新类
上述步骤展示了如何为Switchboard创建新设备插件。如需高级示例,请参见Switchboard的nDisplay设备插件。