最終確認日

Godotのプラグインについて

プラグインには 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 を選択。

Godotのエディタプラグインを作ってみる-1755074388118

プラグインの情報を設定して、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?: オン (今すぐアクティブにする)

Godotのエディタプラグインを作ってみる-1755074413304

作成後、次の2点を確認する。

  • res://addons 以下にファイルが作成されていること
  • Project > Project Settings > Plugin よりオンになっていること

設定内容を変更したい場合は、plugin.cfg を直接編集するか、Project > Project Settings > Plugin より Edit ボタンから修正もできる。

Godotのエディタプラグインを作ってみる-1755074933424

plugin.cfg 設定ファイル

プラグインの設定をするメタファイル。このファイルがあることで、プラグインという認識がされる。

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 を配置した。

Godotのエディタプラグインを作ってみる-1755078993297

このシーンがプラグインがアクティブ化された時に初期化されるように、エディタプラグインスクリプトのmy_editor_dock.gdで登録処理を書く。

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!

Godotのエディタプラグインを作ってみる-1755079668431

つづいて、 Project > Project Settings > Plugins で無効化して、ドックが削除されることを確認する。

Godotのエディタプラグインを作ってみる-1755079824158

print("Initialize Plugin!")print("Clean Up Plugin!") もOutput されていることが確認できた。

ボタンをクリックした時にprintしてみる

先ほどのドックシーンに配置したボタンを押した時にアクションをしてみる。 EditorPlugin を継承したスクリプトには書けないので、別のスクリプトを用意する。

ここからはいつも通り作ればいい感じ。

my_editor_dock.gd
@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 に表示されていることを確認できる。

Godotのエディタプラグインを作ってみる-1755081728340

EditorPluginスクリプトの他にも、プラグインが使用する全てのGDScriptは必ず*toolでもある*必要があります。 @tool がない全てのGDScriptは、エディタから使われる際に空のファイルのようにふるまいます! https://docs.godotengine.org/ja/4.x/tutorials/plugins/editor/making_plugins.html

今回の場合は @tool が必要。

おわりに

エディタプラグインの画面実装は、通常のゲームシーンを作るように実装できる。自由度も高そう。

全然関係はないが、なんとなく WordPress のプラグインを作っている時と同じような気持ちになった。

プラグインの基本構成がわかったところで、次は SwiftGodotTemplateのプラグインの中身を理解しよう と思う。

サイトアイコン
公開日
更新日