🔌

Godotエディタアドオン制作

2022/12/05に公開

ふぉるたと申します。
Godot3、Godot4にてOSSエディタアドオンの制作・公開をしています。
ゲーム制作と並行して、「これがあったら便利だな~」というアドオンを作って公開しています。

GodotはMITライセンスのOSSであることから、文化的にアドオンもMITのものが多い傾向があり、コードを参考にしやすいです。
また、やりたいことが実現できるアドオンが見つかって、作らなくていいや、となることもあります。

コア・エディタ両方のソースコードを、すべて閲覧できるのはGodotの強みです。
他の人のアドオンに要望・修正のIssue、PRを出したり、ForkしてカスタムしやすいのはGodotならではの良ポイントだと私は考えています!

この記事では、エディタアドオンとはアドオンの中でも、「GodotエディタのGUIの一部として作成でき、ゲームのビルドに含めず、ゲームに組み込むことはない」ものとします。
今回はエディタアドオンを対象に概要と作り方を書きます。

うれしいこと エディタアドオンの利用

エディタのGUI操作ではできないことができるようになる

作業効率をUPできる

コードを使ってエディタ操作をマクロ的に実行できます。
GDNative、GDExtentionと組み合わせることで、C++コードも利用できます。

エディタぽちぽちで長時間かかる作業をアドオンにすることで、時間短縮できたときは気持ちいい!👍

うれしいこと エディタアドオンの制作

保守が楽

これがエディタアドオン制作のいちばんのおすすめポイントです。
配布するゲームに組み込んで動作させるアドオンだと、リリースビルドでのバグ対応などやることが多いですがエディタアドオンはエディタだけ。
しかも対象者がプレイヤーでは開発者ということでアドオンを始めるにはぴったりです。


エディタスクリプト(EditorScript)

エディタスクリプトはエディタ上ですぐに実行できるスクリプトです。
似たようなことは@tool をつけた通常のスクリプトでもできますが、違いがあります。

  • 直接実行をすることができる
  • EditorInterface へアクセスできる
  • 現在表示中のシーンツリーのノードへアクセスできる
  • 出力は「出力」コンソールではなく、エディタ自体のコンソールへ書き込まれる
@tool

extends EditorScript

func _run():
	var editor_interface:EditorInterface = get_editor_interface()
	var current_scene = get_scene()

EditorScriptを extends したスクリプトを、スクリプトエディタから実行できます。
ショートカットキー: Ctrl+Shift+X

使用例は、現在のシーンへノードを追加したり、値をほかのなにかから取得してまとめてノードの設定値を変えたり……など、簡単なマクロや手動バッチ処理のように使えます。

EditorInterfaceへアクセスできるのでエディタアドオンでできることはこちらでもできます。
大がかりなものはエディタアドオンのほうが向いていると思います。

エディタアドオンGUIの種類

エディタのGUIに欲しい機能がなければ、自分で欲しい機能を作ってエディタに入れましょう。

Godotエディタは、GodotのControlノードから構成されています。
エディタアドオンを作成することで、特定のエディタの場所に一部品のように、カスタムコントロールを追加することができます。

詳しくは公式ドキュメント
https://docs.godotengine.org/en/latest/tutorials/plugins/editor/making_plugins.html

  • ドック
  • ボトムパネル
  • インスペクター
  • メインスクリーン
  • メインスクリーンヘッダー

ドック


ドック(Dock)とは、「シーンツリー」「インスペクター」のように、エディタのサイドに置かれるコントロールです。
Godot4ではフローティングにでき、別ウィンドウにすることができるようになりました!

ドックの特徴

  • エディタ編集中、常に表示しておくことができる
  • Godot4ならフローティングもできる
  • サイドバーは既存のDockと同時に出すと幅をとってしまうので、使用頻度が低いならじゃまに感じる(他のドックを上に置いて隠せばよいが)
  • インスペクターのように使えるが、後述のようにインスペクターの中に追加もできるのでそちらでもよい

下パネル


下パネル(Bottom Panel)とは、Godotの下部にあり、「出力」「デバッグ」「アニメーション」などがある場所のパネルです。

下パネルの特徴

  • 常に下にあり、メイン画面と同時に表示できる
  • 1つしか開けず、他の下パネルと同時に使えないので、「出力」「アニメーション」などと同時に使うかもしれないアドオンでは避けた方が良さそう

既存の「アニメーション」や「タイルセット」などのように、特定のリソースを編集するときのみ表示するのも良いでしょう。

インスペクター


インスペクター(Inspecter)は、とてもよく使うので説明しなくても良さそうですが、
シーン上のノードや、ノードにセットしたリソースやファイルシステムに保存したリソースを選択したときに表示され、そのノード・リソースの設定値の変更ができるドックです。

インスペクターの特徴

  • 既存のインスペクタに新たに項目コントロールを追加できる。
  • 既存のインスペクタの項目を消すことはできない。

インスペクターアドオンは軽く作れて、効果も大きいのでおすすめです。

メインスクリーン


メインスクリーンは「2D」「3D」「スクリプト」のように画面全体を構成するコントロールです。

