diff --git a/core/io/resource.cpp b/core/io/resource.cpp index 68cdeabac7253a..e0d42a274ac35a 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -379,8 +379,8 @@ Node *Resource::get_local_scene() const { } void Resource::setup_local_to_scene() { - // Can't use GDVIRTUAL in Resource, so this will have to be done with a signal emit_signal(SNAME("setup_local_to_scene_requested")); + GDVIRTUAL_CALL(_setup_local_to_scene); } void Resource::reset_local_to_scene() { @@ -460,6 +460,7 @@ void Resource::_bind_methods() { get_rid_bind.return_val.type = Variant::RID; ::ClassDB::add_virtual_method(get_class_static(), get_rid_bind, true, Vector(), true); + GDVIRTUAL_BIND(_setup_local_to_scene); } Resource::Resource() : diff --git a/core/io/resource.h b/core/io/resource.h index f848bdba9911ad..a9b1a88f6bcccb 100644 --- a/core/io/resource.h +++ b/core/io/resource.h @@ -33,6 +33,7 @@ #include "core/io/resource_uid.h" #include "core/object/class_db.h" +#include "core/object/gdvirtual.gen.inc" #include "core/object/ref_counted.h" #include "core/templates/safe_refcount.h" #include "core/templates/self_list.h" @@ -81,6 +82,7 @@ class Resource : public RefCounted { void _take_over_path(const String &p_path); virtual void reset_local_to_scene(); + GDVIRTUAL0(_setup_local_to_scene); public: static Node *(*_get_local_scene_func)(); //used by editor diff --git a/doc/classes/Resource.xml b/doc/classes/Resource.xml index be04ebd893576a..ab74ae4927cc0a 100644 --- a/doc/classes/Resource.xml +++ b/doc/classes/Resource.xml @@ -19,6 +19,21 @@ Override this method to return a custom [RID] when [method get_rid] is called. + + + + Override this method to customise the newly duplicated resource created from [method PackedScene.instantiate], if the original's [member resource_local_to_scene] is set to [code]true[/code]. + [b]Example:[/b] Set a random [code]damage[/code] value to every local resource from an instantiated scene, excluding the original. + [codeblock] + extends Resource + + var damage = 0 + + func _setup_local_to_scene(): + damage = randi_range(10, 40) + [/codeblock] + + @@ -58,8 +73,8 @@ - Emits the [signal setup_local_to_scene_requested] signal. If [member resource_local_to_scene] is set to [code]true[/code], this method is called from [method PackedScene.instantiate] by the newly duplicated resource within the scene instance. - For most resources, this method performs no logic of its own. Custom behavior can be defined by connecting [signal setup_local_to_scene_requested] from a script, [b]not[/b] by overriding this method. + Calls [method _setup_local_to_scene]. If [member resource_local_to_scene] is set to [code]true[/code], this method is automatically called from [method PackedScene.instantiate] by the newly duplicated resource within the scene instance. + [i]Deprecated.[/i] This method should only be called internally. Define your own methods or override [method _setup_local_to_scene], instead. @@ -90,9 +105,10 @@ [b]Note:[/b] This signal is not emitted automatically for properties of custom resources. If necessary, a setter needs to be created to emit the signal. - + - Emitted by the newly duplicated resource with [member resource_local_to_scene] set to [code]true[/code], when the scene is instantiated. Custom behavior can be defined by connecting this signal. + Emitted by a newly duplicated resource with [member resource_local_to_scene] set to [code]true[/code]. + [i]Deprecated.[/i] This signal is only emitted when the resource is created. Override [method _setup_local_to_scene], instead.