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);
        }
コード例 #2
0
        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;
                    }
                }
            }
        }