[godot] Fix GDExtension crash on editor shutdown

Properly remove import/inspector plugins in NOTIFICATION_PREDELETE
before the extension is unloaded to prevent crash when Godot's
ResourceFormatImporter tries to unreference already-destroyed plugins.
This commit is contained in:
Mario Zechner 2025-12-16 15:20:01 +01:00
parent de8ae9ef6b
commit e3f7e90912
2 changed files with 27 additions and 5 deletions

View File

@ -178,11 +178,24 @@ Error SpineBinaryResourceImportPlugin::import(const String &source_file, const S
#ifdef SPINE_GODOT_EXTENSION
SpineEditorPlugin::SpineEditorPlugin() {
add_import_plugin(memnew(SpineAtlasResourceImportPlugin));
add_import_plugin(memnew(SpineJsonResourceImportPlugin));
add_import_plugin(memnew(SpineBinaryResourceImportPlugin));
add_inspector_plugin(memnew(SpineSkeletonDataResourceInspectorPlugin));
// add_inspector_plugin(memnew(SpineSpriteInspectorPlugin));
atlas_import_plugin = Ref<EditorImportPlugin>(memnew(SpineAtlasResourceImportPlugin));
json_import_plugin = Ref<EditorImportPlugin>(memnew(SpineJsonResourceImportPlugin));
binary_import_plugin = Ref<EditorImportPlugin>(memnew(SpineBinaryResourceImportPlugin));
skeleton_data_inspector_plugin = Ref<EditorInspectorPlugin>(memnew(SpineSkeletonDataResourceInspectorPlugin));
add_import_plugin(atlas_import_plugin);
add_import_plugin(json_import_plugin);
add_import_plugin(binary_import_plugin);
add_inspector_plugin(skeleton_data_inspector_plugin);
}
void SpineEditorPlugin::_notification(int p_what) {
if (p_what == NOTIFICATION_PREDELETE) {
remove_import_plugin(atlas_import_plugin);
remove_import_plugin(json_import_plugin);
remove_import_plugin(binary_import_plugin);
remove_inspector_plugin(skeleton_data_inspector_plugin);
}
}
#else
SpineEditorPlugin::SpineEditorPlugin(EditorNode *node) {

View File

@ -287,11 +287,20 @@ class SpineEditorPlugin : public EditorPlugin {
static void _bind_methods() {}
#ifdef SPINE_GODOT_EXTENSION
Ref<EditorImportPlugin> atlas_import_plugin;
Ref<EditorImportPlugin> json_import_plugin;
Ref<EditorImportPlugin> binary_import_plugin;
Ref<EditorInspectorPlugin> skeleton_data_inspector_plugin;
#endif
public:
#ifdef SPINE_GODOT_EXTENSION
explicit SpineEditorPlugin();
String _get_plugin_name() const override { return "SpineEditorPlugin"; }
void _notification(int p_what);
#else
explicit SpineEditorPlugin(EditorNode *node);