Quick answer: The override chain in Unity runs scene instance -> variant -> base prefab. Overrides evaporate when someone applies changes upward, when a nested prefab loses the object the override targets, or when the variant’s stored file IDs go out of sync with the base. Fix each in order.

Prefab variants are Unity’s answer to inheritance, but the override system is unforgiving. One wrong click on “Apply to Base” or one renamed child transform can wipe work that took hours. Understanding the override direction is the difference between a stable variant setup and a scene that loses its tweaks every time it reloads.

Understand the three layers

Every object in a scene that comes from a prefab has up to three layers of data. The base prefab provides the defaults. A variant optionally overrides some of those defaults and stores the delta in its own asset. The scene instance then overrides the variant, again storing only the delta. Unity resolves the values bottom-up at load time. If any layer fails to resolve — a missing base, a renamed child, or a stale file ID — the overrides on top of it are discarded.

Audit the variant’s current overrides

Before debugging what disappeared, list what is left. Select the variant asset and open the Overrides dropdown in the top-right of the Inspector. You will see every property that differs from the base. If the list is unexpectedly short, compare the variant’s .prefab YAML with a previous version in git:

# Show what the variant stored before and after the break
git diff HEAD~1 HEAD -- Assets/Prefabs/EnemyVariant.prefab

YAML blocks with PrefabInstance and m_Modifications are your overrides. If they got smaller, something applied them upward. If the m_TransformParent or the referenced file IDs changed, the base prefab structure moved out from under you.

Apply direction is the usual culprit

The right-click menu on a modified field shows both “Apply to Prefab’{SLUG_VARIANT}’” and “Apply as Override in Prefab’{SLUG_BASE}’.” They look similar but do the opposite thing. The first writes the value into the variant asset so every scene instance inherits it. The second writes it into the base prefab, promoting the change past your variant. If your goal was to keep the change local to one specific scene object, you want neither — you just leave it as a scene override.

The shortcut to the wrong path is Apply All on the variant itself. Train the team to prefer the Overrides dropdown, which forces you to pick a direction per property.

Nested prefabs drop overrides silently

When an override targets a child inside a nested prefab, Unity stores the target by the nested child’s file ID. If you update the nested prefab and rename, delete, or replace that child, the file ID no longer resolves. Unity does not warn you; it simply removes the override on load. You will find it listed as “missing” in the Overrides panel briefly before it vanishes.

// Use PrefabUtility to detect broken references in editor scripts
foreach (var mod in PrefabUtility.GetPropertyModifications(variant)) {
    if (mod.target == null)
        Debug.LogWarning($"Dangling override: {mod.propertyPath}");
}

Run this over your variants as a CI step and you will catch orphaned overrides before they ship.

Keep the variant chain shallow

Variants of variants of variants will eventually bite you. Each layer introduces another file-ID mapping that can desync. For most projects, one variant level on top of a base is plenty. If you need more variation, consider composition with ScriptableObject data rather than extending the prefab chain further.

“If overrides disappeared yesterday, someone pressed Apply All. Check the git log before you blame Unity.”

Related Issues

If you are also hunting null references that only appear in builds, see Fix Unity ScriptableObject singleton null after build. For broader asset loss patterns, Fix Godot autoload singleton not accessible covers a similar class of reference-going-missing bug.

Tip: keep nested prefabs no more than two levels deep — the deeper you go, the more overrides evaporate.