Eine einfache Erweiterung erstellen (Hauptbildschirm)

Was diese Anleitung abdeckt

As seen in the Erweiterungen (Plugins) erstellen page, making a basic plugin that extends the editor is fairly easy. Main screen plugins allow you to create new UIs in the central part of the editor, which appear next to the "2D", "3D", "Script", and "AssetLib" buttons. Such editor plugins are referred as "Main screen plugins".

Diese Anleitung führt Sie durch die Erstellung eines grundlegenden Plugins für den Hauptbildschirm. Der Einfachheit halber enthält unser Hauptbildschirm-Plugin eine einzige Schaltfläche, mit der Text auf die Konsole gedruckt wird.

Erweiterung initialisieren

Erstelle zuerst ein neue Erweiterung aus dem Erweiterungs-Menü. In dieser Anleitung speichern wir diese im Verzeichnis main_screen, aber es kann auch ein anderer Name verwendet werden.

The plugin script will come with _enter_tree() and _exit_tree() methods, but for a main screen plugin we need to add a few extra methods. Add five extra methods such that the script looks like this:

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")

Der wichtige Teil in diesem Skript ist die Funktion has_main_screen(), die überladen ist, so dass sie true zurückgibt. Diese Funktion wird automatisch vom Editor bei der Aktivierung des Plugins aufgerufen, um ihm mitzuteilen, dass dieses Plugin dem Editor eine neue Zentralansicht hinzufügt. Für den Moment belassen wir dieses Skript so, wie es ist und kommen später darauf zurück.

Hauptbildschirms-Szene

Erstellen Sie eine neue Szene mit einem Wurzelnode, das von Control abgeleitet ist (für dieses Beispiel-Plugin werden wir das Wurzelnode zu einem CenterContainer machen). Wählen Sie dieses Wurzelnode aus, und klicken Sie im Ansichtsfenster auf das Menü Layout und wählen Sie Full Rect. Man muss auch das Kennzeichen Expand für die vertikale Größe im Inspektor aktivieren. Das Panel nutzt nun den gesamten verfügbaren Platz im Hauptfenster.

Als nächstes fügen wir eine Schaltfläche zu unserem Beispiel-Hauptbildschirm-Plugin hinzu. Fügen Sie ein Button-node hinzu, und setzen Sie den Text auf "Print Hello" oder ähnlich. Fügen Sie der Schaltfläche ein Skript wie dieses hinzu:

tool
extends Button


func _on_PrintHello_pressed():
    print("Hello from the main screen plugin!")

Verbinden Sie dann das "pressed"-Signal mit sich selbst. Wenn Sie Hilfe zu Signalen benötigen, lesen Sie den Artikel Signale nutzen.

Wir sind mit dem Hauptbildschirm fertig. Speichern Sie die Szene als main_panel.tscn.

Aktualisieren des Plugin-Skripts

Wir müssen das Skript main_screen_plugin.gd aktualisieren, damit das Plugin unsere Hauptpanel-Szene instanziiert und dort platziert, wo sie sein soll. Hier ist das vollständige Plugin-Skript:

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")

Ein paar spezielle Zeilen wurden hinzugefügt. MainPanel ist eine Konstante, die eine Referenz auf die Szene hält, und wir instanzieren sie in main_panel_instance.

Die Funktion _enter_tree() wird vor _ready() aufgerufen. Hier instanzieren wir die Hauptpanel-Szene und fügen sie als Kinder bestimmter Teile des Editors hinzu. Wir benutzen get_editor_interface().get_editor_viewport(), um das Ansichtsfenster zu erhalten und fügen unsere Hauptpanel-Instanz als Kind dazu. Wir rufen die Funktion make_visible(false) auf, um das Haupt-Panel zu verstecken, damit es beim ersten Aktivieren des Plugins nicht um den Platz konkurriert.

Die Funktion _exit_tree() wird aufgerufen, wenn das Plugin deaktiviert wird. Wenn der Hauptbildschirm noch existiert, rufen wir queue_free() auf, um die Instanz freizugeben und aus dem Speicher zu entfernen.

Die Funktion make_visible() wird überschrieben, um das Hauptfenster je nach Bedarf ein- oder auszublenden. Diese Funktion wird automatisch vom Editor aufgerufen, wenn der Benutzer auf die Schaltflächen des Hauptfensters am oberen Rand des Editors klickt.

Die Funktionen get_plugin_name() und get_plugin_icon() steuern den angezeigten Namen und das Symbol für die Hauptschaltfläche des Plugins im Ansichtsfenster.

Eine weitere Funktion, die Sie hinzufügen können, ist die Funktion handles(), die es Ihnen ermöglicht, einen Nodetyp zu behandeln, indem sie automatisch den Hauptbildschirm fokussiert, wenn der Typ ausgewählt wird. Dies ist ähnlich, wie das Anklicken eines 3D-Knotens automatisch in das 3D-Ansichtsfenster wechselt.

die Erweiterung testen

Aktiviere das Plugin in den Projekt Einstellungen. Es wird ein neuer Knopf erscheinen, neben dem 2D, 3D, Skript, über dem Haupt-Ansichtsfenster. Wird dieser gedrückt, wird die neue Hauptbildschirm Erweiterung gestartet und der Knopf in der Mitte gibt den Text aus.

Wenn Sie eine fertige Version dieses Plugins ausprobieren möchten, sehen Sie sich die Plugin-Demos hier an: https://github.com/godotengine/godot-demo-projects/tree/master/plugins

Wenn Sie ein vollständigeres Beispiel für die Funktionen von Hauptbildschirm-Plugins sehen möchten, sehen Sie sich die 2.5D Demo-Projekte hier an: https://github.com/godotengine/godot-demo-projects/tree/master/misc/ 2.5d