Skip to main content

Game Folder Structure - WIP

This is the guild on how to name things, where to put them, and over-all how we intend to organize the project files.

Considerations

The game project's file structure should achieve several key things:

  • Organize multiple repositories into folder structures that can co-exist.
    • One directory for the Godot project, a separate directory for the art source files that are created outside of the engine.
    • These directories will each be a Git repository and should conform to the hyphenated naming convention.
    • These names should make sense in and out of context, the top-level folder name should make sense when viewed as a tab in a Git GUI e.g:
      • rotund-art-source
      • rotund-audio-source
      • rotund-game
    • Splitting the repositories avoids having to sync large amounts of irrelevant content for your role on the project:
      • Programmers / Dev Ops / Build Bots should only need to sync the rotund-game repository.
      • Artists / Animators can sync rotund-art-source along side the rotund-game repository.
      • Musicians / Foley Artists can sync rotund-audio-source along side the rotund-game repository.
    • The folder structures should work without using Git sub-modules, since this adds a lot of complexity without really adding value.
  • The folder structures in these directories should mimic each other 1:1
  • Tools and pipelines should be able to export / import content by simply swapping the root, e.g:
    • rotund-art-source/art_assets/characters/bouncer/bouncer_diffuse.png
    • |--->rotund-game/art_assets/characters/bouncer/bouncer_diffuse.png
  • Art source content from tools like Blender, Gimp, Krita, etc... should be kept in the art-source repo
  • Music production files for a DAW should be kept in the audio-source repo
  • Shipable game content should be the only thing going into the Godot project resource folder in the game repo.

Naming Conventions

The repositories should use lowercase-hyphenated-case

Files and folders should use snake_case unless otherwise required by third-party tools or conventions for the specific file e.g. README.md

No spaces in file names.

Compromises

No folder structure is perfect, but this structure should lead to the fewest problems. Here is a list of known compromises we've decided to accept:

Top level folder names repeat, the game's name even though they are already inside of a top-level folder named after the game:

  • rotund-art-source
  • rotund-audio-source
  • rotund-game

There's a fair bit of redundancy. Folders don't cost anything, this is okay.

Some intermediate sub-folders are empty and seem to be useless, but they keep the hierarchies between directories in perfect sync. For instance, rotund-art-source may never end up with content directly inside of it, most if not all content will be inside of its first sub-folder art_assets  i.e. rotund-art-source/art_assets/ This is on purpose, since it ensures the game content is at the same hierarchical indentation to the source content making pipelines and paths extremely easy to work with, just swap the root and you're done!

You aught have a directory on your computer for "Well-Rounded Games" projects.  Within this directory there will be folders for each project. For 'Rotund: A Well-Rounded Gentleman' we will have a project folder called 'rotund' that serves as the root for all content necessary to develop the game.

File Tree Structure Example

Well-Rounded GamesBUGJam <!-- Top-level folder for the entire studio. -->
├── logo <!-- Example of other stuff for the studio that is not directly related to the game. -->
└── rotundfirstjam <!-- Top-level folder for the game. -->
  ├── rotund-firstjam-art-source <!-- Repository for large art content, stored outside of the Godot project. -->
  │ └── art_assets
  │   └── characters
  │     ├── bouncer
  │     │ ├── animations
  │     │ │ └── idle.blend
  │     │ ├── bouncer_diffuse.png
  │     │ └── bouncer_rig.blend
  │     └── gentleman
  │       ├── animations
  │       │ └── walk.blend
  │       ├── gentleman_diffuse.png
  │       └── gentleman_rig.blend
  ├── rotund-firstjam-audio-source <!-- Repository for large audio content, stored outside of the Godot project. -->
  │ └── audio_assets
  │   ├── dialogue
  │   ├── music
  │   └── sound_effects
  └── rotund-firstjam-game <!-- This is the Godot root for resources: 'res://' -->
    ├── addons <!-- Godot plugins -->
    ├── art_assets <!-- A 1:1 mirrored file structure with the rotund-*-art-source repository. -->
    │ ├── characters
    │ │ ├── bouncer
    │ │ │ ├── bouncer.glb <!-- Model file -->
    │ │ │ ├── bouncer.glb.import <!-- Import settings and UID -->
    │ │ │ └── bouncer_diffuse.png
    │ │ └── gentleman
    │ │   ├── gentleman_0.glb <!-- Model file -->
    │ │   ├── gentleman_0.glb.import <!-- Import settings and UID -->
    │ │   ├── gentleman_1.glb
    │ │   ├── gentleman_1.glb.import
    │ │   ├── gentleman_2.glb
    │ │   ├── gentleman_2.glb.import
    │ │   ├── gentleman_3.glb
    │ │   ├── gentleman_3.glb.import
    │ │   ├── gentleman_color_mask.png
    │ │   ├── gentleman_color_mask.png.import
    │ │   ├── gentleman_diffuse.png <!-- Texture -->
    │ │   ├── gentleman_diffuse.png.import <!-- Import settings and UID -->
    │ │   └── m_gentleman.tres <!-- Material -->
    │ ├── common
    │ │ └── textures
    │ │   └── blue_noise_64.png
    │ ├── environment
    │ │ └── wall.glb
    │ └── puzzle_elements <!-- Core puzzle elements for designing levels. -->
    │   ├── cake
    │   │ └── [...]
    │   ├── door
    │   │ └── [...]
    │   └── door
    │     └── [...]
    ├── audio_assets
    │ ├── dialogue
    │ ├── music
    │ └── sound_effects
    ├── entities <!-- Complete assets that are ready to drag and drop into a level. -->
    │ ├── characters
    │ │ ├── bouncer.tscn
    │ │ └── gentleman.tscn
    │ ├── environment <!-- Stuff without direct gameplay mechanics. -->
    │ │ ├── lamp_post.tscn
    │ │ ├── rock.tscn
    │ │ └── wall.tscn
    │ ├── level_packs <!-- Data assets that organize levels into packs. -->
    │ │ ├── christmas_levels.gd
    │ │ ├── world1.gd
    │ │ └── world2.gd
    │ └── puzzle_elements <!-- Core puzzle elements for designing levels. -->
    │   ├── button.tscn
    │   ├── cake.tscn
    │   ├── exit_door.tscn
    │   ├── player_start.tscn
    │   └── pusher.tscn
    ├── levels <!-- Playable levels. -->
    │ ├── intro_stairs.tscn
    │ ├── intro_treadmill.tscn
    │ └── intro_welcome_to_the_club.tscn
    ├── scripts
    │ └── player.gd
    ├── shaders
    │ └── iris.gdshader
    ├── ui
    │ └── icons.png
    ├── .gitignore
    ├── icon.png
    ├── project.godot <!-- Main Godot project file -->
    └── README.md