Unity-Technologies/UnityCsReference · error · ArgumentException

Cannot revert added GameObject. GameObject is not an added G

Error message

Cannot revert added GameObject. GameObject is not an added GameObject override on a Prefab instance.

What it means

RevertAddedGameObject verifies the GameObject is an added override via IsAddedGameObjectOverride. Reverting only makes sense for additions — an original prefab child or non-prefab object has nothing to revert, so ArgumentException is thrown.

Source

Thrown at Editor/Mono/Prefabs/PrefabUtility.cs:1802

            var actionName = "Revert Prefab removed GameObject";
            var prefabInstanceHandle = PrefabUtility.GetPrefabInstanceHandle(gameObjectInInstance);

            GameObject prefabInstanceRoot = GetOutermostPrefabInstanceRoot(gameObjectInInstance);

            if (action == InteractionMode.UserAction)
                Undo.RegisterFullObjectHierarchyUndo(prefabInstanceRoot, actionName);

            RemoveRemovedGameObjectOverride(prefabInstanceHandle, assetGameObject);
        }

        public static void RevertAddedGameObject(GameObject gameObject, InteractionMode action)
        {
            if (gameObject == null)
                throw new ArgumentNullException(nameof(gameObject), "Cannot revert added GameObject. GameObject is null.");

            if (!IsAddedGameObjectOverride(gameObject))
                throw new ArgumentException("Cannot revert added GameObject. GameObject is not an added GameObject override on a Prefab instance.", nameof(gameObject));

            ThrowExceptionIfInstanceIsPersistent(gameObject);

            GameObject instance = PrefabUtility.GetOutermostPrefabInstanceRoot(gameObject.transform.parent);
            PrefabUtility.Internal_CallPrefabInstanceReverting(instance);

            if (action == InteractionMode.UserAction)
                Undo.DestroyObjectImmediate(gameObject);
            else
                Object.DestroyImmediate(gameObject);

            PrefabUtility.Internal_CallPrefabInstanceReverted(instance);
        }

        public static List<ObjectOverride> GetObjectOverrides(GameObject prefabInstance, bool includeDefaultOverrides = false)
        {
            return PrefabOverridesUtility.GetObjectOverrides(prefabInstance, includeDefaultOverrides);
        }

View on GitHub (pinned to 225b0fbdb5)

Solutions

  1. Check PrefabUtility.IsAddedGameObjectOverride(gameObject) before calling.
  2. Build the revert list from PrefabUtility.GetAddedGameObjects(instanceRoot) to guarantee only additions.
  3. Classify each candidate with GetPrefabOverrideStatus / added-object queries first.

Example fix

// before
PrefabUtility.RevertAddedGameObject(go, mode);

// after
if (go != null && PrefabUtility.IsAddedGameObjectOverride(go))
    PrefabUtility.RevertAddedGameObject(go, mode);
Defensive patterns

Strategy: validation

Validate before calling

if (gameObject == null) return;
if (!PrefabUtility.IsAddedGameObjectOverride(gameObject)) return;

Type guard

static bool IsRevertableAddition(GameObject go) =>
    go != null && PrefabUtility.IsAddedGameObjectOverride(go);

Prevention

When it happens

Trigger: Passing an original prefab child (present in the source), a prefab instance root, or a non-prefab scene object to RevertAddedGameObject.

Common situations: Confusing original children with added overrides; running revert over a selection that includes non-additions; selection logic that grabs all children of the instance regardless of override status.

Related errors


AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13). Data as JSON: /api/errors/b6cd92e045749e1b. Report an issue: GitHub.