Skip to main content

๐Ÿšข Lesson 12.3: Quality Settings, Builds & Shipping (Mini-Project)

This is the last lesson of the whole course โ€” and it's the one where your project stops being "a thing that runs in the Editor" and becomes a game other people can play. You'll set quality tiers, dial in Player Settings, use Unity 6's new Build Profiles to produce a real build for desktop and WebGL, and run the full profile โ†’ optimize โ†’ build โ†’ test loop that ties this entire module together.

๐ŸŽฏ Learning Objectives

By the end of this lesson, you will be able to:

  • Configure Quality Settings and map them to URP quality tiers (Renderer assets)
  • Set the essential Player Settings โ€” company/product name, icon, resolution, and API level
  • Use Unity 6 Build Profiles to target desktop and WebGL
  • Reduce build size with texture compression, stripping, and the Build Report
  • Test the built player and profile it (not just the Editor)
  • Run the complete profile โ†’ optimize โ†’ build โ†’ test shipping loop on your own project

Estimated Time: 45 minutes  ยท  Prerequisite: Lessons 12.1โ€“12.2 (Profiling and Optimization). You made a basic build back in Fundamentals โ€” here we do it properly.

In This Lesson

Quality Settings & URP Tiers

Not every machine is equal. A gaming PC can push shadows, anti-aliasing, and high-res textures that would crawl on a laptop or a phone. Unity's answer is Quality Settings (Edit โ–ธ Project Settings โ–ธ Quality): a set of named levels โ€” typically Low, Medium, High โ€” that the player (or your game) can switch between.

In a URP project, each Quality level points at a URP Asset (the render pipeline settings) and its Renderer. That's how a "Low" tier turns off extra features while "High" enables them. Common knobs per tier:

  • Shadows โ€” resolution, distance, and cascade count (the biggest single lever on many scenes)
  • Anti-aliasing (MSAA) and render scale
  • Texture quality โ€” full res vs. half/quarter res on lower tiers
  • V-Sync and target frame rate

You let players choose their tier from a settings menu, then apply it in code:

using UnityEngine;

public class QualityMenu : MonoBehaviour
{
    // Hook this to a dropdown: 0 = Low, 1 = Medium, 2 = High.
    public void SetQuality(int level)
    {
        QualitySettings.SetQualityLevel(level, applyExpensiveChanges: true);
    }
}

๐Ÿ“– Definition

URP quality tier: a URP Asset + Renderer paired with a Quality level. Switching the Quality level swaps the active pipeline asset, so "Low" and "High" can differ in shadows, post-processing, and render scale without touching a single scene. Set the mapping in Project Settings โ–ธ Quality under each level's Render Pipeline Asset.

Player Settings

Edit โ–ธ Project Settings โ–ธ Player is your game's identity card and low-level configuration. Before you ship, set at least:

  • Company Name & Product Name โ€” these define the save-data folder path and the window title, so set them before players create save files.
  • Icon and Cursor โ€” the executable's icon and default cursor.
  • Resolution & Presentation โ€” fullscreen mode, default window size, whether the resolution dialog appears, and allowed orientations (for mobile).
  • Splash Screen โ€” the "Made with Unity" screen (removable on paid plans).
  • Other Settings โ€” the scripting backend (Mono for fast iteration, IL2CPP for shipping performance and required on many platforms), the API compatibility level, and Managed Stripping Level (which trims unused code โ€” more on that under build size).

โš ๏ธ Set Company & Product name before players save

Your PlayerPrefs and JSON saves from Module 5 live in a folder derived from Company Name and Product Name (via Application.persistentDataPath). Change these after release and everyone's save data appears to vanish, because the game now looks in a different folder. Lock them in early.

Build Profiles (Unity 6)

Unity 6 replaces the old single "Build Settings" window with Build Profiles (File โ–ธ Build Profiles). A profile bundles a platform target, its scene list, and platform-specific overrides into one reusable, switchable configuration โ€” so you can keep a "Windows Demo" profile and a "WebGL Itch" profile side by side and swap between them in a click. Here is the window, recreated faithfully:

The Unity 6 Build Profiles window A recreation of Unity 6's Build Profiles window. A left column lists the Platforms List (Windows selected, plus WebGL, Android, iOS and macOS) and a Build Profiles group with a Windows Demo profile highlighted and a WebGL Itch profile. The right pane shows the selected profile's Scene List with three scenes checked, a Build Data section noting the scripting backend and compression, and Build and Build And Run buttons at the bottom. Build Profiles Platforms Windows active WebGL Android iOS macOS Build Profiles ๐Ÿ–ฅ Windows Demo ๐ŸŒ WebGL Itch + Add Profile Windows Demo ยท Scene List Scenes/Boot 0 Scenes/MainMenu 1 Scenes/Level01 2 Scenes/Sandbox (unchecked โ€” excluded) Add Open Scenes Build Data PlatformWindows (x86_64) Scripting BackendIL2CPP CompressionLZ4HC (release) Managed StrippingMedium Development BuildOff Player Settings โ–ธ open to change icon, resolution, backendโ€ฆ Build Build And Run
Figure 1: The Unity 6 Build Profiles window (faithfully recreated). The Windows Demo profile is selected; its Scene List, scripting backend, and compression are all part of the profile, so switching to WebGL Itch would swap the whole configuration at once.

