tanaka's Programming Memo

プログラミングについてのメモ。

【Godot4.x】インスペクターにユーザークラスの変数を表示する

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をつけないとその変数はインスペクターには表示されなくなります。