Godot has no particular restrictions on project structure but I prefer to keep resources as close as possible to the scirpt/scene they are used by. In the case of ‘shared’ or ‘global’ resources which are used in multiple places, my preference is to place them in a high-level folder such as assets or lib. The goal of structuring like this is to improve the “find-ability” of related files.
<aside> 💡 The Godot style guide recommends snake_case for all files including scripts and folders.
</aside>
-Game Repository-
+-- script_templates: Place to add script templates. [SPECIAL/OPTIONAL]
+-- addons: Place for addons from the asset library. [SPECIAL/OPTIONAL]
+-- assets: Place for shared resources [ORGANIZED BY TYPE]
+-- fonts
+-- audio
+-- interface
+-- ambient
+-- music
+-- sfx
+-- sprites
+-- textures
+-- icons
+-- shaders
+-- lib: Place for shared, typically non-domain-specific, scripts/scenes
+-- ui
+-- util
+-- src: Place for all non-shared project specific files [ORGANIZED BY RELAVENCE]
+-- player
+-- player.gd
+-- player.tscn
+-- player_sprite.png
+-- etc
Special: These are folders that serve a special purpose within Godot.
Organizing by relevance: Grouping files based on how relevant they are to each other. For example code, art, and sounds effects related to a player may all be placed into a 'player' folder. Files within the same relevancy grouping can be organized by relevance or by type as desired. For example, your player folder may have all the sprites placed in a sprite folder if desired.
Organizing by type: Grouping files based on their file type or categorization. For example fonts in a font folder, sprites in a sprite folder, etc.