メインスクリーンの特徴

  • 占有面積が最も大きいアドオンなので大がかりなアドオンで使う。
  • 専用の大きな画面で編集を行うことができる。

エディターメニュー

エディターメニューは、「2D」または「3D」ビューの上部メニューです。
特定のノードを選択しているときにメインスクリーンヘッダーにコントロールを追加することができます。
既存エディタでの例として、「Sprite2D」を選択しているときに「Polygon2Dに変換する」ボタンが表示されますが、そんな感じのことができます。

エディターメニューの特徴

  • 選択中の特定のノードに対して処理をするときに便利。
    • インスペクターも似たような使い方ができるが、インスペクターは縦に長く埋もれてしまいがちなのでこちらに置いてもよいコマンドを置くとか?

ツール

ツールは、ウィンドウ上部メニューバーの「ツール」から実行できるコマンドです。
ここで実行して処理したり、シーンを起動したりできます。

その他エディタアドオンControl

他にもいろいろ追加できるようです。
EditorPluginのリファレンスにいろいろそれっぽい関数があります。

https://docs.godotengine.org/en/latest/classes/class_editorplugin.html


エディタアドオンTips

エディタ機能へのアクセス

アドオンでよく使う処理として、EditorXXXのような、エディタの機能へアクセスできるクラスがあります。

https://docs.godotengine.org/ja/latest/tutorials/plugins/editor/making_plugins.html#the-script-file

エディタ機能を使うには、最初にEditorPluginをextendsしたスクリプトで、get_editor_interface()を呼ぶことでEditorInterfaceのシングルトンを取得できます。

ここで、エディタのシーンツリーにset_metaで取得したEditorInterfaceをセットしておくと、シーンツリーに追加ノードからアクセスすることができて便利です。

シングルトンはアドオン以外のスクリプトに影響してしまうため使わないものとします。
他にも、class_nameでエディタアドオン用にクラスを作ると、クラス一覧に表示されてしまうので、使用しないようにしています。

EditorInterfaceをset_metaしておく

@tool
extends EditorPlugin

@onready var plugin_control = plugin_control_scene.instantiate()
var plugin_control_scene = preload("res://addons/plugin_control.tscn")

func _enter_tree():
	get_tree().set_meta("__editor_interface", get_editor_interface())

Godotエディタのアイコンをアドオンで使いたい

Godot3では、get_icon("File","EditorIcons")を呼ぶだけでどこからでもエディタアイコンのテクスチャを取得することができました……
しかし、Godot4ではこのやり方はできません。

Godot4ではエディタのControlのテーマから取ることができます。
エディタのControlにアクセスするにはEditorPluginのget_base_control()が楽でしょう。
editor_interface.get_base_control().theme.get_icon("IconName","EditorIcons")

アイコン名は、ここのsvgの拡張子を除いたファイル名と同じです。
https://github.com/godotengine/godot/tree/master/editor/icons

別ウィンドウとしてフローティングできるアドオンをつくりたい

Godot4ではWindowノードを使用すると、OSの別ウィンドウとして出ます!
Godot3では内部のウィンドウっぽいノードだったので、大きな進歩です。

エディタアドオンのシーンにWindowやその拡張ノードを配置し、popup_centered()などで表示してあげることで使用できます。
マルチモニタを考慮する場合はウィンドウの位置も良き位置に出すように調節が必要です。

ウィンドウの注意点

エディタの前に表示して、エディタのサブウィンドウ的に使いたいところです。
しかし、「always_on_top」とそれに関連する「transient」はすこし難しく、意図しない挙動やエラーが出ます。
最前面のウィンドウにすると右クリックメニューのようなさらに子ウィンドウを出す際にエラーが出ます。

エディタアドオンから現在編集中のシーンにアクセスしたい

主にドック、インスペクター、メインスクリーンヘッダーなどで使います。

@tool をつけ忘れないこと

GDScriptファイルをいっぱい作ると、@tool のつけ忘れをよくやってしまいがちです。
当然動きませんが、エラー内容が @tool つけ忘れてるよとも言ってくれないので時間を無駄にすることがたまにあります……

さいごに

小さな困りごとを解決するアドオンから、エディタの一画面のような大きなアドオンまで、「ぼくのかんがえたさいきょうのGodotエディタ」を作るのはとても楽しいのでおすすめです!
(アドオン沼にはまってゲーム開発をないがしろにすることがない程度に)アドオンつくっていきましょう!👍


私の作成したGodot3、Godot4のアドオンをいくつか公開しています。
https://github.com/folt-a

最近作ったGodot4のプラグイン、godot-project-design-linksはGodotエディタ上でMilanoteみたいなことができるアドオンです。

https://github.com/folt-a/godot-project-design-links
Godotエディタ内でプログラムファイルの関連設計図を作成したり(すぐジャンプできる!)、キャラクター相関図を作ることなどができて便利です。
お気に入りアドオンなので、これからも便利にしていきます!

Godot4も近づき、Godot日本語サーバーも盛り上がってきています!
Godotはじめるなら今!
https://discord.gg/DyFvSJZ

Discussion