Godotでは変数に@export
を付けるとインスペクターに表示して編集できます。Unityの[SerializeField]
と同等のものです。表示できるのは組み込み型やNodeなどの一部のクラスなので、ユーザークラスはそのままでは出力できません。この制約もUnityと同様です。
Unityではユーザークラスに[Serializable]
属性をつけることでインスペクターに表示できます。GodotではユーザークラスをResource
から継承します。
例えばインスペクターで編集したいデータのクラスを以下のように定義します。
class_name LoadSceneData extends Resource ## シーンの読み込みデータ ## シーン @export var scene: PackedScene ## 読み込み済みのシーンをリロードするときにチェック。チェックがなければ既存のシーンをそのまま使う。 @export var is_reload_when_exists: bool
これを利用するためのノードの子クラスを以下のように定義します。
class_name FuncLoadScenes extends Node ## シーン読み込み機能 @export var scenes: Array[LoadSceneData]
このFuncLoadScenesクラスを任意のノードにアタッチすると、インスペクターに項目が表示されてリソースの新規作成や読み込みができるようになります。
新規で要素を作成すればデータクラスの要素を編集できます。
Resourceのよいところは、設定したデータを保存できることです。
データを他の場面で再利用するのに便利です。
配列をまとめて保存
保存はResourceごとに行うので上記の例では配列全体の保存ができません。配列として保存したい場合は、配列を定義したResourceを継承したクラスをさらに用意します。
class_name LoadScenes extends Resource @export var scenes: Array[LoadSceneData]
先のNodeのクラスの定義をLoadScenesに変更します。
class_name FuncLoadScenes extends Node ## シーン読み込み機能 @export var scenes: LoadScenes
これで配列がResourceに含まれるようになるので配列をまるごと保存できるようになります。
まとめ
Godotでユーザークラスをインスペクターで編集するには、ユーザークラスをResourceから継承します。Resourceを継承したクラスにResourceを継承したクラスを持たせることができるので、扱いたい範囲に応じてクラスを用意します。Resourceクラスはデータの保存や読み込みができるのでUnityのプリセットのように利用することができます。
Resourceを継承したクラスで表示したい変数にも@export
が必要です。@exportをつけないとその変数はインスペクターには表示されなくなります。