protected override TreeViewItem BuildRoot() { Debug.Assert(m_PrefabInstanceRoot != null, "We should always have a valid apply target"); // Inner prefab asset root. m_AllModifications = GetPrefabOverrides(m_PrefabInstanceRoot, false); Dictionary <int, PrefabOverrides> instanceIDToPrefabOverridesMap; BuildPrefabOverridesPerObject(out instanceIDToPrefabOverridesMap); var hiddenRoot = new TreeViewItem { id = 0, depth = -1, displayName = "Hidden Root" }; var idSequence = new IdSequence(); hasModifications = AddTreeViewItemRecursive(hiddenRoot, m_PrefabInstanceRoot, instanceIDToPrefabOverridesMap, idSequence); if (!hasModifications) { hiddenRoot.AddChild(new TreeViewItem { id = 1, depth = 0, displayName = "No Overrides" }); } if (m_Debug) { AddDebugItems(hiddenRoot, idSequence); } return(hiddenRoot); }
static PrefabOverrides GetPrefabOverridesForObject(int instanceID, Dictionary <int, PrefabOverrides> map) { PrefabOverrides modificationsForObject; if (!map.TryGetValue(instanceID, out modificationsForObject)) { modificationsForObject = new PrefabOverrides(); map[instanceID] = modificationsForObject; } return(modificationsForObject); }
protected override TreeViewItem BuildRoot() { Debug.Assert(m_PrefabInstanceRoot != null, "We should always have a valid apply target"); // Inner prefab asset root. m_AllModifications = GetPrefabOverrides(m_PrefabInstanceRoot, false); Dictionary <int, PrefabOverrides> instanceIDToPrefabOverridesMap; BuildPrefabOverridesPerObject(out instanceIDToPrefabOverridesMap); var hiddenRoot = new TreeViewItem { id = 0, depth = -1, displayName = "Hidden Root" }; var idSequence = new IdSequence(); hasApplicableModifications = false; hasModifications = AddTreeViewItemRecursive(hiddenRoot, m_PrefabInstanceRoot, instanceIDToPrefabOverridesMap, idSequence); if (!hasModifications) { hiddenRoot.AddChild(new TreeViewItem { id = 1, depth = 0, displayName = "No Overrides" }); } else { bool CanAnyPropertiesBeApplied() { if (m_AllModifications.addedComponents.Count != 0 || m_AllModifications.removedComponents.Count != 0 || m_AllModifications.addedGameObjects.Count != 0) { return(true); } foreach (var objectOverride in m_AllModifications.objectOverrides) { if (PrefabUtility.HasApplicableObjectOverrides(objectOverride.instanceObject, false)) { return(true); } } return(false); } hasApplicableModifications = CanAnyPropertiesBeApplied(); } if (m_Debug) { AddDebugItems(hiddenRoot, idSequence); } return(hiddenRoot); }
void BuildPrefabOverridesPerObject(out Dictionary <int, PrefabOverrides> instanceIDToPrefabOverridesMap) { instanceIDToPrefabOverridesMap = new Dictionary <int, PrefabOverrides>(); foreach (var modifiedObject in m_AllModifications.objectOverrides) { int instanceID = 0; if (modifiedObject.instanceObject is GameObject) { instanceID = modifiedObject.instanceObject.GetInstanceID(); } else if (modifiedObject.instanceObject is Component) { instanceID = ((Component)modifiedObject.instanceObject).gameObject.GetInstanceID(); } if (instanceID != 0) { PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap); modificationsForObject.objectOverrides.Add(modifiedObject); } } foreach (var addedGameObject in m_AllModifications.addedGameObjects) { int instanceID = addedGameObject.instanceGameObject.GetInstanceID(); PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap); modificationsForObject.addedGameObjects.Add(addedGameObject); } foreach (var addedComponent in m_AllModifications.addedComponents) { // This is possible if there's a component with a missing script. if (addedComponent.instanceComponent == null) { continue; } int instanceID = addedComponent.instanceComponent.gameObject.GetInstanceID(); PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap); modificationsForObject.addedComponents.Add(addedComponent); } foreach (var removedComponent in m_AllModifications.removedComponents) { // This is possible if there's a component with a missing script. if (removedComponent.assetComponent == null) { continue; } int instanceID = removedComponent.containingInstanceGameObject.gameObject.GetInstanceID(); PrefabOverrides modificationsForObject = GetPrefabOverridesForObject(instanceID, instanceIDToPrefabOverridesMap); modificationsForObject.removedComponents.Add(removedComponent); } }
static PrefabOverrides GetPrefabOverrides(GameObject prefabInstance, bool includeDefaultOverrides = false) { if (!PrefabUtility.IsPartOfNonAssetPrefabInstance(prefabInstance)) { Debug.LogError("GeneratePrefabOverrides should only be called with GameObjects that are part of a prefab"); return(new PrefabOverrides()); } var mods = new PrefabOverrides(); mods.objectOverrides = PrefabOverridesUtility.GetObjectOverrides(prefabInstance, includeDefaultOverrides); mods.addedComponents = PrefabOverridesUtility.GetAddedComponents(prefabInstance); mods.removedComponents = PrefabOverridesUtility.GetRemovedComponents(prefabInstance); mods.addedGameObjects = PrefabOverridesUtility.GetAddedGameObjects(prefabInstance); return(mods); }