EditorPlugin

Inherits: Node < Object

由编辑器用于扩展其功能。

描述

编辑器使用插件来扩展功能。最常见的插件类型是编辑给定的节点或资源类型、导入插件和导出插件。另请参阅EditorScript向编辑器添加函数。

教程

方法

void

add_autoload_singleton ( String name, String path )

ToolButton

add_control_to_bottom_panel ( Control control, String title )

void

add_control_to_container ( CustomControlContainer container, Control control )

void

add_control_to_dock ( DockSlot slot, Control control )

void

add_custom_type ( String type, String base, Script script, Texture icon )

void

add_export_plugin ( EditorExportPlugin plugin )

void

add_import_plugin ( EditorImportPlugin importer )

void

add_inspector_plugin ( EditorInspectorPlugin plugin )

void

add_scene_import_plugin ( EditorSceneImporter scene_importer )

void

add_spatial_gizmo_plugin ( EditorSpatialGizmoPlugin plugin )

void

add_tool_menu_item ( String name, Object handler, String callback, Variant ud=null )

void

add_tool_submenu_item ( String name, Object submenu )

void

apply_changes ( ) virtual

bool

build ( ) virtual

void

clear ( ) virtual

void

disable_plugin ( ) virtual

void

edit ( Object object ) virtual

void

enable_plugin ( ) virtual

void

forward_canvas_draw_over_viewport ( Control overlay ) virtual

void

forward_canvas_force_draw_over_viewport ( Control overlay ) virtual

bool

forward_canvas_gui_input ( InputEvent event ) virtual

void

forward_spatial_draw_over_viewport ( Control overlay ) virtual

void

forward_spatial_force_draw_over_viewport ( Control overlay ) virtual

bool

forward_spatial_gui_input ( Camera camera, InputEvent event ) virtual

PoolStringArray

get_breakpoints ( ) virtual

EditorInterface

get_editor_interface ( )

Texture

get_plugin_icon ( ) virtual

String

get_plugin_name ( ) virtual

ScriptCreateDialog

get_script_create_dialog ( )

Dictionary

get_state ( ) virtual

UndoRedo

get_undo_redo ( )

void

get_window_layout ( ConfigFile layout ) virtual

bool

handles ( Object object ) virtual

bool

has_main_screen ( ) virtual

void

hide_bottom_panel ( )

void

make_bottom_panel_item_visible ( Control item )

void

make_visible ( bool visible ) virtual

void

queue_save_layout ( ) const

void

remove_autoload_singleton ( String name )

void

remove_control_from_bottom_panel ( Control control )

void

remove_control_from_container ( CustomControlContainer container, Control control )

void

remove_control_from_docks ( Control control )

void

remove_custom_type ( String type )

void

remove_export_plugin ( EditorExportPlugin plugin )

void

remove_import_plugin ( EditorImportPlugin importer )

void

remove_inspector_plugin ( EditorInspectorPlugin plugin )

void

remove_scene_import_plugin ( EditorSceneImporter scene_importer )

void

remove_spatial_gizmo_plugin ( EditorSpatialGizmoPlugin plugin )

void

remove_tool_menu_item ( String name )

void

save_external_data ( ) virtual

void

set_force_draw_over_forwarding_enabled ( )

void

set_input_event_forwarding_always_enabled ( )

void

set_state ( Dictionary state ) virtual

void

set_window_layout ( ConfigFile layout ) virtual

int

update_overlays ( ) const

信号

  • main_screen_changed ( String screen_name )

当用户改变工作空间(2D, 3D, Script, AssetLib)时触发。也适用于由插件定义的自定义屏幕。



  • scene_changed ( Node scene_root )

在编辑器中更改场景时触发。该参数将返回刚刚变为活动状态的场景的根节点。如果此场景是新场景且为空,则参数将为null


  • scene_closed ( String filepath )

当用户关闭场景时触发。参数是关闭场景的文件路径。

枚举

enum CustomControlContainer:

  • CONTAINER_TOOLBAR = 0

  • CONTAINER_SPATIAL_EDITOR_MENU = 1

  • CONTAINER_SPATIAL_EDITOR_SIDE_LEFT = 2

  • CONTAINER_SPATIAL_EDITOR_SIDE_RIGHT = 3

  • CONTAINER_SPATIAL_EDITOR_BOTTOM = 4

  • CONTAINER_CANVAS_EDITOR_MENU = 5

  • CONTAINER_CANVAS_EDITOR_SIDE_LEFT = 6

  • CONTAINER_CANVAS_EDITOR_SIDE_RIGHT = 7

  • CONTAINER_CANVAS_EDITOR_BOTTOM = 8

  • CONTAINER_PROPERTY_EDITOR_BOTTOM = 9

  • CONTAINER_PROJECT_SETTING_TAB_LEFT = 10

  • CONTAINER_PROJECT_SETTING_TAB_RIGHT = 11


