Ways to create nodes with inherited classes

Godot Version

4.4

Question

I have a question about inheriting classes in gdscript and using them in nodes.

Suppose I create a class BetterMarker2D inheriting from the built-in Marker2D and EvenBetterMarker2D inheriting from BetterMarker2D. Code:

better_marker_2d.gd

class_name BetterMarker2D
extends Marker2D

even_better_marker_2d.gd

class_name EvenBetterMarker2D
extends BetterMarker2D

I then create a new scene with Node2D and add markers to it:

  1. (add child node) Marker2D
  2. (add child node) Marker2D - (rename) Marker2DBetter - (attach script) better_marker_2d.gd
  3. (add child node) Marker2D - (rename) Marker2DEvenBetter - (attach script) even_better_marker_2d.gd
  4. (add child node) BetterMarker2D
  5. (add child node) EvenBetterMarker2D

Is there a difference for the engine between markers #2/#3 and #4/#5? The inspector recognizes their types from the extended classes, but in the saved tscn file they differ with the added metadata/_custom_type_script field.

In addition, in the case of #2/#3, you can detach the script at any time which causes them to return to the parent Marker3D class. In #4/#5, the script is grayed out and can only be overwritten by another.

Is any of these ways of creating nodes from custom classes recommended?

source code for test scene

[gd_scene load_steps=3 format=3 uid="uid://00y0nmjdardp"]

[ext_resource type="Script" uid="uid://cevksbngkitto" path="res://shenanigans/better_marker_2d.gd" id="1_i1iwd"]
[ext_resource type="Script" uid="uid://cq2pc8e55fxh1" path="res://shenanigans/even_better_marker_2d.gd" id="2_5ljrq"]

[node name="Test" type="Node2D"]

[node name="Marker2D" type="Marker2D" parent="."]

[node name="Marker2DBetter" type="Marker2D" parent="."]
script = ExtResource("1_i1iwd")

[node name="Marker2DEvenBetter" type="Marker2D" parent="."]
script = ExtResource("2_5ljrq")

[node name="BetterMarker2D" type="Marker2D" parent="."]
script = ExtResource("1_i1iwd")
metadata/_custom_type_script = "uid://cevksbngkitto"

[node name="EvenBetterMarker2D" type="Marker2D" parent="."]
script = ExtResource("2_5ljrq")
metadata/_custom_type_script = "uid://cq2pc8e55fxh1"

They are all the same, the metadata is only for the editor. If you like knowing one of the nodes is using a custom type and the script is not a one-off node then #4/5 sounds nicer.

1 Like

great, thanks :slight_smile: