Godot4 プラグインの場所に関係なく外部からリソースファイルを取得する例

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

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

プラグインは任意の位置にインストールできる

プラグインは、スクリプトやリソースのファイル群が入っているフォルダとして追加されます。

Godot4 自作プラグインの構成例

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

Godot4 絶対パスのpreloadが失敗する例3

たとえば、ファイルシステムドックで、自作プラグインのフォルダを移動して

  • res://addons/(プラグイン名)/
  • res://addons/my/(プラグイン名)/

に移動することもできます。

Godot4 自作プラグインをデフォルトのインストールフォルダ以外に配置する例

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

Godot4 プラグイン内のシーンファイルを外部から利用する例2
## 外部のスクリプトから、絶対パスでプラグイン内のシーンファイルを読み込みます。
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 シーンファイル)を利用するには、自作プラグインでそのシーンファイルを取得する関数提供する方法が挙げられます。

  1. プラグイン内のスクリプトで、プラグイン内のリソースファイルを相対パスで読み込む
  2. プラグイン内のスクリプトで、読み込んだリソースファイルを取得する関数を定義
  3. 外部のスクリプトで、取得関数を使ってどこかに配置されているプラグインのリソースファイル取得
Godot4 プラグイン内のシーンファイルを外部から利用する例3

先ほど話したように、同じプラグイン内のスクリプトファイルならば、相対パスによって配置場所を意識せずにプラグイン内の別のファイルにアクセスできます。

相対パスによって 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 シーンファイルを読み込んで、それをポップアップさせることができました。

Godot4 プラグイン内のシーンファイルを外部から利用する例

まとめ

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

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました