Ejemplo n.º 1
0
    public void DrawPersistentMonoBehaviourInspector()
    {
        if (manager.IsOn || ZSerializerSettings.Instance.componentDataDictionary[typeof(PersistentMonoBehaviour)].isOn)
        {
            if (manager is PersistentMonoBehaviour)
            {
                ZSerializerEditor.BuildPersistentComponentEditor(manager, ZSerializerStyler.Instance, ref manager.showSettings,
                                                                 ZSerializerEditor.ShowGroupIDSettings);
            }


            if (!manager.showSettings)
            {
                if (ZSerializerSettings.Instance.debugMode == DebugMode.Developer)
                {
                    using (new EditorGUI.DisabledScope(true))
                    {
                        EditorGUILayout.TextField("ZUID", manager.ZUID);
                        EditorGUILayout.TextField("GameObject ZUID", manager.GOZUID);
                    }
                }

                if (editor == this)
                {
                    try
                    {
                        base.OnInspectorGUI();
                    }
                    catch (Exception)
                    {
                        return;
                    }
                }
                else if (editor != null)
                {
                    editor.OnInspectorGUI();
                }
            }
        }
        else
        {
            if (editor == this)
            {
                base.OnInspectorGUI();
            }
            else if (editor != null)
            {
                editor.OnInspectorGUI();
            }
        }

        if (editor == null)
        {
            GUILayout.Label("Loading...");
            Repaint();
        }
    }
Ejemplo n.º 2
0
        static void GetClasses()
        {
#if UNITY_2020_3_OR_NEWER
            var types =
                ZSerialize.GetPersistentTypes().Where(t => searchProject || FindObjectsOfType(t, true).Length > 0).OrderBy(t => t.Name).ToArray();
#else
            var types = ZSerialize.GetPersistentTypes().Where(t => searchProject || FindObjectsOfType(t).Length > 0)
                        .OrderBy(t => t.Name).ToArray();
#endif
            classes = types.Select(t => new Class(t, ZSerializerEditor.GetClassState(t))).ToArray();
        }
Ejemplo n.º 3
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        using (var check = new EditorGUI.ChangeCheckScope())
        {
            GUILayout.Space(-15);
            using (new EditorGUILayout.HorizontalScope(ZSerializerStyler.window))
            {
                var unmanagedTypes = manager.serializedComponents.Select(sc => sc.typeFullName)
                                     .Except(ZSerializerSettings.Instance.unityComponentTypes).ToList();

                string color = unmanagedTypes.Any() ? ZSerializerStyler.YellowHex : ZSerializerStyler.MainHex;

                GUILayout.Label($"<color=#{color}>  Persistent GameObject</color>", styler.header,
                                GUILayout.MinHeight(28));
                if (unmanagedTypes.Any())
                {
                    if (GUILayout.Button(styler.refreshWarningImage, GUILayout.Height(28), GUILayout.Width(28)))
                    {
                        ZSerializerSettings.Instance.unityComponentTypes.AddRange(unmanagedTypes);
                        EditorUtility.SetDirty(ZSerializerSettings.Instance);
                        AssetDatabase.SaveAssets();
                        ZSerializerEditorRuntime.GenerateUnityComponentClasses();
                    }
                }

                manager.showSettings = ZSerializerEditor.SettingsButton(manager.showSettings, styler, 28);
                PrefabUtility.RecordPrefabInstancePropertyModifications(manager);
            }

            if (manager.showSettings)
            {
                ZSerializerEditor.ShowGroupIDSettings(typeof(PersistentGameObject), manager, false);

                if (ZSerializerSettings.Instance.debugMode == DebugMode.Developer)
                {
                    GUILayout.Space(-15);
                    using (new GUILayout.VerticalScope(ZSerializerStyler.window))
                    {
                        if (GUILayout.Button("Reset ZUIDs"))
                        {
                            manager.GenerateEditorZUIDs(false);
                        }
                    }
                }



                GUILayout.Space(-15);
                using (new GUILayout.VerticalScope(ZSerializerStyler.window))
                {
                    if (selectedEventTab == -1)
                    {
                        using (new EditorGUILayout.HorizontalScope())
                        {
                            if (GUILayout.Button("OnPreSave", new GUIStyle("button")
                            {
                                normal = { textColor = manager.onPreSave.GetPersistentEventCount() > 0 ? ZSerializerStyler.MainColor : new GUIStyle("button").normal.textColor }
                            }))
                            {
                                selectedEventTab = 0;
                            }

                            if (GUILayout.Button("OnPostSave", new GUIStyle("button")
                            {
                                normal = { textColor = manager.onPostSave.GetPersistentEventCount() > 0 ? ZSerializerStyler.MainColor : new GUIStyle("button").normal.textColor }
                            }))
                            {
                                selectedEventTab = 1;
                            }
                        }

                        using (new EditorGUILayout.HorizontalScope())
                        {
                            if (GUILayout.Button("OnPreLoad", new GUIStyle("button")
                            {
                                normal = { textColor = manager.onPreLoad.GetPersistentEventCount() > 0 ? ZSerializerStyler.MainColor : new GUIStyle("button").normal.textColor }
                            }))
                            {
                                selectedEventTab = 2;
                            }

                            if (GUILayout.Button("OnPostLoad", new GUIStyle("button")
                            {
                                normal = { textColor = manager.onPostLoad.GetPersistentEventCount() > 0 ? ZSerializerStyler.MainColor : new GUIStyle("button").normal.textColor }
                            }))
                            {
                                selectedEventTab = 3;
                            }
                        }
                    }
                    else
                    {
                        var list = new List <string> {
                            "OnPreSave", "OnPostSave", "OnPreLoad", "OnPostLoad"
                        };
                        var propertyNames = new List <string> {
                            "onPreSave", "onPostSave", "onPreLoad", "onPostLoad"
                        };
                        var  text      = list[selectedEventTab];
                        bool isPressed = true;
                        isPressed = GUILayout.Toggle(isPressed, text, "button");

                        serializedObject.Update();
                        EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyNames[selectedEventTab]));
                        serializedObject.ApplyModifiedProperties();

                        if (!isPressed)
                        {
                            selectedEventTab = -1;
                        }
                    }
                }


                if (ZSerializerSettings.Instance.advancedSerialization)
                {
                    GUILayout.Space(-15);
                    using (new GUILayout.VerticalScope(ZSerializerStyler.window))
                    {
                        GUILayout.Label("Serialized Components:");
                        if (manager.serializedComponents.Count == 0)
                        {
                            GUILayout.Label("None");
                        }
                        for (var i = 0; i < manager.serializedComponents.Count; i++)
                        {
                            using (new GUILayout.HorizontalScope())
                            {
                                serializedObject.Update();

                                var   component = manager.serializedComponents[i];
                                Color fontColor = Color.cyan;
                                switch (component.persistenceType)
                                {
                                case PersistentType.Everything:
                                    fontColor = new Color(0.61f, 1f, 0.94f);
                                    break;

                                case PersistentType.Component:
                                    fontColor = new Color(1f, 0.79f, 0.47f);
                                    break;

                                case PersistentType.None:
                                    fontColor = new Color(1f, 0.56f, 0.54f);
                                    break;
                                }

                                GUILayout.Label(
                                    component.Type.Name +
                                    (ZSerializerSettings.Instance.debugMode == DebugMode.Developer
                                        ? $"({component.zuid})"
                                        : ""),
                                    new GUIStyle("helpbox")
                                {
                                    font   = styler.header.font,
                                    normal = new GUIStyleState()
                                    {
                                        textColor = fontColor
                                    },
                                    alignment = TextAnchor.MiddleCenter
                                },
                                    GUILayout.MaxWidth(ZSerializerSettings.Instance.debugMode == DebugMode.Developer
                                        ? 150
                                        : 100));

                                EditorGUILayout.PropertyField(serializedObject
                                                              .FindProperty(nameof(manager.serializedComponents)).GetArrayElementAtIndex(i)
                                                              .FindPropertyRelative("persistenceType"), GUIContent.none);

                                serializedObject.ApplyModifiedProperties();
                            }
                        }

                        if (GUILayout.Button("Reset"))
                        {
                            manager.serializedComponents.Clear();
                            manager.Reset();
                        }
                    }
                }
            }
            else
            {
                if (manager.serializedComponents.Count > 0)
                {
                    GUILayout.Space(-15);

                    using (new GUILayout.HorizontalScope(ZSerializerStyler.window))
                    {
                        for (var i = 0; i < manager.serializedComponents.Count; i++)
                        {
                            var serializedComponent = manager.serializedComponents[i];

                            GUILayout.FlexibleSpace();
                            Texture componentSprite;
                            if (serializedComponent.component)
                            {
                                componentSprite = EditorGUIUtility.ObjectContent(null,
                                                                                 serializedComponent.component.GetType()).image;
                            }
                            else
                            {
                                componentSprite = ZSerializerStyler.Instance.notMadeImage;
                            }



                            GUILayout.Box(componentSprite, new GUIStyle("label"),
                                          GUILayout.Width(16), GUILayout.Height(16));
                            // GUILayout.Label(serializedComponent.component.GetType().Name,
                            //     new GUIStyle("label") {fontSize = 12});
                            GUILayout.FlexibleSpace();
                            if (i != manager.serializedComponents.Count - 1)
                            {
                                GUILayout.Label("|",
                                                new GUIStyle("label")
                                {
                                    fontSize = 12, normal = { textColor = new Color(0.51f, 0.51f, 0.51f) }
                                });
                            }
                        }
                    }
                }

                if (ZSerializerSettings.Instance.debugMode == DebugMode.Developer)
                {
                    using (new EditorGUI.DisabledScope(true))
                    {
                        EditorGUILayout.TextField("ZUID", manager.ZUID);
                        EditorGUILayout.TextField("GameObject ZUID", manager.GOZUID);

                        GUILayout.Space(5);
                        foreach (var serializedComponent in manager.serializedComponents)
                        {
                            EditorGUILayout.TextField(serializedComponent.Type.Name, serializedComponent.zuid);
                        }
                    }
                }
            }

            if (check.changed)
            {
                EditorUtility.SetDirty(manager);
            }
        }

        serializedObject.ApplyModifiedProperties();
    }
Ejemplo n.º 4
0
        private void OnGUI()
        {
            if (!ZSerializerSettings.Instance.packageInitialized)
            {
                GUILayout.Space(-15);
                using (new GUILayout.VerticalScope(ZSerializerStyler.window,
                                                   GUILayout.MaxHeight(1)))
                {
                    GUILayout.Label($"<color=#{ZSerializerStyler.MainHex}>ZSerializer Setup Wizard</color>",
                                    new GUIStyle("label")
                    {
                        alignment = TextAnchor.MiddleCenter, fontSize = 32, font = Styler.header.font,
                        richText  = true
                    },
                                    GUILayout.MaxHeight(100));
                }

                GUILayout.Space(-15);
                using (new GUILayout.VerticalScope(ZSerializerStyler.window,
                                                   GUILayout.MaxHeight(1)))
                {
                    Dictionary <bool, List <Texture2D> > icons = new Dictionary <bool, List <Texture2D> >
                    {
                        {
                            true,
                            new List <Texture2D>
                            {
                                Resources.Load <Texture2D>("valid"), Resources.Load <Texture2D>("valid")
                            }
                        }, //repeated to not cause index out of range
                        {
                            false,
                            new List <Texture2D>
                            {
                                Resources.Load <Texture2D>("not_made"), Resources.Load <Texture2D>("needs_rebuilding")
                            }
                        }
                    };

                    // bool hasZSerializers = File.Exists(Path.Combine(Application.dataPath,
                    //     "ZResources/ZSerializer/UnityComponentZSerializers.cs"));
                    bool zuidsAreSetup = !FindObjectsOfType <MonoBehaviour>().Where(m => m is IZSerializable).Any(m =>
                                                                                                                  string.IsNullOrEmpty((m as IZSerializable).ZUID) ||
                                                                                                                  string.IsNullOrEmpty((m as IZSerializable).ZUID));
                    bool areSampleScenesIn = EditorBuildSettings.scenes.Any(s =>
                                                                            s.path.Contains("ZSerializer/Samples/2 - Scene Groups/House/Scenes"));


                    // using (new GUILayout.HorizontalScope())
                    // {
                    //     GUILayout.Label(new GUIContent(
                    //         icons[hasZSerializers][0]),GUILayout.Width(20), GUILayout.Height(20));
                    //     GUILayout.Label("Unity Component ZSerializers Built", GUILayout.Width(200));
                    //
                    //     using (new EditorGUI.DisabledScope(hasZSerializers))
                    //     {
                    //         if (GUILayout.Button("Solve", GUILayout.Width(50)))
                    //         {
                    //             ZSerializerEditorRuntime.GenerateUnityComponentClasses();
                    //         }
                    //     }
                    // }

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Label(new GUIContent(
                                            icons[zuidsAreSetup][0]), GUILayout.Width(20), GUILayout.Height(20));
                        GUILayout.Label("ZUIDs Are correctly set ", GUILayout.Width(200));

                        using (new EditorGUI.DisabledScope(zuidsAreSetup))
                        {
                            if (GUILayout.Button("Solve", GUILayout.Width(50)))
                            {
                                ZSerializerEditorRuntime.GenerateUnityComponentClasses();
                            }
                        }
                    }

                    using (new GUILayout.HorizontalScope())
                    {
                        GUILayout.Label(new GUIContent(
                                            icons[areSampleScenesIn][1]), GUILayout.Width(20), GUILayout.Height(20));
                        GUILayout.Label("Sample Scenes setup ", GUILayout.Width(200));

                        using (new EditorGUI.DisabledScope(areSampleScenesIn))
                        {
                            if (GUILayout.Button("Solve", GUILayout.Width(50)))
                            {
                                ZSerializerEditor.AddSampleScenesToBuildSettings();
                            }
                        }
                    }

                    //using (new EditorGUI.DisabledScope(!zuidsAreSetup /*|| !hasZSerializers*/))
                    {
                        if (GUILayout.Button("Finish Setup"))
                        {
                            ZSerializerSettings.Instance.packageInitialized = true;
                            EditorUtility.SetDirty(ZSerializerSettings.Instance);
                            AssetDatabase.SaveAssets();
                        }
                    }
                }


                // if (GUILayout.Button($"<color=#{ZSerializerStyler.MainHex}>Setup</color>", new GUIStyle("button") { fontSize = 48, font = Styler.header.font, richText = true},
                //     GUILayout.MinHeight(100)))
                // {
                //     ZSerializerSettings.Instance.packageInitialized = true;
                //     ZSerializerEditor.GenerateUnityComponentClasses();
                //     ZSerializerEditor.RefreshZUIDs();
                //     ZSerializerEditor.AddSampleScenesToBuildSettings();
                // }
            }
            else
            {
                using (new GUILayout.VerticalScope("box"))
                {
                    using (new EditorGUILayout.HorizontalScope())
                    {
                        if (GUILayout.Button("Refresh", GUILayout.Height(28)))
                        {
                            Init();
                        }

                        if (Styler == null)
                        {
                            GenerateStyler();
                        }

                        editMode = GUILayout.Toggle(editMode, Styler.cogWheel, new GUIStyle("button"),
                                                    GUILayout.Height(28), GUILayout.Width(28));
                    }

                    if (!editMode)
                    {
                        using (new EditorGUILayout.HorizontalScope())
                        {
                            using (var change = new EditorGUI.ChangeCheckScope())
                            {
                                searchText = GUILayout.TextField(searchText,
                                                                 new GUIStyle(EditorStyles.toolbarSearchField)
                                {
                                    fixedHeight = 20
                                });
                                if (GUILayout.Button(searchProject ? Styler.hierarchyOnly : Styler.projectOnly,
                                                     GUILayout.Width(28), GUILayout.Height(20)))
                                {
                                    searchProject = !searchProject;
                                }

                                if (change.changed)
                                {
                                    GetClasses();
                                }
                            }
                        }
                    }


                    using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPos))
                    {
                        scrollPos = scrollView.scrollPosition;

                        if (editMode)
                        {
                            ZSerializerEditor.BuildSettingsEditor(Styler, ref selectedMenu, ref selectedType,
                                                                  ref selectedGroup, ref selectedComponentSettings, ref selectedGroupIndex,
                                                                  position.width);
                        }
                        else
                        {
                            if (classes == null)
                            {
                                GetClasses();
                            }

                            if (!string.IsNullOrEmpty(searchText))
                            {
                                classes = classes.Where(c => c.classType.Name.ToLower().Contains(searchText.ToLower()))
                                          .ToArray();
                            }

                            if (classes.Length == 0)
                            {
                                GUILayout.Label(
                                    "You have no present persistent components in the current Scene\nMake one of your components inherit from PersistentMonoBehaviour for it to become persistent!",
                                    new GUIStyle("label")
                                {
                                    alignment = TextAnchor.MiddleCenter,
                                    wordWrap  = true
                                });
                            }
                            else
                            {
                                for (var i = 0; i < classes.Length; i++)
                                {
                                    var classInstance = classes[i];
                                    GUILayout.Space(-15);
                                    using (new EditorGUILayout.HorizontalScope(ZSerializerStyler.window,
                                                                               GUILayout.Height(32),
                                                                               GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 20)))
                                    {
                                        string color = classInstance.state == ClassState.Valid
                                            ? ZSerializerSettings.Instance
                                                       .componentDataDictionary[classInstance.classType].isOn
                                                ? ZSerializerStyler.MainHex
                                                : ZSerializerStyler.OffHex
                                            : classInstance.state == ClassState.NeedsRebuilding
                                                ? ZSerializerStyler.YellowHex
                                                : ZSerializerStyler.RedHex;


                                        if (GUILayout.Button(
                                                $"<color=#{color}>{classInstance.classType.Name}</color>",
                                                new GUIStyle(Styler.header)
                                        {
                                            alignment = TextAnchor.MiddleCenter, fontSize = fontSize
                                        },
                                                GUILayout.Height(classHeight)))
                                        {
                                            var pathList = Directory.GetFiles("Assets",
                                                                              $"*{classInstance.classType.Name}*.cs",
                                                                              SearchOption.AllDirectories)[0];

                                            var path = pathList.Replace('\\', '/');


                                            EditorUtility.FocusProjectWindow();

                                            UnityEngine.Object obj =
                                                AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(path);

                                            Selection.activeObject = obj;

                                            EditorGUIUtility.PingObject(obj);
                                        }

                                        ZSerializerEditor.BuildWindowValidityButton(classInstance.classType, Styler);

                                        if (GUILayout.Button(Styler.cogWheel,
                                                             GUILayout.MaxHeight(32), GUILayout.MaxWidth(32)))
                                        {
                                            selectedTypeToShowSettings = selectedTypeToShowSettings == i ? -1 : i;
                                        }
                                    }

                                    using (new GUILayout.HorizontalScope())
                                    {
                                        if (selectedTypeToShowSettings == i)
                                        {
                                            GUILayout.Label("Save Group", GUILayout.MaxWidth(80));
                                            int newValue = EditorGUILayout.Popup(
                                                ZSerializerSettings.Instance
                                                .componentDataDictionary[classInstance.classType].groupID,
                                                ZSerializerSettings.Instance.saveGroups
                                                .Where(s => !string.IsNullOrEmpty(s)).ToArray());
                                            if (newValue != ZSerializerSettings.Instance
                                                .componentDataDictionary[classInstance.classType].groupID)
                                            {
                                                ZSerializerSettings.Instance
                                                .componentDataDictionary[classInstance.classType].groupID =
                                                    newValue;
                                                foreach (var obj in FindObjectsOfType(classInstance.classType))
                                                {
                                                    var o = (PersistentMonoBehaviour)obj;
                                                    if (o.autoSync)
                                                    {
                                                        o.groupID = newValue;
                                                        EditorUtility.SetDirty(o);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (!editMode)
                    {
                        GUILayout.Space(5);
                        if (!Application.isPlaying)
                        {
                            GUILayout.Space(-15);
                            using (new EditorGUILayout.HorizontalScope(ZSerializerStyler.window,
                                                                       GUILayout.Height(32), GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 20)))
                            {
                                EditorGUILayout.LabelField("ZSerialize All",
                                                           new GUIStyle(Styler.header)
                                {
                                    alignment = TextAnchor.MiddleCenter, fontSize = fontSize
                                },
                                                           GUILayout.Height(classHeight));

                                ZSerializerEditor.BuildButtonAll(classes, classHeight, Styler);
                            }
                        }
                    }
                }
            }
        }