โœ… Pro Tip: keep a Development Build profile

Make one profile with Development Build and Autoconnect Profiler ticked. Builds from it are bigger and slower, but they let you attach the Profiler to the real player โ€” the only way to get honest performance numbers (the Editor lies, as you saw in Lesson 12.1). Keep a separate release profile with those toggles off for the build you actually ship.

Target Platforms & WebGL

Each platform in the left column is a build target. To build for one you may first need its module installed via the Unity Hub (Hub โ–ธ Installs โ–ธ your version โ–ธ Add Modules) โ€” WebGL, Android, iOS, and others are optional downloads, not part of the base editor.

WebGL deserves special mention because it's how you put a game on the web โ€” playable in a browser with no download, perfect for a portfolio or a site like Ray's House of Fun. A few things are different for WebGL:

  • No threads for your game logic in the usual sense, and a sandboxed filesystem โ€” Application.persistentDataPath maps to browser storage (IndexedDB), so your Module 5 saves still work but live in the browser.
  • Build size matters more โ€” players download the whole build before playing, so compression and stripping (next section) are not optional.
  • It must be served over HTTP(S), not opened as a local file://. Use Build And Run (which starts a local server) or upload the output folder to a host.
  • Choose a compression format in Player Settings (Brotli gives the smallest download; Gzip is more widely compatible).

โš ๏ธ WebGL builds take a while

WebGL compiles your game to WebAssembly through IL2CPP, which is much slower than a desktop build โ€” expect several minutes, sometimes more on a first build. That's normal, not a hang. Build desktop for fast iteration and produce the WebGL build when you're ready to publish.

Trimming Build Size

After a build, Unity writes a Build Report (see it in the Console log, or the Build Report window). It lists what took up space โ€” and it's almost always textures and audio, not code. Your biggest levers:

  • Texture compression & max size. In each texture's Import Settings, cap the Max Size (does a UI icon really need 4096px?) and pick a compressed format. This is usually the single largest reduction.
  • Audio import settings. Compress music to Vorbis and stream it; load short SFX decompressed. Long uncompressed clips bloat builds fast.
  • Managed code stripping. With IL2CPP, the Managed Stripping Level (Player Settings) removes unused code. Higher levels shrink the build but can strip code reached only by reflection โ€” test after raising it.
  • Remove what you're not shipping. Exclude test/sandbox scenes from the profile's Scene List (see Figure 1), and don't ship a Development Build.

๐Ÿ“– Definition

Build Report: Unity's per-build breakdown of size by asset and category. Read it after every meaningful build โ€” it turns "why is my WebGL build 180 MB?" into "these six 4K textures are 120 MB of it," which points straight at the fix.

Testing the Build

