制作主屏幕插件
本教程涵盖的内容
正如在 制作插件 页面中所看到的,制作一个扩展编辑器的基本插件是相当容易的.主屏幕插件允许你在编辑器的中心部分创建新的用户界面,它们出现在 “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