制作主屏幕插件

本教程涵盖的内容

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

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

初始化插件

首先从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 .这个函数会在插件激活时被编辑器自动调用,告诉它这个插件给编辑器增加了一个新的中心视图.现在,我们暂且把这个脚本保持原样,以后再来讨论它.

主画面场景

创建一个新的场景,其根节点由``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``.

更新插件脚本

我们需要更新 ``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视窗.

试试这个插件

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

如果你想试试这个插件的完成版,请在这里查看插件演示:https://github.com/godotengine/godot-demo-projects/tree/master/plugins

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