public PrefabMetadataContainer(GameObject gameObject, SerializationMetadata metadata) { PropertyOverrides = new List <RuntimePrefabPropertyOverride>(); AssetPack.GetPrefabMetadata(gameObject, out var guid, metadata.AssetPack); m_Guid = guid; var overrides = PrefabUtility.GetObjectOverrides(gameObject, true); foreach (var over in overrides) { var instanceObject = over.instanceObject; if (instanceObject == null) { continue; } SerializationUtils.GetTransformPathAndComponentIndex(gameObject.transform, instanceObject, out var transformPath, out var componentIndex); RuntimePrefabPropertyOverride.GetOverrides(instanceObject, PropertyOverrides, transformPath, componentIndex, metadata); } RemovedComponents = new List <RuntimeRemovedComponent>(); var removedComponents = PrefabUtility.GetRemovedComponents(gameObject); foreach (var component in removedComponents) { // TODO: optimize get component index var assetComponent = component.assetComponent; // Stale overrides can have a null reference on assetComponent if (assetComponent == null) { continue; } assetComponent.gameObject.GetComponents(k_Components); var index = k_Components.IndexOf(assetComponent); if (index < 0) { Debug.LogWarning("Could not find removed component " + assetComponent); continue; } RemovedComponents.Add(new RuntimeRemovedComponent { TransformPath = gameObject.transform.GetTransformPath(component.containingInstanceGameObject.transform), ComponentIndex = index }); } AddedGameObjects = new List <RuntimeAddedGameObject>(); AddedComponents = new List <RuntimeAddedComponent>(); GetMetadataRecursively(gameObject, metadata); }
void DrawPropertyOverride(RuntimePrefabPropertyOverride propertyOverride) { m_ExpandedStates.TryGetValue(propertyOverride, out var expandedState); var wasExpanded = expandedState; expandedState = EditorGUILayout.Foldout(expandedState, propertyOverride.PropertyPath, true); if (expandedState != wasExpanded) { m_ExpandedStates[propertyOverride] = expandedState; } if (expandedState) { using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.TextField("Property Path", propertyOverride.PropertyPath); EditorGUILayout.TextField("Transform Path", propertyOverride.TransformPath); EditorGUILayout.IntField("Component Index", propertyOverride.ComponentIndex); switch (propertyOverride) { case IRuntimePrefabOverrideUnityObject unityObjectProperty: EditorGUILayout.ObjectField("Value", unityObjectProperty.Value, typeof(UnityObject), true); break; case IRuntimePrefabOverrideUnityObjectReference objectReferenceProperty: var objectReference = objectReferenceProperty.Value; EditorGUILayout.IntField("Scene ID", objectReference.sceneID); EditorGUILayout.TextField("Guid", objectReference.guid); EditorGUILayout.LongField("File ID", objectReference.fileId); break; case IRuntimePrefabOverride <AnimationCurve> animationCurveProperty: EditorGUILayout.CurveField("Value", animationCurveProperty.Value); break; case RuntimePrefabPropertyOverrideList listProperty: foreach (var element in listProperty.List) { DrawPropertyOverride(element); } break; case IRuntimePrefabOverride <bool> boolProperty: EditorGUILayout.Toggle("Value", boolProperty.Value); break; case IRuntimePrefabOverride <char> charProperty: EditorGUILayout.TextField("Value", charProperty.Value.ToString()); break; case IRuntimePrefabOverride <float> floatProperty: EditorGUILayout.FloatField("Value", floatProperty.Value); break; case IRuntimePrefabOverride <int> intProperty: EditorGUILayout.IntField("Value", intProperty.Value); break; case IRuntimePrefabOverride <long> longProperty: EditorGUILayout.LongField("Value", longProperty.Value); break; case IRuntimePrefabOverride <string> stringProperty: EditorGUILayout.TextField("Value", stringProperty.Value); break; } } } }