I am coming from a Unity background and there I just had a component of some custom class in the scene which I could then easily get by calling FindInScene<CustomComponent> or something like that. Not in Godot this doesn’t work, because I didn’t find a way to get the actual class of an attached script. I always just get GDScript as the class name even though I did specify a custom one.

The information I want to save are things like: where to spawn players, how many laps will this race have, maybe save references to the spawned players, etc.

So how would I save this “meta” information to get by another script in Godot?

EDIT: here is an example: I have a main scene which can load different levels. When loading a level I need to get some information about that level, like: the available spawn points. Inside each level I have a node with a script attached to it that defined class_name LevelMeta and holds the meta information that I need when loading the level. How do I detect this script and the associated meta information?

    • unexposedhazard@discuss.tchncs.de
      link
      fedilink
      arrow-up
      4
      ·
      edit-2
      3 months ago

      I see, looks like that is actually an issue.

      https://github.com/godotengine/godot/issues/21789

      Seems like you have to overwrite the get_class function if you want to detect custom classes.

      extends Node2D
      
      class_name CustomClass
      
      func get_class(): return "CustomClass"
      func is_class(name): return name == "CustomClass" or .is_class(name) 
      
      
      func _ready():
      	print(get_class())
      	print(is_class("CustomClass"))
      	print(is_class("Node2D"))
      
        • unexposedhazard@discuss.tchncs.de
          link
          fedilink
          arrow-up
          2
          ·
          edit-2
          3 months ago

          Defining a unique class name gets you the same thing as giving each script a unique filename and then differentiating between the get_script().get_path() but i can see how its not as clean for comparison.

          Another solution would be to just give all your custom classes a var called “class_id” or something and then you can read that out if you need it.

            • unexposedhazard@discuss.tchncs.de
              link
              fedilink
              arrow-up
              4
              ·
              edit-2
              3 months ago

              Im assuming you have a predefined level scene, which you instantiate and add as a child to your main scene. If i were to save a bunch of metadata about that level scene, i would add a dictionary named “level_data” to the script of the root node of that levels scene.

              extends Node
              
              var level_data = {
              "spawn_point": Vector2(x,y),
              ...
              }
              

              After you instantiate that level from your main scene with:

              var level1_tscn = load("res://path/to/tscn")
              var level1 = level1_tscn.instantiate()
              

              You can then get or modify the metadata from that instance reference.

              print(level1.level_data["spawn_point"])
              

              When you are done you can then add it as a child to the main scene with add_child(level1).

              You can also do that right away and access the data later ofcourse, but if the values are needed in the _ready function of the level, then you need to modify them before adding it to the main scene.

              • BentiGorlich@gehirneimer.deOP
                link
                fedilink
                arrow-up
                2
                ·
                3 months ago

                That seems very nice. Thanks for the input :) I am very much new to Godot and I gotta say most Unity systems in my head still work, but some just let me run against a wall, like the one I described here XD

                • unexposedhazard@discuss.tchncs.de
                  link
                  fedilink
                  arrow-up
                  2
                  ·
                  3 months ago

                  Added something to the previous comment.

                  Im also not super experienced, i just make unsuccessfull attempts at making games from time to time :) But i do love godot a lot.

                • unexposedhazard@discuss.tchncs.de
                  link
                  fedilink
                  arrow-up
                  1
                  ·
                  3 months ago

                  You generally use the same logic for literally everything in godot.

                  Spawning a bullet, enemy, item, ui component?

                  Instantiate, set values, add_child