Создание плагинов главного экрана
Что охватывает этот урок
Плагины главного экрана позволяют создавать новые пользовательские интерфейсы в центральной части редактора, которые отображаются рядом с кнопками "2D", "3D", "Script", "Game", и "AssetLib". Такие плагины редактора называются "Main screen plugins".
В этом руководстве мы покажем вам, как создать простой плагин для главного экрана. Для простоты наш плагин будет содержать одну кнопку, которая выводит текст в консоль.
Инициализация плагина
Сначала создайте новый плагин в меню Plugins. В этом руководстве мы поместим его в папку main_screen, но вы можете использовать любое другое имя.
Скрипт плагина будет содержать методы _enter_tree() и _exit_tree(), но для плагина главного экрана нам нужно добавить несколько дополнительных методов. Добавьте 5 дополнительных методов, чтобы скрипт выглядел так:
@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 EditorInterface.get_editor_theme().get_icon("Node", "EditorIcons")
#if TOOLS
using Godot;
[Tool]
public partial class MainScreenPlugin : EditorPlugin
{
public override void _EnterTree()
{
}
public override void _ExitTree()
{
}
public override bool _HasMainScreen()
{
return true;
}
public override void _MakeVisible(bool visible)
{
}
public override string _GetPluginName()
{
return "Main Screen Plugin";
}
public override Texture2D _GetPluginIcon()
{
return EditorInterface.Singleton.GetEditorTheme().GetIcon("Node", "EditorIcons");
}
}
#endif
Важная часть этого скрипта — функция _has_main_screen(), которая перегружена и возвращает true. Эта функция автоматически вызывается редактором при активации плагина, чтобы сообщить ему, что плагин добавляет в редактор новое центральное представление. Пока мы оставим этот скрипт как есть и вернёмся к нему позже.
Главная сцена экрана
Создайте новую сцену с корневым узлом, производным от Control (в этом примере плагина мы сделаем корневым узлом CenterContainer). Выберите этот корневой узел и в области просмотра нажмите меню Layout и выберите Full Rect. Также необходимо включить флажок Expand для вертикального размера в инспекторе. Теперь панель занимает всё доступное пространство в основной области просмотра.
Теперь добавим кнопку в наш пример плагина главного экрана. Добавьте узел Button и задайте текст "Print Hello" или аналогичный. Добавьте скрипт к кнопке следующим образом:
@tool
extends Button
func _on_print_hello_pressed():
print("Hello from the main screen plugin!")
using Godot;
[Tool]
public partial class PrintHello : Button
{
private void OnPrintHelloPressed()
{
GD.Print("Hello from the main screen plugin!");
}
}
Затем соедините сигнал "pressed" с самим собой. Если вам нужна помощь с сигналами, см. статью Использование сигналов.
С панелью главного экрана всё готово. Сохраните сцену как 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.instantiate()
# Add the main panel to the editor's main viewport.
EditorInterface.get_editor_main_screen().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 EditorInterface.get_editor_theme().get_icon("Node", "EditorIcons")
#if TOOLS
using Godot;
[Tool]
public partial class MainScreenPlugin : EditorPlugin
{
PackedScene MainPanel = ResourceLoader.Load<PackedScene>("res://addons/main_screen/main_panel.tscn");
Control MainPanelInstance;
public override void _EnterTree()
{
MainPanelInstance = (Control)MainPanel.Instantiate();
// Add the main panel to the editor's main viewport.
EditorInterface.Singleton.GetEditorMainScreen().AddChild(MainPanelInstance);
// Hide the main panel. Very much required.
_MakeVisible(false);
}
public override void _ExitTree()
{
if (MainPanelInstance != null)
{
MainPanelInstance.QueueFree();
}
}
public override bool _HasMainScreen()
{
return true;
}
public override void _MakeVisible(bool visible)
{
if (MainPanelInstance != null)
{
MainPanelInstance.Visible = visible;
}
}
public override string _GetPluginName()
{
return "Main Screen Plugin";
}
public override Texture2D _GetPluginIcon()
{
// Must return some kind of Texture for the icon.
return EditorInterface.Singleton.GetEditorTheme().GetIcon("Node", "EditorIcons");
}
}
#endif
Было добавлено несколько конкретных строк. MainPanel — это константа, которая содержит ссылку на сцену, и мы создаем ее экземпляр в main_panel_instance.
Функция _enter_tree() вызывается перед _ready(). Здесь мы создаём экземпляр сцены главной панели и добавляем их в качестве дочерних элементов определённых частей редактора. Мы используем EditorInterface.get_editor_main_screen() для получения главного экрана редактора и добавляем к нему экземпляр нашей главной панели в качестве дочернего элемента. Мы вызываем функцию _make_visible(false), чтобы скрыть главную панель, чтобы она не занимала место при первой активации плагина.
Функция _exit_tree() вызывается при деактивации плагина. Если главный экран всё ещё существует, мы вызываем queue_free(), чтобы освободить экземпляр и удалить его из памяти.
Функция _make_visible() переопределяется для скрытия или отображения главной панели по мере необходимости. Эта функция автоматически вызывается редактором при нажатии пользователем на кнопки главной области просмотра в верхней части редактора.
Функции _get_plugin_name() и _get_plugin_icon() управляют отображаемым именем и значком для главной кнопки области просмотра плагина.
Другая функция, которую вы можете добавить, — это функция handles(), которая позволяет обрабатывать тип узла, автоматически фокусируя главный экран при выборе этого типа. Это похоже на то, как щелчок по 3D-узлу автоматически переключает на 3D-окно просмотра.
Попробуйте плагин
Активируйте плагин в настройках проекта. Вы увидите новую кнопку рядом с пунктами 2D, 3D, Script над основным окном просмотра. Нажав на неё, вы перейдёте к новому плагину главного экрана, а кнопка посередине выведет текст.
Если вы хотите попробовать готовую версию этого плагина, ознакомьтесь с демонстрациями плагинов здесь: https://github.com/godotengine/godot-demo-projects/tree/master/plugins
Если вы хотите увидеть более полный пример того, на что способны плагины главного экрана, ознакомьтесь с демонстрационными проектами 2.5D здесь: https://github.com/godotengine/godot-demo-projects/tree/master/misc/2.5d