【Godot4.x】シーン・リソースの指定を文字列以外にする方法

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() で読み込んだときと同じ方法でシーンを扱うことができます。

シーンは “PackedScene” 以外の型を指定することができない

@export に指定できるシーンは “PackedScene” のみです。

例えば Unreal Engine のようにデータ型 (クラス) を指定して対象を絞り込む…といったことには現状(v.4.1.2)では対応していないようです。

(おそらく「シーンはスクリプトに依存したデータ型ではない…」という設計思想があるのかもしれません)

配列で複数のシーンを登録する

例えば敵のシーンが複数ある場合には、データ型を配列(Array)にすることで複数のシーンを登録できます。

## シーンの配列.
@export var FRUIT_OBJ_LIST:Array[PackedScene]

するとインスペクタのパラメータが配列になるので、クリックしてサイズ(要素数)を指定します(ここでは “12” としました)。

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

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

Dictionaryにデータ型は指定できない

例えば Unreal Engine の TMap 型のように連想配列のデータ型を指定する…ということが Godot Engine (v4.1.2現在)ではできません

これは今後の対応に期待…というところです。

その他のリソースを指定できるようにする

Godot Engineでデータ型として定義してあるものであれば、ほぼすべてのリソースを @export で指定できるようです。

以下簡単に列挙しておきます。

データの種類データ型
画像リソースTexture
サウンドAudioStream
すべてのリソースResource

シーン以外でよく使いそうなリソースはこのあたりでしょうか…。”Resource” を指定するとすべてのリソースが指定可能となります。対応しているリソースの一覧は GODOT DOCS > Resource を参考に…。

3D機能はあまり使わないのでよくわかっていないですが、”Mesh“や”Animation“、”Meterial” なども指定できるようです。

文字列指定でもドラッグ&ドロップできる

この記事の趣旨からは離れてしまいますが、個人的にはリソースパスは文字列指定を好んで使っています。

その場合でも、リソースをスクリプトにドラッグ&ドロップすることでパスを指定できるので、現状はこの方法が個人的には一番なのかなと思っています。

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

参考