概要
動作確認環境: Godot 4.3+
Godotでプロジェクトが大きくなると、「この組み合わせのノードを何度も作っている」「インスペクタでの設定項目を整理したい」といった課題が出てきます。class_nameによるカスタムノード型の定義と@exportによるプロパティ公開を組み合わせると、エディタ上で再利用しやすい部品を作れます。
この記事では、カスタムノードの基本から、@exportの整理テクニック、カスタムResourceの作成、インスペクタの拡張まで解説します。
この記事でわかること
class_nameで 自作の部品をGodotのノードとして登録 する方法@icon・@export・@export_groupで エディタの使い勝手を上げる テクニック- カスタムResource でデータをファイルに分離して共有する設計
EditorInspectorPluginによるインスペクタ拡張(上級)
class_nameでカスタムノード型を定義
まずはカスタムノードの出発点、class_nameの宣言から始めましょう。class_nameをスクリプトに宣言すると、そのクラスがGodotエディタのグローバル型として登録されます。これにより、ノード追加ダイアログで検索できたり、型アノテーションで参照できたりと、コードの再利用性と型安全性が向上します。
たとえばアクションゲームなら、敵・プレイヤー・破壊可能オブジェクトに共通する「HP管理」をHealthComponentとして切り出せます。以下のコードでその基本形を実装してみましょう。
# health_component.gd
class_name HealthComponent
extends Node
signal died
signal health_changed(new_health: int)
@export var max_health: int = 100
var current_health: int
func _ready():
current_health = max_health
func take_damage(amount: int):
current_health = max(current_health - amount, 0)
health_changed.emit(current_health)
if current_health <= 0:
died.emit()
func heal(amount: int):
current_health = min(current_health + amount, max_health)
health_changed.emit(current_health)
登録 後にできること:
- 「ノードを追加」ダイアログで
HealthComponentを検索・追加できる - 型アノテーションで
var health: HealthComponentと書ける is演算子でif node is HealthComponent:と判定できる

tips:
class_nameはグローバル名前空間に登録されるため、プロジェクト内で同じ名前を使うとエラーになります。大規模プロジェクトやアドオン開発ではプレフィックスを付けるなどの対策を検討してください。
@iconでカスタムアイコンを設定
class_nameでノード型を定義したら、次はアイコンで見た目を整えましょう。@iconでエディタ上のアイコンをカスタマイズできます。シーンツリーにカスタムノードが増えてくると、デフォルトアイコンのままでは区別がつきにくくなります。専用アイコンを設定すると、ノードの役割を一目で把握しやすくなります。
@icon("res://icons/health_heart.svg")
class_name HealthComponent
extends Node
- シーンツリーとノード追加ダイアログの両方に反映される
- SVG形式を推奨(スケーリングで劣化しない)
- アイコンサイズは16x16pxで表示される
@icon("res://icons/hitbox.svg")
class_name HitboxComponent
extends Area2D
@export var damage: int = 10
@exportでインスペクタにプロパティを公開
カスタムノードの見た目が整ったところで、次はインスペクタから設定できるプロパティを用意してみましょう。@exportを付けた変数はインスペクタに表示され、エディタ上で編集可能になります。敵の移動速度やHPの最大値など、ゲームバランスに関わるパラメータをスクリプトを開かずに調整できるので、デザイナーとの協業もスムーズになります。
基本的な@exportアノテーション
class_name EnemyConfig
extends CharacterBody2D
# 基本型
@export var speed: float = 100.0
@export var enemy_name: String = "Goblin"
@export var is_boss: bool = false
# 範囲付き
@export_range(0, 100, 1) var health: int = 50
@export_range(0.0, 10.0, 0.1) var attack_interval: float = 2.0
# リソース参照
@export var sprite_texture: Texture2D
@export var death_effect: PackedScene
# 列挙型
@export_enum("Patrol", "Chase", "Guard") var ai_type: String = "Patrol"
# 色
@export var tint_color: Color = Color.WHITE
# ファイルパス
@export_file("*.tscn") var next_scene: String
