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
- Check PrefabUtility.IsAddedGameObjectOverride(gameObject) before calling.
- Build the revert list from PrefabUtility.GetAddedGameObjects(instanceRoot) to guarantee only additions.
- 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
- Build the revert list from PrefabUtility.GetAddedGameObjects(instanceRoot).
- Check IsAddedGameObjectOverride for every candidate before reverting.
- Do not run revert over arbitrary children; classify override status first.
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
- Cannot apply added GameObject. GameObject '{go.name}' is not
- guid
- prefabInstance
- Provided GameObject is not a Prefab instance
- The inputObject is null
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/b6cd92e045749e1b.
Report an issue: GitHub.