無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、どの場所に配置されているかわからないプラグイン(アドオン)などの持つリソースファイルを外部から取得するスクリプト例を紹介します。
プラグイン以外でも、クラス名を設定した gd スクリプトと、そのスクリプトと相対パスにあるリソースファイルを得る場合にも使えます。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
プラグインは任意の位置にインストールできる
プラグインは、スクリプトやリソースのファイル群が入っているフォルダとして追加されます。

デフォルトのインストール先フォルダは res://addons/(プラグイン名)/ ですが、インストールの段階でも「インストールフォルダを変更」でインストール先フォルダを変更できます。

たとえば、ファイルシステムドックで、自作プラグインのフォルダを移動して
- res://addons/(プラグイン名)/
- res://addons/my/(プラグイン名)/
に移動することもできます。

もしも、外部で、このプラグインの .tscn シーンファイルを読み込んで、ポップアップとして表示させたい場合、以下のように preload で指定していると、常に、そのプラグインの配置場所を考慮してパスを変更する必要があります。

## 外部のスクリプトから、絶対パスでプラグイン内のシーンファイルを読み込みます。
var sc_fit_font_size_dialog_scene: PackedScene = preload("res://addons/my/sc_fit_font_size/sc_fit_font_size_dialog.tscn")
上記のコードのように、my フォルダの下に配置した場合は、 preload 関数のパスにそれを反映する必要があります。
もしも、同じプラグイン内のスクリプトファイルから読み込む場合は、同じフォルダ内という特徴を活かして、相対パスによって
## プラグイン内のスクリプトから、同じプラグイン内のシーンファイルを読み込みます。
var sc_fit_font_size_dialog_scene: PackedScene = preload("./sc_fit_font_size_dialog.tscn")
のように取得することもできますが、外部のスクリプトファイルでは、同じフォルダ内にはないので相対パスでも解決できません。
自作プラグインのファイルを外部で利用する例
外部のスクリプトから、プラグイン内のファイル(例では .tscn シーンファイル)を利用するには、自作プラグインでそのシーンファイルを取得する関数を提供する方法が挙げられます。
- プラグイン内のスクリプトで、プラグイン内のリソースファイルを相対パスで読み込む
- プラグイン内のスクリプトで、読み込んだリソースファイルを取得する関数を定義
- 外部のスクリプトで、取得関数を使ってどこかに配置されているプラグインのリソースファイルを取得

先ほど話したように、同じプラグイン内のスクリプトファイルならば、相対パスによって配置場所を意識せずにプラグイン内の別のファイルにアクセスできます。
相対パスによって preload 関数で読み込んでおいたシーンファイル(PackedScene) を、静的変数で保持して、 get_sc_fit_font_size_dialog_scene 関数によって取得できるようにします。
このとき、static キーワードをつけて、静的関数にすることでクラス名と関数名だけで外部からアクセスできるようにします。
クラス名は class_name で指定できます。
また、その関数の戻り値である、シーンファイルを読み込んだ変数も static var, const など静的変数にします。
@tool
extends EditorPlugin
class_name ScFitFontSizePlugin
## 選択されているノード群にテキストを持ったコントロールがある場合に、
## コントロールのサイズからはみ出ない最大のサイズにフィットしたフォントサイズに自動調節するエディタ拡張です。
## メニュー「プロジェクト」→「ツール」に追加されたメニューアイテムを選択することで実行されます。
## メニューアイテムの表示名です。
const tool_menu_item_name: StringName = "Sc Fit Font Size"
## パラメータを入力するダイアログのシーンです。
static var sc_fit_font_size_dialog_scene: PackedScene = preload("./sc_fit_font_size_dialog.tscn")
## ScFitFontSize プラグインのパラメータ入力で用いるダイアログを得ます。
static func get_sc_fit_font_size_dialog_scene() -> PackedScene:
return sc_fit_font_size_dialog_scene
外部のスクリプトからは、プラグインのパスを意識せずに、プラグインの持つクラス名と静的関数によって、間接的にプラグイン内のファイルを取得できます。
extends Control
## ScFitFontSize プラグインのパラメータを入力するダイアログのシーンです。
var sc_fit_font_size_dialog_scene: PackedScene
# Called when the node enters the scene tree for the first time.
func _ready():
sc_fit_font_size_dialog_scene = ScFitFontSizePlugin.get_sc_fit_font_size_dialog_scene()
preload の相対パスと絶対パスについては以下の記事も参照してください。
テスト
プラグインの外部にある、スクリプトで間接的にプラグイン内の .tscn シーンファイルを読み込んで、それをポップアップさせることができました。

まとめ
今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、どの場所に配置されているかわからないプラグイン(アドオン)などの持つリソースファイルを外部から取得するスクリプト例を紹介しました。
プラグイン以外でも、クラス名を設定した gd スクリプトと、そのスクリプトと相対パスにあるリソースファイルを得る場合にも使えます。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- ロジックの設定 — Godot Engine (4.x)の日本語のドキュメント
- GDScriptリファレンス — Godot Engine (4.x)の日本語のドキュメント #classes-as-resources
- PackedScene — Godot Engine (4.x)の日本語のドキュメント
記事一覧 → Compota-Soft-Press
コメント