enum DockSlot:

  • DOCK_SLOT_LEFT_UL = 0

  • DOCK_SLOT_LEFT_BL = 1

  • DOCK_SLOT_LEFT_UR = 2

  • DOCK_SLOT_LEFT_BR = 3

  • DOCK_SLOT_RIGHT_UL = 4

  • DOCK_SLOT_RIGHT_BL = 5

  • DOCK_SLOT_RIGHT_UR = 6

  • DOCK_SLOT_RIGHT_BR = 7

  • DOCK_SLOT_MAX = 8 —- 表示DockSlot枚举的大小。

方法说明

path 处的脚本作为 name 添加到自动加载列表中。


将控件添加到底部面板(以及“输出”,“调试”,“动画”等)。返回对添加的按钮的引用。您可以根据需要隐藏/显示按钮。停用插件后,请确保使用remove_control_from_bottom_panel删除自定义控件,并使用Node.queue_free释放它。


将自定义控件添加到容器中(参阅CustomControlContainer)。在编辑器用户界面中,有许多位置可以添加自定义控件,请记住,您必须自己管理您的自定义控件的可见性(并且很可能在添加后隐藏它)。

请记住,您必须自己管理您的自定义控件的可见性(并且很可能在添加后隐藏它)。

当你的插件停用时,请确保使用remove_control_from_container删除你的自定义控件,并使用Node.queue_free释放它。


将控件添加到特定的停靠面板(有关选项,请参阅DockSlot)。

如果重新放置了停靠面板,并且只要插件处于活动状态,编辑器就会在以后的会话中保存停靠面板的位置。

停用插件后,请确保使用remove_control_from_docks删除自定义控件,并使用Node.queue_free释放它。


添加一个自定义类型,它将出现在节点或资源的列表中。可以选择指定一个图标。

当给定的节点或资源被选中时,基本类型将被实例化(即“Spatial”、“Control”、“Resource”),然后脚本将被加载并设置为这个对象。

你可以使用虚拟法 handles 通过检查脚本或使用 is 关键字来检查是否正在编辑自定义对象。

在运行时,这将是一个带有脚本的简单对象,因此不需要调用此函数。


注册一个新的编辑器导出插件 EditorExportPlugin。导出插件是用来在项目被导出时执行任务的。

参见 add_inspector_plugin,了解如何注册一个插件的例子。


注册一个新的编辑器导入插件 EditorImportPlugin。导入插件用于导入自定义和不支持的资产,作为一个自定义的 Resource 资源类型。

注意: 如果你想导入自定义的 3D 资产格式,请使用 add_scene_import_plugin 代替。

参见 add_inspector_plugin 以了解如何注册一个插件的例子。


注册一个新的编辑器属性检查器插件EditorInspectorPlugin。检查器插件用于扩展 EditorInspector 并为你的对象属性提供自定义配置工具。

注意: 当你的 EditorPlugin 被禁用时,一定要使用 remove_inspector_plugin 来删除注册的 EditorInspectorPlugin,以防止泄漏和出现意外行为。

  1. const MyInspectorPlugin = preload("res://addons/your_addon/path/to/your/script.gd")
  2. var inspector_plugin = MyInspectorPlugin.new()
  3. func _enter_tree():
  4. add_inspector_plugin( inspector_plugin)
  5. func _exit_tree():
  6. remove_inspector_plugin(inspector_plugin)

注册一个新的场景导入器 EditorSceneImporter。场景导入器可以将自定义 3D 素材格式导入为场景。


注册一个新的空间辅助器插件 EditorSpatialGizmoPlugin。Gizmo插件用于为 Spatial 的 3D预览视窗添加自定义的 gizmos。

参见 add_inspector_plugin 以了解如何注册一个插件的例子。


项目 > 工具中添加一个自定义菜单项,作为name,当用户激活它时,该菜单项将调用callback参数为udhandler实例。


项目>工具> name下添加自定义子菜单。 submenu应该是PopupMenu类的对象。此子菜单应使用remove_tool_menu_item(name)进行清理。


  • void apply_changes ( ) virtual

当编辑器将进行要保存项目、切换选项卡等操作时,将调用此方法。它要求插件应用任何暂挂状态更改以确保一致性。

