制作主屏幕插件
本教程涵盖的内容
正如在 制作插件 页面中所看到的, 制作一个扩展编辑器的基本插件是相当容易的. 主屏幕插件允许你在编辑器的中心部分创建新的用户界面, 它们出现在 “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
)。选择这个根节点,在视窗中,点击 布局
菜单,选择 整个矩形
。你还需要在检查器中启用 Expand
垂直尺寸标志。面板现在使用主视窗中的所有可用空间。
接下来, 让我们为我们的主屏幕插件示例添加一个按钮. 添加一个 Button
节点, 并将文本设置为 “Print Hello “或类似的内容. 给按钮添加一个脚本, 像这样:
tool
extends Button
func _on_PrintHello_pressed():
print("Hello from the main screen plugin!")
然后将 “按下” 信号连接到自身. 如果你需要信号方面的帮助, 请参考 使用信号 一文.
我们完成了主屏幕面板. 将场景保存为 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