無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、リソースの読み込みを行う preload 関数で絶対パスのかわりに相対パスを指定することのメリットについて紹介します。
アドオンをインストールする際にインストール先フォルダを指定できることや、 load 関数と preload 関数の違いについても紹介します。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
絶対パスの際に生じるエラーの例
以下は、preload 関数で絶対パスのシーンファイルを読み込むスクリプト例です。
## パラメータを入力するダイアログのシーンです。
var sc_fit_font_size_dialog_scene: PackedScene = preload("res://addons/sc_fit_font_size/sc_fit_font_size_dialog.tscn")
これは自作アドオンのスクリプトの一部なのですが、その自作アドオンをフォルダごと別の場所に移動してしまうと、絶対パスで指定したファイルが読み込めなくなります。

res://addons/my/sc_fit_font_size/sc_fit_font_size.gd:11 - Parse Error: Preload file "res://addons/sc_fit_font_size/sc_fit_font_size_dialog.tscn" does not exist.
エディタ起動時などにも以下のように「Failed to load script “preload を行っている gd スクリプトファイルパス” with error “Parse error”」というエラーメッセージが表示され、そのアドオンが機能しません。

この問題は、絶対パスの代わりに相対パスで preload するファイルを指定することで回避できます。
※ preload を行う gd ファイルと読み込むファイルの相対的な位置が変わる場合は、この方法では対応できません。
## パラメータを入力するダイアログのシーンです。
var sc_fit_font_size_dialog_scene: PackedScene = preload("./sc_fit_font_size_dialog.tscn")
アドオンはインストール先を変えられることに注意
preload 関数で絶対パスでファイルを指定しても、そのファイルを別の場所に移動しない限り、そのパスは正しいので問題ありません。
しかし、それらのファイル群をプラグインなどのアドオンとして公開する場合、アドオンは、インストール時にユーザがインストール先フォルダを指定できます。

その際に、デフォルトの res://addons/(アドオン名)/ 以外の、他の場所に配置されてもエラーが起きないようにすると良いでしょう。
相対パスに変えた後の動作確認
相対パスに変えて、エディタを再起動するとエラーは表示されません。
ただし、エラーを起こした時点でプラグインとして無効になってしまっているので、利用するには、メニュー「プロジェクト」→「プロジェクト設定」で「プロジェクト設定」ダイアログを表示して、「プラグイン」タブのそのプラグインの「有効」にチェックを入れなおす必要があります。

このプラグインは、ツールメニューから選択すると、先ほど preload したシーンをポップアップで表示して、パラメータの入力を求めます。
preload の引数を絶対パスから相対パスに変えた後に、そのシーンが正しくポップアップするかを確認するため、メニュー「プロジェクト」→「ツール」から追加したツールメニューを選択します。

相対パスの preload で指定したシーンファイルが、正しく読み込まれ、以下のようにポップアップとして正しく表示されました。

preload と load の読み込みタイミングの違い
preload 関数は、スクリプトが読み込まれたタイミングで、リソースファイルをできるだけ早く読み込みます。
そのため、ゲームが開始した後の読み込みによる遅延やパフォーマンスの低下を予防できます。
しかし、最初の読み込みに時間がかかるリスクもあるため、途中で読み込んでも構わない場合は、次に紹介する load 関数の方が良いかもしれません。
load 関数は、その load 関数が実行されるタイミングでリソースファイルを読み込みます。
読み込むタイミングを任意で決められるメリットがありますが、容量の大きいリソースファイルなどの場合、ゲームプレイ中に重くなるリスクもあります。
GDScript には、グローバル preload メソッドが存在します。”読み込み” 処理を前もって行い、パフォーマンスに敏感なコードの途中で、リソースの読み込が発生することを回避するために、できるだけ早くリソースを読み込みます。
対応する load メソッドは、load ステートメントに到達したときにのみリソースをロードします。つまりリソースをその場でロードするため、リアルタイム性の高いプロセスの途中で行うと速度低下を引き起こす可能性があります。
ロジックの設定 — Godot Engine (4.x)の日本語のドキュメントload()
関数は、すべてのスクリプト言語からアクセスできる ResourceLoader.load(path) のエイリアスでもあります。
まとめ
無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、リソースの読み込みを行う preload 関数で絶対パスのかわりに相対パスを指定することのメリットについて紹介しました。
アドオンをインストールする際にインストール先フォルダを指定できることや、 load 関数と preload 関数の違いについても紹介しました。
参照サイト 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
記事一覧 → Compota-Soft-Press
コメント