例如,在着色器编辑器中使用它来使插件将用户编写的着色代码应用于对象。


  • bool build ( ) virtual

这个方法在编辑器即将运行项目时被调用。然后,该插件可以在项目运行前执行所需的操作。

这个方法必须返回一个布尔值。如果这个方法返回 false,项目将不会运行。运行被立即中止,所以这也会阻止所有其他插件的build 方法运行。


  • void clear ( ) virtual

清除所有状态,并将正在编辑的对象重置为零。这可以确保你的插件不会一直编辑一个当前存在的节点,或者一个来自错误场景节点。


  • void disable_plugin ( ) virtual

当用户在项目设置窗口的插件选项卡中禁用EditorPlugin时,由引擎调用。


  • void edit ( Object object ) virtual

该函数用于编辑特定对象类型(节点或资源)的插件。它要求编辑器编辑给定的对象。


  • void enable_plugin ( ) virtual

当用户在项目设置窗口的插件选项卡中启用EditorPlugin时,由引擎调用。


  • void forward_canvas_draw_over_viewport ( Control overlay ) virtual

当2D编辑器的视窗被更新时,由引擎调用。使用 overlay Control 进行绘制。你可以通过调用 update_overlays 手动更新视窗。

  1. func forward_canvas_draw_over_viewport(overlay):
  2. # 在光标位置画一个圆。
  3. overlay.draw_circle(overlay.get_local_mouse_position(), 64, Color.white)
  4. func forward_canvas_gui_input(event):
  5. if event is InputEventMouseMotion:
  6. # 当光标被移动时,重绘视窗。
  7. update_overlays()
  8. return true
  9. return false

  • void forward_canvas_force_draw_over_viewport ( Control overlay ) virtual

这个方法和 forward_canvas_draw_over_viewport 一样,只是它在所有东西的上面绘制。当你需要一个额外的层显示在其他东西上面时,这个方法很有用。

你需要通过使用 set_force_draw_over_forwarding_enabled 来激活这个方法的调用。


当当前编辑场景中有一个根节点时被调用,handles实现,在2D视窗中发生按键输入InputEvent。拦截按键输入InputEvent,如果return true EditorPlugin消耗键值event,否则将键值event转发给其他Editor类。例子:

  1. # 阻止 InputEvent 到达其他编辑类
  2. func forward_canvas_gui_input(event):
  3. var forward = true
  4. return forward

必须 return false 才能将 InputEvent 转发到其他编辑器类。例子:

  1. # 消耗InputEventMouseMotion并转发其他InputEvent类型
  2. func forward_canvas_gui_input(event):
  3. var forward = false
  4. if event is InputEventMouseMotion:
  5. forward = true
  6. return forward

  • void forward_spatial_draw_over_viewport ( Control overlay ) virtual

当3D编辑器的视窗被更新时,由引擎调用。使用 overlay 控件 Control 进行绘制。你可以通过调用 update_overlays 更新覆盖手动更新视窗。

  1. func forward_spatial_draw_over_viewport(overlay):
  2. # 在光标位置画一个圆。
  3. overlay.draw_circle(overlay.get_local_mouse_position(), 64)
  4. func forward_spatial_gui_input(camera, event):
  5. if event is InputEventMouseMotion:
  6. # 当光标被移动时,重绘视窗。
  7. update_overlays()
  8. return true
  9. return false

  • void forward_spatial_force_draw_over_viewport ( Control overlay ) virtual

这个方法和 forward_spatial_draw_over_viewport 一样,只是它在所有东西的上面绘制。当你需要一个额外的层显示在其他东西上面时,这个方法很有用。

你需要通过使用 set_force_draw_over_forwarding_enabled 来激活这个方法的调用。


在当前编辑的场景中存在根节点时调用,实现handles并在3D视窗中发生按键输入InputEvent。拦截按键输入InputEvent,如果return true,则EditorPlugin会使用键值event,否则将键值event转发到其他Editor类。例子:

  1. # 阻止 InputEvent 到达其他编辑类
  2. func forward_spatial_gui_input(camera, event):
  3. var forward = true
  4. return forward

必须 return false 才能将 InputEvent 转发到其他编辑器类。例子:

  1. # 消耗 InputEventMouseMotion 并转发其他 InputEvent 类型
  2. func forward_spatial_gui_input(camera, event):
  3. var forward = false
  4. if event is InputEventMouseMotion:
  5. forward = true
  6. return forward

这是为编辑基于脚本的对象的编辑器。您可以返回格式中的断点列表(script:line),例如:res://path_to_script.gd:25


返回EditorInterface对象,该对象使您可以控制Godot编辑器的窗口及其功能。


  • Texture get_plugin_icon ( ) virtual

