====== Plugins ======
Mit Plugins ist es leicht den Funktionsumfang von Godot zu erweitern. Das Interessante dabei ist, dass wir weiter mit GDScript arbeiten können und nichts kompilieren müssen. Godot muss nicht mal neugestartet werden, um das Plugin benutzen zu können.
Üblicher Weise werden Plugins mit dem jeweiligen Programm verknüpft, wodurch sie künftig ständig aktiv sind. Godot geht hier einen anderen Weg. Die benötigten Plugins müssen ins jeweilige Projekt kopiert werden. Aber lassen wir uns doch zunächst einmal ein Plugin erstellen.
===== Vorbereitung =====
Wir beginnen mit einem neuen Projekt, welches wir über die Godot Engine Projektverwaltung neu anlegen.
Seit Version 3.1 übernimmt Godot das anlegen der benötigten Verzeichnisse und Dateien.
Das hierzu benötigte Dialogfenster erreichen wir über:\\
Menü(Projekt) ⇒ Menüpunkt(Projekteinstellungen) ⇒ Dialogfenster ⇒ Reiter (Erweiterungen)
{{:godot:syntax:projekteinstellungen_erweiterung.png}}
Mit dem Button(Erstellen) gelangen wir zu diesem Dialogfenster:
{{:godot:syntax:projekteinstellung_plugin_erstellen.png}}
In diesem Dialogfenster tragen wir die benötigten Informationen ein. In die Zeile Unterverzeichnis
müssen wir lediglich den Namen des Verzeichnisses my_plugin und nicht den gesamten Pfad angeben. Selbiges bei dem Skriptnamen plugin.gd
Mit einem Klick auf den Button(Erstellen) sind alle Vorbereitungen getroffen.
===== Neues Node =====
Über das Panel(Dateisystem) => addons => my_plugin => plugin.gd\\
öffnen wir die eben erstellte Datei mit einem Doppelklick.
Dieses Skript erweitern wir:
tool
extends EditorPlugin
func _enter_tree():
# Initialisierung des Plugins
add_custom_type("MyButton", "Button", preload("button.gd"), preload("icon.png"))
func _exit_tree():
# Entfernen aus dem System beim Beenden
remove_custom_type("MyButton")
Beim Einhängen in den Baum erweitern wir die Nodes mit folgenden Befehl:
add_custom_type() hat folgende Parameter:
* Name des Plugins
* Basistyp welchen wir erweitern wollen
* Eigentliche Skriptdatei
* Bilddatei des Icons (32×32 Pixel groß)
Beim Beenden des Baumes entfernen wir unsern Node wieder.
Die angegebene Icon-Datei sollten wir im entsprechenden Verzeichnis %%res://addons/my_plugin%%
hinterlegen.
Den neuen Node wird das noch nicht existierende Skript button.gd zugewiesen. Dies erstellen wir jetzt mit folgenden Inhalt:
tool
extends Button
func _enter_tree():
connect("pressed", self, "clicked")
func clicked():
print("Der Button wurde gedrückt")
Bei dem Signal(pressed) wird die Funktion(clicked) aufgerufen.
Aktivieren, beziehungsweise deaktivieren, können wir das Plugin über das Dialogfenster:\\
Menü(Projekt) ⇒ Menüpunkt(Projekteinstellungen) ⇒ Dialogfenster ⇒ Reiter (Erweiterungen)
Listbox(Status) = Active
{{:godot:syntax:projekteinstellung_erweiterungen.png}}
Schon fertige Plugins können in das Verzeichnis %%res://addons%% kopiert werden und über dieses Dialogfenster aktiviert werden.
Anpassungen z.B. der Versionsnummer welche in der plugin.cfg gespeichert werden, können wir hier in der jeweiligen Zeile über das Stift-Symbol Spalte(Bea) editieren.
===== Neues Dock =====
Nun wollen wir noch tiefer in die Godot-Engine eingreifen. Wir erstellen ein eigenes Panel oder Dock wie es bei Godot heißt. Wir sind so quasi in der Lage unsere eigene Godot-Benutzeroberfläche zu erstellen, beziehungsweise die Godot-Engine zu erweitern.
Wir führen hierzu alle Punkte der Vorbereitung durch.
Name und Verzeichnis sollten aber ein anderes sein! Im Verzeichnis addons können wir beliebig viele Plugins, in ihren jeweils eigenen Verzeichnissen haben.
Über das Panel(Dateisystem) => addons => my_plugin => plugin.gd\\
öffnen wir die eben erstellte Datei mit einem Doppelklick und ändern diesmal das Skript wie folgt ab:
tool
extends EditorPlugin
var dock # Unsere Szene
func _enter_tree():
dock = preload("res://addons/MyTab/my_tab.tscn").instance()
add_control_to_dock(DOCK_SLOT_LEFT_UL, dock)
func _exit_tree():
remove_control_from_docks(dock) # Löschen Dock
dock.free() # Löschen Szene aus Speicher
Diesmal binden wir eine Szene ein, welche aus Nodes der Basisklasse Control bestehen.
Diese Szene müssen wir noch erstellen und in unser Verzeichnis my_plugin verschieben.
add_control_to_dock() hat folgende Parameter:
* Position in der Godot-Engine des neuen Docks
* Zeiger auf das neue Dock
Aktivieren, beziehungsweise deaktivieren, können wir das Dock ebenfalls über das Dialogfenster:\\
Menü(Projekt) ⇒ Menüpunkt(Projekteinstellungen) ⇒ Dialogfenster ⇒ Reiter (Erweiterungen)
Listbox(Status) = Active
OK, so ein nacktes Dock zeigt zwar wie einfach es ist eins zu erstellen, nur ist es so nutzlos.
Stellen wir uns vor, wir wollen in einer 3D-Szene ständig, an selektierte Nodes, eine CSGBox anhängen. Da wäre doch ein Dock mit einem entsprechenden Button hilfreich?
Was fehlt ist das Skript und der Button, das Dock haben wir ja schon.
Also fügen wir unserm RootNode aus der Dock-Szene ein Skript hinzu.
Danach platzieren wir ein Button:\\
RootNode selektieren => RMT => + Node hier anhängen\\
Control => BaseButton => Button
Dock(Inspektor) => Text = dem Button eine Sinnvolle Beschriftung verpassen.
Dock(Node) => Signale => pressed() = klicken
Im Dialogfenster unter Mit Node Verbinden, das RootNode auswählen und den Button(Verbinden) drücken.
Jetzt sollten wir uns in dem Skript des RootNodes befinden, hier ergänzen wir das Skript:
tool
extends Control
var edi
var selnodes
func _init():
var plugin = EditorPlugin.new()
edi = plugin.get_editor_interface()
plugin.queue_free()
func _on_Button_pressed():
selnodes = edi.get_selection().get_selected_nodes()
if not selnodes.empty():
var newBox = CSGBox.new()
var obj = selnodes[0]
print(obj.name)
obj.add_child(newBox)
newBox.set_owner(get_tree().edited_scene_root)
--- //windy -- 24.04.2019//