Unreal Engine 5.8 tutorial

Part 10 — Packaging, source control & project structure

Ship a build of your Unreal Engine 5.8 game: packaging and build configs, Git + Git LFS source control, a good .gitignore, and a scalable project and naming structure.

10.1 Packaging a build

  • Platforms (top toolbar) → Package Project → choose platform (Windows/Mac/Linux/Android…). First you may set Project Settings → Packaging (Shipping vs Development config, which maps to include, compression).
  • Build configs: Debug (slow, full debug), Development (fast iteration, has logging/console), Shipping (optimized, stripped — what players get).
  • Output is a standalone build. Test the packaged build, not just PIE — bugs hide in the difference (asset references, WITH_EDITOR-only code, async timing).
  • Set default maps (Project Settings → Maps & Modes): the editor startup map and the game’s default map.

10.2 Source control (do this from day one)

  • Unreal integrates with Perforce (the industry standard for big binary projects), Git, and others (Revision Control menu).
  • For solo/indie, Git + Git LFS is fine. Track .uasset/.umap as LFS (they’re binary). Use One File Per Actor so level edits don’t collide.
  • Set up Git LFS first, then add a .gitignore that excludes only generated folders. From the project root:
git lfs install
git lfs track "*.uasset" "*.umap"   # records them in .gitattributes
# common extras: git lfs track "*.fbx" "*.wav" "*.png" "*.exr"
git add .gitattributes
# .gitignore - generated folders only
Binaries/
DerivedDataCache/
Intermediate/
Saved/
.vs/
*.sln
/Builds/                # packaged build OUTPUT (Platforms -> Package) - never commit cooked builds
# Keep (commit these): Config/ Content/ Source/ Plugins/ Build/ *.uproject .gitattributes
# Note the singular vs plural: commit Build/ (platform icons, packaging config); ignore Builds/ (your packaged output).
  • Caveat: Blueprints/maps are binary — Git can’t merge them. Coordinate so two people don’t edit the same Blueprint simultaneously (Perforce’s exclusive checkout solves this; Git LFS file locking helps).

10.3 Project organization

A scalable folder convention (consistency matters more than the exact scheme):

Content/
  _Project/            # leading underscore sorts your stuff to the top
    Blueprints/
    Characters/
    Maps/
    Materials/
    UI/
    Audio/
    VFX/
  Developers/          # personal scratch space (excluded from cooked builds)
  • Naming conventions: prefix by type — BP_ Blueprint, M_ Material, MI_ Material Instance, T_ Texture, SM_ Static Mesh, SK_ Skeletal Mesh, A_ Anim, S_ Sound, WBP_ Widget Blueprint. (Allar’s “ue5-style-guide” is the community standard — search it.)
  • Keep gameplay base classes in C++, designer-facing subclasses in Blueprint (Part 2).
  • Use Plugins to modularize big features so they’re reusable and toggle-able.
Exercise 10 — WISP milestone (ship the slice)

Put WISP under Git + LFS with the gitignore above. Make a Development and a Shipping packaged build of L_Hollow_3D; note the size and behavior difference, and play the Shipping build start to finish against the Definition of Done in the capstone section. Reorganize Content/_Wisp/ to the naming convention and fix any broken references (right-click a folder → “Fix Up Redirectors”). If a fresh player can menu → collect → relight every beacon → survive → win → reload their save, all at a stable frame rate: WISP’s vertical slice is done. That’s a complete shipped game loop, built from an empty project.