What's your 3D Asset Workflow?

Godot Version

4.4.1

Question

Hello, my project is getting bigger and bigger, with multiple enemies and characters, and so I start to need thinking about asset duplications, optimasing disk storage, making my scenes reusable, etc.

I was thinking that we could make a thread here where we share with each other what is our usual 3D asset workflow:

  • Do you import in GLTF + images, then create an inherited scene?
  • Do you extract the materials, the animations?
  • Do you share animations between characters? do you use animation retargeting?
  • Do you import OBJ as meshes and then build a MeshInstance3D from it?
  • Is Scene Inheritance working now? can we use it to make variant of a enemy (e.g. small blue spider and big red spider)?
  • What about level design? do you do it in Blender? or directly in Godot (e.g. gridmap, terrain)?
  • What are your tricks to save on disk storage when building the game?
  • What’s your folder structure to manage gltf, .tscn, animation, material, etc?

I hope that will spark an interesting conversation :slight_smile:

This is some nicer things to consider.

My flow is like making things as general as possible but sometimes it need to be very specific about specific target / content.

My assets are managed in structured format like A->B->C , A->D->E like this one. For example
I create a scene which has only TSCN and gdscript file. I have other folder for holding the materials and inside material, I have another folder for holding the actual data of material like texture maps and final saved versions. I tried to make as less texture as possible and varying their properties to make them different. Thus having more dynamic textures with less storage.

1 Like

Yes for level design I use some sort of hybrid apporach of using godot and blender.

In Godot I tried terrian3d when it not included in asset lib ( now it is offically in the godot asset lib). But the problem I faced is that it makes things much heavier and too much frame drops for small scenes as well. That was my experiences.

1 Like

My current title has randomized levels, and it’s the first project I’ve tackled in Godot, so my answers may be colored by that, but:

I have res://Assets/Models where I keep all my 3D models, along with a few other things.

I’m using gltf2 models someone designed for me. Textures are external, animations are internal (mostly because I only have a few animated models, and the animations are unique).

Each model is in its own subdir off Models, along with any metadata; textures, scripts, anything else. I also have a json file in the same directory that has information about the model, including things like what files are which textures (including alternates), in-game stats about the model, the base name for the model in the internationalization table, whether to attach a script…

On starting the game, I throw up a load bar and do a recursive scan on res://Assets/Models looking for json files; any I find, I pull in, parse, and load all the assets associated with that model into a big dictionary. This takes a couple of seconds, but seems reasonable even on my old spinning rust disk on my dev box.

During the game, if I need a model, I have a function I can call that will look at the dictionary, instantiate a copy of the model, hook up the resources (and instantiate any children needed), and hand it back as a ready-to-go instance I can add_child() into the scene.

I’m not doing much with variant enemies, but it wouldn’t be hard to extend my system to offer it.

On the subject of saving storage, the only thing I’m really doing is maintaining two asset trees; I have one that has all the sources for assets (gimp .xcf files, the source spreadsheet for internationalization that I export a .csv from, &c.) and then an actual project directory into which I copy only the files that the game actually needs. That way, when I go to export the project, it isn’t going to pull in a bunch of ancillary stuff that doesn’t matter.

1 Like