You put your character and weapon prefabs in a Resources folder and load them with Resources.Load() — and it works. It works perfectly well, yet the official docs and forums keep telling you "don't use Resources." Why?
This article starts from how Unity loads assets into memory, then walks through the three ways of holding assets — direct references, Resources, and Addressables — with their pros, cons, and clear criteria for choosing between them.
What You'll Learn
- When assets get loaded into memory (the relationship between scene loading and references)
- Direct references — the right answer for small projects, and where their limits are
- Why Resources is discouraged — everything ships in the build, manual release, untrackable references
- Addressables — solving it with reference counting and dynamic loading
- How to choose (project size, memory, content delivery needs)
- Prerequisite: When Do Assets Get Loaded into Memory?
- Option 1: Direct References — the Right Answer for Small Projects
- Option 2: The Resources Folder — Why It's Discouraged
- Option 3: Addressables — the Modern Solution
- Practical: Diagnosing Which Approach Your Project Needs
- Bonus: Good to Know for Later
- Summary
Prerequisite: When Do Assets Get Loaded into Memory?
Unity's basic rule is simple: "everything placed in a scene, plus everything referenced from the Inspector, gets loaded into memory when the scene loads."

For example, if an enemy prefab references a boss's model, textures, and BGM, then even on a stage where that boss never appears, referencing the prefab pulls the entire chain into memory. This is fine while your asset count is small, but as it grows, these symptoms start showing up:
- Growing memory usage: Unused assets stay resident, which on mobile can lead to crashes.
- Bloated load times and build size: Everything ships bundled with the game itself.
- No dynamic content updates: Adding even a single new character requires updating the entire app.
The three asset management approaches differ in how they deal with these symptoms.
Option 1: Direct References — the Right Answer for Small Projects
This is the familiar approach: assign assets in the Inspector via [SerializeField].
- Pros: The simplest option. The editor immediately flags broken references, and it survives renames. For small to mid-sized games, this is the right answer.
- Cons: Everything referenced is loaded into memory at scene load, no exceptions. You can't control when loading happens.

This is where the reassurance of direct references comes from. If a reference breaks, the editor immediately flags it in red, so "it was broken without you knowing" simply doesn't happen. This is a major advantage unique to direct references, in stark contrast to the string references of Resources discussed below.
If memory isn't hurting you yet, there's no need to force a move to another approach.
Option 2: The Resources Folder — Why It's Discouraged
Any asset placed in a folder named Resources can be loaded at any time with Resources.Load<T>("path"). It looks convenient, but the costs are steep.
- Everything ships in the build, used or not: The entire contents of the Resources folder are included in the build regardless of whether they're actually used. Build size and startup time balloon (Unity builds an index of Resources at startup).
- Memory release is manual: You have to call
Resources.UnloadUnusedAssets()yourself; forget it, and assets stay in memory. - References are strings: A string path like
"Prefabs/Boss"breaks silently on renames or folder moves. The editor gives no warning.
