Godotのエディタプラグインを作ってみる
https://docs.godotengine.org/ja/4.x/tutorials/plugins/editor/making_plugins.htmlGodotのプラグインについて
プラグインには 2種類あり、プロジェクト内で任意のシーンに配置ができるカスタムノードと、エディタの機能を拡張することができるカスタムドックがある。
今回はエディタの機能を拡張するためのカスタムドックを作成する。
ドキュメント
エディタプラグインに必要なもの
今回は my_editor_plugin
という名前で作成することにする。必要なファイルは3ファイル。
- プラグイン設定用の
plugin.cfg
- スクリプトファイル
my_editor_plugin.gd
- エディタ上での表示を決める
my_editor_dock.tscn
これらは res://addons/my_editor_plugin/
に配置する。この .cfg
と .gd
の2つのファイルはエディタプラグイン以外でも必須である。
Godot/addons
├── my_editor_plugin
│ ├── plugin.cfg # プラグインの設定ファイル
│ ├── my_editor_dock.gd # プラグインのスクリプト。フォルダ名と異なる名前でもok
│ ├── my_editor_dock.gd.uid # 自動生成
│ ├── my_editor_dock.tscn # Godotエディタ上での表示を決定するシーン
プラグインを作成する
直接 res://addons
にファイルを配置しても認識されるが、Godot エディタからも作成できる。
Project
> Project Settings
を開き、Plugins
タブを開く。
Create New Plugins
を選択。
プラグインの情報を設定して、Create を選択。
- Project Name:
MyEditorPlugin
- Subfolder:
my_editor_plugin
(res://addons/my_editor_plugin
となる) - Description:
This is my personal editor plugin.
(プラグインの説明) - Author: 自分の名前
- Version: 0.1.0 (プラグインのバージョン。開発中は 0.1.0 とかの設定すると良さそう)
- Language: GDScript (C#を使えるように設定している場合にはC#も選択できるっぽい?)
- Script Name:
my_editor_plugin
(`res://addons/my_editor_plugin/my_editor_plugin.gd) - Activate now?: オン (今すぐアクティブにする)
作成後、次の2点を確認する。
res://addons
以下にファイルが作成されていることProject
>Project Settings
>Plugin
よりオンになっていること
設定内容を変更したい場合は、plugin.cfg
を直接編集するか、Project
> Project Settings
> Plugin
より Edit
ボタンから修正もできる。
plugin.cfg
設定ファイル
プラグインの設定をするメタファイル。このファイルがあることで、プラグインという認識がされる。
[plugin]
name="MyEditorPlugin"
description="This is my personal editor plugin."
author="uruly"
version="0.1.0"
script="my_editor_plugin.gd" # プラグインがアクティブのときに呼ばれるスクリプト
my_editor_plugin.gd
スクリプト
プラグインで扱うスクリプトには @tool
を使う必要がある。
また、プラグインのメインスクリプトであるこのファイルは、必ず EditorPlugin
を継承する必要がある。
@tool
extends EditorPlugin
func _enter_tree() -> void:
# プラグインの初期処理
pass
func _exit_tree() -> void:
# プラグインのクリーンアップ処理
pass
最低限、プラグインの初期化関数と、クリーンアップ関数が必要となる。
my_editor_dock.tscn
シーン
カスタムドックの場合に必要となるシーン。これは自動では作成されないため、res://addons/my_editor_plugin/
に作成する必要がある。
エディタドックとなるシーンのルートは必ず Control
を継承するノードでなくてはならない。
このファイルの名前は EditorPlugin
を継承したスクリプトとは異なる名前にするのが良さそう。
これは後々紐づけるスクリプトが、EditorPlugin
ではなく Control
を継承したものであってほしいため。
ドックを作成する
res://addons/my_editor_plugin/my_editor_dock.tscn
を作り、Contorl
ノードを親にして作成。適当に HogeButton
を配置した。
このシーンがプラグインがアクティブ化された時に初期化されるように、エディタプラグインスクリプトのmy_editor_dock.gd
で登録処理を書く。
@tool
extends EditorPlugin
var dock: Control
func _enter_tree():
# シーンを登録する.
dock = preload("res://addons/my_editor_plugin/my_editor_dock.tscn").instantiate()
add_control_to_dock(DOCK_SLOT_LEFT_UL, dock)
print("Initialize Plugin!")
func _exit_tree():
# プラグインを無効化した時にドックを削除する.
remove_control_from_docks(dock)
# メモリから削除する.
dock.free()
print("Clean Up Plugin!")
プラグインがすでに有効化されている場合は、このファイルを書き換えた後に、_enter_tree()
は呼ばれない。
そのため、Reload Current Project
をするか、Project Settings
> Plugins
で一度無効化した後に再度有効化する必要がある。
add_control_to_dock(DOCK_SLOT_LEFT_UL, dock)
で指定した位置に表示されればok!
つづいて、 Project
> Project Settings
> Plugins
で無効化して、ドックが削除されることを確認する。
print("Initialize Plugin!")
と print("Clean Up Plugin!")
もOutput されていることが確認できた。
ボタンをクリックした時にprintしてみる
先ほどのドックシーンに配置したボタンを押した時にアクションをしてみる。
EditorPlugin
を継承したスクリプトには書けないので、別のスクリプトを用意する。
ここからはいつも通り作ればいい感じ。
@tool
extends Control
@onready var hoge_button = $HogeButton
func _ready() -> void:
hoge_button.pressed.connect(_on_hoge_button_pressed)
func _on_hoge_button_pressed():
print("Editor Dog のボタンがクリックされたよ!")
ボタンを押したら、Output に表示されていることを確認できる。
EditorPluginスクリプトの他にも、プラグインが使用する全てのGDScriptは必ず*toolでもある*必要があります。
@tool
がない全てのGDScriptは、エディタから使われる際に空のファイルのようにふるまいます! https://docs.godotengine.org/ja/4.x/tutorials/plugins/editor/making_plugins.html
今回の場合は @tool
が必要。
おわりに
エディタプラグインの画面実装は、通常のゲームシーンを作るように実装できる。自由度も高そう。
全然関係はないが、なんとなく WordPress のプラグインを作っている時と同じような気持ちになった。
プラグインの基本構成がわかったところで、次は SwiftGodotTemplateのプラグインの中身を理解しよう と思う。
