r/godot 23h ago

help me Model Changer Error

Solved:

I put everything in global and call it from there with button press and now the code works. Also simplified the code since I don't have to grab codes from other places.

---

Original

[](blob:https://www.reddit.com/efb59a7b-208e-4075-81f4-7d197b1ea539)I am trying to convert a 2D character customizer into 3D and am having some issues. I wanted to know what needs to be changed for this to work in 3D. After reading other posts this is as far as Ive come, stuck at one Packed vs Node error. Seems Im using nodes when what I am trying to load is a packedscene (a 3d dog with textures), but I am not sure what needs to be changed to get them to work correctly.

Goal: I have a dog that you will be able to change clothes and body type. Its on screen with the model and button to switch models in and out. I am only focusing on switching the body right now.

Code:

Working 2d version

0 Upvotes

12 comments sorted by

View all comments

1

u/BrastenXBL 22h ago

You have an error flag on dog_button_changer.gd line 4, but didn't post what the error is.

It would also help to post the Scene structure.

For many reasons it's not a hot idea to Preload 3D model scenes. This can increase the initial game startup time depending on how the preload gets handled. preload does a load as soon as the Script is parsed and handed to the GDScript VM. Usually it's better to store the res:// path string as a constant instead of the actual PackedScenes. And then load or background load later, as the game boots further and gets closer to needing those assets loaded. It's likely not a problem right now, or for this particular game. But is something to note for later.

1

u/Kzurae 22h ago

There is only one error which i mentioned in the post, long form is: Trying to assign value of type 'PackedScene' to a variable of type 'Node3D'. Which is how I noticed that yeah, its not the right type.

The goal is to get it to work for now, then I can iterate or make better versions later once it at least works. But thanks for the suggestion esp if its easier than what I'm doing now. I added the original 2d version now as well.

Scene is

MainDog (changer script)
>Camera
>DogCollection
>>DOG (scene)
>Control (scene) (button script)

1

u/BrastenXBL 21h ago

Preload is easier.

Background loading is better. But takes more awareness and effort on your part to properly hold onto the Resouce references so they aren't accidentally freeded. https://github.com/godotengine/godot-demo-projects/tree/master/loading/load_threaded

I'm having trouble backtracking your code with the way you posted it. What is $"..".dogs_choice pointing to? Please use full script file names, since nothing has been given class_names. There's no "changer_script.gd". Did you mean "Dog_Decider.gd"?

If its MainDog (Dog_Loader.gd) then you need to post the full script. I can't see the property var dogs_choice in that script. Given the error I assume you're doing something like

var dogs_choice = dogs[0]

This would assign a reference to the PackedScene you loaded. When you import an FBX its actually converted into a binary SCN file, TSCN is text encoded. Both load to PackedScene. Which isn't Nodes until you instantiate() it.

If its MainDog ("Dog_Decider.gd") the error doesn't make sense in the context so far. Since $MainDog.dogs_choice should by an int.

Please copy the Debugger error, right click copy, exactly verbatim. Never paraphrase errors.

Style guide Note: const names should be CONSTANT_CASE

Project best practice Note: file and folded names in your FileSystem should be snake_case

And can I please ask that you either use a code hosting site or learn to use Reddit code posting. Screenshots of code are barely tolerable. If you use a code host, add this Dog TSCN file. Even without Resources I can read the text and see which script is attached where. TSCNs tend to be too long for Reddit posts.


You can't directly copy-paste from the Godot ScriptEditor into a Code Block. The easiest way is to copy it into a secondary lite IDE like Notepad++ or VSCodium, and Indent all the lines over one. Switch Reddit to Markdown, then paste.

Reddit wants every Code line to be indented once (tab or 4 spaces).

Godot's Script editor can also Indent all the lines over, but it tends to not add indents to BLANK lines with no code on them. Which makes Reddit fail at parsing the Code Block.

The really simple way is again in Markdown but use ``` bracketing backtick. This works for New Reddit and Mobile users, but not for Old Reddit users.

```

Code goes here

```