Making main screen plugins

What this tutorial covers

正如在 制作插件 页面中所看到的,制作一个扩展编辑器的基本插件是相当容易的。主屏幕插件允许你在编辑器的中心部分创建新的用户界面,它们出现在 "2D"、"3D"、"脚本 "和 "AssetLib "按钮旁边。这种编辑器插件被称为 "主场景插件"。

本教程将带领你创建一个基本的主场景插件。为了简单起见,主场景插件将包含一个打印文本到控制台的单个按钮。

Initializing the plugin

首先从Plugins菜单中创建一个新插件。在本教程中,我们将把它放在一个名为 main_screen 的文件夹中,但你可以使用任何你喜欢的名字。

插件脚本会自带 _enter_tree()_exit_tree() 方法,但对于主场景插件来说,我们需要添加一些额外的方法。增加五个额外的方法,脚本就像这样:

tool
extends EditorPlugin


func _enter_tree():
    pass


func _exit_tree():
    pass


func has_main_screen():
    return true


func make_visible(visible):
    pass


func get_plugin_name():
    return "Main Screen Plugin"


func get_plugin_icon():
    return get_editor_interface().get_base_control().get_icon("Node", "EditorIcons")

这个脚本中重要的部分是 has_main_screen() 函数,这个函数是重载的,所以它返回 true 。这个函数会在插件激活时被编辑器自动调用,告诉它这个插件给编辑器增加了一个新的中心视图。现在,我们暂且把这个脚本保持原样,以后再来讨论它。

Main screen scene

创建一个新的场景,其根节点由``Control``派生而来(在本例插件中,我们将使根节点为``CenterContainer``)。选择这个根节点,在视口中,点击```Layout```菜单,选择``Full Rect``。你还需要在检查器中启用``Expand``垂直尺寸标志。面板现在使用主视口中的所有可用空间。

接下来,让我们为我们的主屏幕插件示例添加一个按钮。添加一个``Button``节点,并将文本设置为 "Print Hello "或类似的内容。给按钮添加一个脚本,像这样:

tool
extends Button


func _on_PrintHello_pressed():
    print("Hello from the main screen plugin!")

然后将 "按下 "信号连接到自身。如果你需要信号方面的帮助,请参考:ref:`doc_signals`一文。

我们完成了主屏幕面板。将场景保存为``main_panel.tscn``。

Update the plugin script

我们需要更新 ``main_screen_plugin.gd `` 脚本,因此插件实例是我们的主面板场景,并将其放置在需要的位置。这是完整的插件脚本:

tool
extends EditorPlugin


const MainPanel = preload("res://addons/main_screen/main_panel.tscn")

var main_panel_instance


func _enter_tree():
    main_panel_instance = MainPanel.instance()
    # Add the main panel to the editor's main viewport.
    get_editor_interface().get_editor_viewport().add_child(main_panel_instance)
    # Hide the main panel. Very much required.
    make_visible(false)


func _exit_tree():
    if main_panel_instance:
        main_panel_instance.queue_free()


func has_main_screen():
    return true


func make_visible(visible):
    if main_panel_instance:
        main_panel_instance.visible = visible


func get_plugin_name():
    return "Main Screen Plugin"


func get_plugin_icon():
    # Must return some kind of Texture for the icon.
    return get_editor_interface().get_base_control().get_icon("Node", "EditorIcons")

增加了几行具体的内容。``MainPanel``是一个常量,持有对场景的引用,我们将其实例化为`main_panel_instance`。

_enter_tree() 函数在 _ready() 之前被调用。这是实例化主面板场景的地方,并将其添加为编辑器特定部分的子节点。使用 get_editor_interface().get_editor_viewport() 来获取视窗,并将主面板实例作为子节点加入其中。调用 make_visible(false) 函数来隐藏主面板,这样在第一次激活插件时就不会占用空间。

当插件停用时,调用``_exit_tree()``函数。如果主屏幕仍然存在,我们调用``queue_free()``来释放实例,并将其从内存中移除。

``make_visible()``函数被重写,以根据需要隐藏或显示主面板。当用户点击编辑器顶部的主视口按钮时,编辑器会自动调用该函数。

``get_plugin_name()``和``get_plugin_icon()``函数控制插件主视口按钮的显示名称和图标。

另一个你可以添加的函数是``handles()``函数,它允许你处理一个节点类型,当选择该类型时自动聚焦主屏幕。这类似于点击一个3D节点会自动切换到3D视口。

Try the plugin

在项目设置中激活插件。你会观察到主视口上方的2D、3D、脚本旁边有一个新的按钮。点击它将带你进入新的主屏幕插件,中间的按钮将打印文本。

If you would like to try a finished version of this plugin, check out the plugin demos here: https://github.com/godotengine/godot-demo-projects/tree/master/plugins

如果你想看一个更完整的例子,了解主屏幕插件的能力,请看这里的2.5D演示项目:https://github.com/godotengine/godot-demo-projects/tree/master/misc/2.5d