Unity-Technologies/UnityCsReference · error · ArgumentException
The asset GameObject cannot be the root as the root cannot…
Error message
The asset GameObject cannot be the root as the root cannot be removed as an override.
What it means
Thrown by ApplyRemovedGameObject when assetGameObject.transform.root == assetGameObject.transform, meaning the supplied asset GameObject is the prefab root. The root can never be a 'removed child' override (the root always exists), so Unity rejects it with ArgumentException. Removing the root is not a valid override operation.
Solutions
- Exclude the root: ensure assetGameObject.transform.root != assetGameObject.transform before calling.
- Operate on a non-root child of the asset hierarchy that was actually removed from the instance.
- If you need to remove the whole instance, use the appropriate instance-removal API, not a removed-child override.
Example fix
// before
PrefabUtility.ApplyRemovedGameObject(instanceGo, assetRootGo, InteractionMode.UserAction);
// after
if (assetGameObject.transform.root != assetGameObject.transform)
PrefabUtility.ApplyRemovedGameObject(instanceGo, assetGameObject, InteractionMode.UserAction); Defensive patterns
Strategy: validation
Validate before calling
if (assetGameObject.transform.root == assetGameObject.transform)
{ Debug.LogWarning("Asset GameObject is the prefab root; cannot be a removed-child override."); return; }
PrefabUtility.ApplyRemovedGameObject(gameObjectInInstance, assetGameObject, action); Type guard
static bool IsNonRootChild(GameObject assetGo)
=> assetGo != null && assetGo.transform.root != assetGo.transform; Prevention
- Never pass the prefab root as the assetGameObject for a removed-child override.
- Filter out root GameObjects when iterating removed children.
- Use instance-removal APIs to remove whole instances, not removed-child overrides.
When it happens
Trigger: Calling ApplyRemovedGameObject with assetGameObject set to the prefab asset's root GameObject; passing the outermost prefab root instead of a child that was actually removed.
Common situations: Tooling that iterates removed GameObjects and accidentally includes the root; passing GetOutermostPrefabInstanceRoot result where a child is required; misunderstanding that removed-child overrides exclude the root.
Related errors
- Prefab instance must match Prefab source.
- Prefab source must not be null.
- Array is invalid.
- Cannot apply added component. Component is not an added…
- Cannot apply added component. Component is null.
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/a8c00c88806b9b7b.
Report an issue: GitHub.
Appendix: source
Thrown at Editor/Mono/Prefabs/PrefabUtility.cs:1570
var removedGameObjects = PrefabUtility.GetRemovedGameObjects(prefabInstanceObject);
#pragma warning disable UA2001 // The Banned API Analyzer produces compile errors for any new Linq code. This pre-existing usage has been suppressed, but should be rewritten if possible.
var filteredRemovedGameObjects = (from go in removedGameObjects where go != null select go).ToArray();
#pragma warning restore UA2001
PrefabUtility.SetRemovedGameObjects(prefabInstanceObject, filteredRemovedGameObjects);
}
public static void ApplyRemovedGameObject(GameObject gameObjectInInstance, GameObject assetGameObject, InteractionMode action)
{
DateTime startTime = DateTime.UtcNow;
ThrowExceptionIfNotValidPrefabInstanceObject(gameObjectInInstance, true);
if (assetGameObject == null)
throw new ArgumentNullException(nameof(assetGameObject), "Prefab source must not be null.");
if (!IsPrefabInstanceObjectOf(gameObjectInInstance, PrefabUtility.GetPrefabAssetHandle(assetGameObject)))
throw new ArgumentException("Prefab instance must match Prefab source.");
if (assetGameObject.transform.root == assetGameObject.transform)
throw new ArgumentException("The asset GameObject cannot be the root as the root cannot be removed as an override.");
var actionName = "Apply Prefab removed GameObject";
var prefabInstanceObject = PrefabUtility.GetPrefabInstanceHandle(gameObjectInInstance);
GameObject prefabInstanceRoot = GetOutermostPrefabInstanceRoot(gameObjectInInstance);
if (prefabInstanceObject == null)
throw new ArgumentNullException(nameof(prefabInstanceObject), "Prefab instance must not be null.");
PrefabUtility.Internal_CallPrefabInstanceApplying(prefabInstanceRoot);
string assetPath = AssetDatabase.GetAssetPath(assetGameObject);
GameObject assetRoot = GetRootGameObject(assetGameObject);
byte[] originalFileContent = null;
if (action == InteractionMode.UserAction)
{
if (!FileUtil.ReadFileContentBinary(assetPath, out originalFileContent, out string errorMessage))
Debug.LogError($"No undo was registered when removing GameObject {assetGameObject.name} from {assetRoot.name}. \nError: {errorMessage}", assetRoot);View on GitHub (pinned to 225b0fbdb5)