制作主屏幕插件

本教程涵盖的内容

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

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

初始化插件

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

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

  1. tool
  2. extends EditorPlugin
  3. func _enter_tree():
  4. pass
  5. func _exit_tree():
  6. pass
  7. func has_main_screen():
  8. return true
  9. func make_visible(visible):
  10. pass
  11. func get_plugin_name():
  12. return "Main Screen Plugin"
  13. func get_plugin_icon():
  14. return get_editor_interface().get_base_control().get_icon("Node", "EditorIcons")

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

主画面场景

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

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

  1. tool
  2. extends Button
  3. func _on_PrintHello_pressed():
  4. print("Hello from the main screen plugin!")

然后将 “按下” 信号连接到自身. 如果你需要信号方面的帮助, 请参考 使用信号 一文.

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

更新插件脚本

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

  1. tool
  2. extends EditorPlugin
  3. const MainPanel = preload("res://addons/main_screen/main_panel.tscn")
  4. var main_panel_instance
  5. func _enter_tree():
  6. main_panel_instance = MainPanel.instance()
  7. # Add the main panel to the editor's main viewport.
  8. get_editor_interface().get_editor_viewport().add_child(main_panel_instance)
  9. # Hide the main panel. Very much required.
  10. make_visible(false)
  11. func _exit_tree():
  12. if main_panel_instance:
  13. main_panel_instance.queue_free()
  14. func has_main_screen():
  15. return true
  16. func make_visible(visible):
  17. if main_panel_instance:
  18. main_panel_instance.visible = visible
  19. func get_plugin_name():
  20. return "Main Screen Plugin"
  21. func get_plugin_icon():
  22. # Must return some kind of Texture for the icon.
  23. 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