In this lesson, you will learn how to architect your systems to store unique instance data in standalone containers rather than overriding values directly on your Prefabs.
The Problem: Prefab "Over-writing"
When you drag a Prefab into a scene and change a value (like an enemy’s health or a specific color), you create a Prefab Override. While convenient, these overrides are "hidden" inside the Scene file. If you make a design change to the original Prefab asset later, it becomes difficult to track which instances were intentionally customized and which were accidentally corrupted. This "spaghetti data" makes debugging a nightmare in large projects.
The Solution: Data Containers
To decouple your data, you should move instance-specific variables out of the MonoBehaviour fields and into a ScriptableObject data container. Instead of the Prefab holding the raw value, it holds a reference to an asset.
Imagine an EnemySettings script:
public class EnemySettings : ScriptableObject {
public float health;
public float movementSpeed;
}
public class EnemyController : MonoBehaviour {
// The Prefab no longer holds raw numbers.
// It holds a reference to a data asset.
public EnemySettings stats;
void Start() {
Debug.Log($"Enemy initialized with {stats.health} HP.");
}
}
Why This Works
- Source of Truth: The Prefab only knows it needs an
EnemySettingsobject. It doesn't care about the specific numbers. - Asset Independence: You can create unique
EnemySettingsfiles for a "Boss" variant versus a "Grunt" variant without ever touching the Prefab’s internal structure. - Prevention of Corruption: Since the data is in an external asset, changing a value in your Inspector won't create a scene-level override that breaks your Prefab’s default behavior. If you want to change the "Boss" stats, you edit the specific
BossStats.assetfile. Your Prefab remains a clean, generic template.
By shifting instance-specific data into ScriptableObjects, your Prefabs become flexible shells that consume data rather than storing it, keeping your project hierarchy clean and your assets safe from accidental modification.
Key Takeaway: Never override individual variables on Prefab instances; instead, reference external Data Assets so that your Prefabs remain generic templates that are easy to maintain and scale.