A game that works in the Editor is not the same as a game that works when built. The Editor has all assets loaded, references intact, and no stripping. Always test the actual player before you call it done:

  • Play it end to end. Boot scene, menu, gameplay, pause, save/load, quit. Bugs from missing scenes in the Scene List or over-aggressive stripping only show up here.
  • Profile the built player. Use your Development Build profile and attach the Profiler (Autoconnect Profiler, or connect from the Profiler's target dropdown). Real device/player numbers are the only ones that count.
  • Check the Player log. When something breaks in a build, the log file (path varies by platform) holds the errors the Editor Console would have shown.
  • Test on a modest machine. Your dev PC is faster than most players' hardware โ€” verify your Low quality tier actually runs well on something humble.

Mini-Project: Ship It

Time to put the whole module together on a project of your own โ€” ideally one of the games you built earlier in this course. You'll run the complete shipping loop: profile it, fix what the Profiler flags, build it, and test the build. That loop is the heartbeat of every release:

flowchart LR P["Profile
find the bottleneck"] --> O["Optimize
pool, cache, batch, quality tiers"] O --> B["Build
via a Build Profile"] B --> T["Test the player
play through + profile it"] T --> Q{"Meets the
frame budget?"} Q -- "No" --> P Q -- "Yes" --> S["Ship ๐Ÿšข"]

Figure 2: The profile โ†’ optimize โ†’ build โ†’ test loop. You go around it until the built player holds its frame budget, then ship.

๐Ÿ‹๏ธ The Build: profile, optimize, ship

Objective: Take one of your projects from "runs in the Editor" to "a build I can hand to a friend."

  1. Profile (Lesson 12.1): press Play with the Profiler open, find your worst spike, and note the top method and any non-zero GC Alloc.
  2. Optimize (Lesson 12.2): fix at least one real issue โ€” pool a churning spawner, cache a GetComponent, or remove a per-frame allocation. Re-profile and confirm the number moved.
  3. Set quality: create Low/Medium/High Quality levels mapped to URP assets, and wire a dropdown to QualitySettings.SetQualityLevel.
  4. Player Settings: set Company Name, Product Name, and an icon. Pick IL2CPP for the release build.
  5. Build Profile: in File โ–ธ Build Profiles, make a desktop profile with your real scenes in the Scene List (exclude sandbox scenes). Build it.
  6. Trim: read the Build Report, cap your two largest textures, and rebuild โ€” note the size drop.
  7. Test: run the built player start to finish. Then make a WebGL profile and build that too, so your game is web-playable.
๐Ÿ’ก Hint: the build runs but a scene is missing or black

Almost always the Scene List: a scene you load by name isn't ticked in the Build Profile, so it isn't included. Add it. If a whole feature vanishes only in the build, suspect over-aggressive Managed Stripping (lower the level) or a reference resolved by reflection.

โœ… Success check

You have a desktop build that launches from its executable, plays through your game, and holds its frame budget on a modest machine โ€” plus a WebGL build you could upload to a site. Your Profiler numbers improved measurably between the first and last pass of the loop.

Course Wrap-Up

Take a breath and look back at how far you've come. You started this course knowing the Editor and basic C#. You're finishing it able to build, optimize, and ship a real game. Here's the ground you covered across twelve modules:

  • Module 1 โ€” Animation: state machines, blend trees, and animation events driving a character.
  • Module 2 โ€” Architecture & ScriptableObjects: decoupling with interfaces, events and delegates, and data-as-assets with ScriptableObject event channels.
  • Module 3 โ€” The New Input System: Input Actions, action maps, reading input in code, and rebinding across keyboard and gamepad.
  • Module 4 โ€” Advanced UI: canvas render modes, a main menu and pause system, live HUDs, and world-space UI.
  • Module 5 โ€” Scene Management & Persistence: async loading, additive scenes, PlayerPrefs, and a JSON save system.
  • Module 6 โ€” AI & Navigation: NavMesh baking, agents and patrols, and an enemy state machine that senses the player.
  • Module 7 โ€” Combat & Inventory: health and damage through interfaces, raycast hit detection, and an inventory with pickups and equipping.
  • Module 8 โ€” Lighting & Shaders: URP lighting, lightmapping and light probes, and your first Shader Graph dissolve effect.
  • Module 9 โ€” VFX & Cinematics: particle systems, GPU particles in the VFX Graph, post-processing volumes, and a Timeline cutscene.
  • Module 10 โ€” 2D Essentials: sprites and sorting, sprite sheets, tilemaps, and a 2D physics platformer base.
  • Module 11 โ€” 2D Animation & Lighting: frame-based and skeletal 2D animation, and 2D lights and shadows.
  • Module 12 โ€” Performance & Shipping: profiling, object pooling and optimization, and building for release โ€” right here.
๐Ÿ’ก Where to go next. Pick one small game and finish it โ€” a complete little thing beats a dozen half-started prototypes for what it teaches you. Then explore the specializations these modules opened doors to: deeper shaders and the VFX Graph, netcode and multiplayer, addressables and streaming for larger projects, or a platform you love (mobile, console, or web). The Unity Manual, the official Learn platform, and the community forums are your ongoing companions.

๐ŸŽ“ You're an intermediate Unity developer now

Animation, architecture, input, UI, scenes, AI, combat, lighting, VFX, 2D, and performance โ€” you have the whole toolkit and, more importantly, the habits: decouple your systems, measure before you optimize, and test the build. Everything from here is a variation on skills you already own.

Summary

๐ŸŽ‰ Key Takeaways

  • Quality Settings define Low/Medium/High levels; in URP each maps to a URP Asset + Renderer, switchable at runtime with QualitySettings.SetQualityLevel.
  • Player Settings set your game's identity and backend โ€” lock Company/Product name before players save.
  • Unity 6 Build Profiles bundle platform, scene list, and overrides into switchable configurations; keep a Development Build profile for honest profiling.
  • WebGL makes your game browser-playable but needs a platform module, extra build time, compression, and an HTTP host.
  • Trim build size via texture/audio compression and managed stripping โ€” read the Build Report to see where the bytes are.
  • Always test the built player and profile it โ€” the Editor's numbers aren't the real ones.
  • The shipping loop is profile โ†’ optimize โ†’ build โ†’ test, repeated until the player holds its frame budget.

๐Ÿš€ What's Next?

This is the end of the road for Unity Intermediate โ€” and the start of yours. You have every skill needed to build a complete, optimized, shippable game, and the habits to keep growing on your own. Go make something, finish it, and put it in front of players. That's the whole point.

๐Ÿšข You can ship a game now

Twelve modules, one toolkit, one loop: build, measure, improve, release. Thank you for taking the course โ€” now go build something worth playing.