Godotのサンプルコードでは、シーンやリソースのパス指定を文字列にしていることが多いです。例えば以下のようなコードです。
## なすシーンの読み込み.
const NASU_OBJ = preload("res://src/fruit/FruitNasu.tscn")
...
# なすの生成
var nasu = NASU_OBJ.instantiate()
「文字列だとパスが変わったときに動かなくなるので、あまり良くないでは…?」という意見もよく見かけるので、リソースパスを文字列以外で指定する方法について説明します。
目次
シーン・リソースの指定を文字列以外にする方法
@export でエディタから設定できるようにする
Godot Engineには @export というキーワードがあって、これを指定するとエディタからパラメータを指定することができます。
例えばシーンデータであれば、PackedScene というデータ型なので以下のようにスクリプトに記述します。
## なすシーン.
@export var NASU_OBJ:PackedScene
するとインスペクタにパラメータが追加されるので、「v」をクリックして「クイックロード」を選びます。

ダイアログから読み込みたいシーンを選びます。

するとシーンが設定されたので、後は preload() で読み込んだときと同じ方法でシーンを扱うことができます。

例えば敵のシーンが複数ある場合には、データ型を配列(Array)にすることで複数のシーンを登録できます。
## シーンの配列.
@export var FRUIT_OBJ_LIST:Array[PackedScene]
するとインスペクタのパラメータが配列になるので、クリックしてサイズ(要素数)を指定します(ここでは “12” としました)。

これで複数のシーンをまとめて配列に登録できます。

後は1つずつシーンを登録しています。

その他のリソースを指定できるようにする
Godot Engineでデータ型として定義してあるものであれば、ほぼすべてのリソースを @export で指定できるようです。
以下簡単に列挙しておきます。
データの種類 | データ型 |
---|---|
画像リソース | Texture |
サウンド | AudioStream |
すべてのリソース | Resource |
シーン以外でよく使いそうなリソースはこのあたりでしょうか…。”Resource” を指定するとすべてのリソースが指定可能となります。対応しているリソースの一覧は GODOT DOCS > Resource を参考に…。
3D機能はあまり使わないのでよくわかっていないですが、”Mesh“や”Animation“、”Meterial” なども指定できるようです。
文字列指定でもドラッグ&ドロップできる
この記事の趣旨からは離れてしまいますが、個人的にはリソースパスは文字列指定を好んで使っています。
その場合でも、リソースをスクリプトにドラッグ&ドロップすることでパスを指定できるので、現状はこの方法が個人的には一番なのかなと思っています。

ただ Dictionary に型を指定できるようになったら、プログラム上にパスを指定するよりも楽に指定できるので、そうなったらこの方法は卒業するかもしれません…。