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(); } }
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(); }
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(); }
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); } } } } } }