在你的插件中覆盖这个方法,返回一个纹理 Texture,以便给它一个图标。

对于主界面的插件,它出现在屏幕的顶部,在 “2D”、”3D”、”Script “和 “AssetLib “按钮的右边。

理想情况下,插件的图标应该是透明背景的白色,尺寸为16x16像素。

  1. func get_plugin_icon():
  2. # 你可以使用一个自定义的图标。
  3. return preload("res://addons/my_plugin/my_plugin_icon.svg")
  4. # 或者使用一个内置的图标。
  5. return get_editor_interface().get_base_control().get_icon("Node", "EditorIcons")

  • String get_plugin_name ( ) virtual

在Godot编辑器中显示时,请在插件中覆盖此方法以提供插件的名称。

对于主屏幕插件,它显示在屏幕顶部,在“ 2D”,“ 3D”,“脚本”和“ AssetLib”按钮的右侧。


获取用于创建脚本的编辑器对话框。

注意: 用户可以在使用前对其进行配置。

警告: 移除和释放这个节点将使编辑器的一部分失去作用,并可能导致崩溃。


获取插件编辑器的状态。这用于保存场景时(从而再次打开时,它的状态被保持)和切换标签(从而状态能够当拉片返回恢复)时使用。


获取撤消/重做对象。编辑器中的大多数操作都是可以撤消的,因此请使用此对象来确保在需要时执行此操作。


  • void get_window_layout ( ConfigFile layout ) virtual

获取插件的GUI布局。当调用queue_save_layout更改了编辑器布局(例如,更改停靠点的位置)时或保存项目的编辑器布局。


如果您的插件编辑特定类型的对象(资源或节点),请实现此功能。如果返回 true,则当编辑器请求它们时,将获得调用 editmake_visible 的函数。如果您已经声明了方法 forward_canvas_gui_inputforward_spatial_gui_input,这些方法也将被调用。


  • bool has_main_screen ( ) virtual

如果这是一个主屏幕编辑插件,返回true(它与2D3DScriptAssetLib一起放在工作区选择器中)。


  • void hide_bottom_panel ( )

最小化底部面板。


  • void make_bottom_panel_item_visible ( Control item )

使底部面板中的一个特定项目可见。


  • void make_visible ( bool visible ) virtual

当编辑器被要求变为可见时,该函数将被调用。它用于编辑特定对象类型的插件。

记住,你必须手动管理所有编辑器控件的可见性。


  • void queue_save_layout ( ) const

排队保存项目的编辑器布局。


  • void remove_autoload_singleton ( String name )

从列表中删除自动加载name


  • void remove_control_from_bottom_panel ( Control control )

从底部面板上删除控件。您必须手动Node.queue_free释放控件。


从指定的容器中删除控件。您必须手动Node.queue_free释放控件。


  • void remove_control_from_docks ( Control control )

从扩展面板中删除控件。您必须手动Node.queue_free释放控件。


  • void remove_custom_type ( String type )

删除由 add_custom_type 添加的自定义类型。


删除由 add_export_plugin 注册的导出插件。


删除由 add_import_plugin 注册的导入插件。


删除由 add_import_plugin 注册的检查器插件


删除由 add_scene_import_plugin 注册的场景导入器。


删除由 add_spatial_gizmo_plugin 注册的控制器插件。


  • void remove_tool_menu_item ( String name )

项目 > 工具中删除菜单name


  • void save_external_data ( ) virtual

这个方法在编辑器保存项目后或关闭项目时被调用,它要求插件保存编辑的外部场景/资源。


  • void set_force_draw_over_forwarding_enabled ( )

启用2D编辑器的 forward_canvas_force_draw_over_viewport 和3D编辑器的 forward_spatial_force_draw_over_viewport 在其视窗更新时的调用。你只需要调用这个方法一次,它就会对这个插件永久起作用。


  • void set_input_event_forwarding_always_enabled ( )

如果你想在forward_spatial_gui_input里面接收来自3D视图屏幕的输入,请使用这个方法。如果你的插件想要在场景中使用光线广播,那么这个方法可能特别有用。


恢复get_state保存的状态。


  • void set_window_layout ( ConfigFile layout ) virtual

恢复get_window_layout保存的插件GUI布局。


  • int update_overlays ( ) const

更新 2D 和 3D 编辑器视窗的覆盖层。导致方法 forward_canvas_draw_over_viewportforward_canvas_force_draw_over_viewportforward_spatial_draw_over_viewportforward_spatial_force_draw_over_viewport 被调用。