Beispiel #1
0
		void CreateProfile () {

			HighlightProfile newProfile = ScriptableObject.CreateInstance<HighlightProfile> ();
			newProfile.Save (thisEffect);

			AssetDatabase.CreateAsset (newProfile, "Assets/Highlight Plus Profile.asset");
			AssetDatabase.SaveAssets ();

			EditorUtility.FocusProjectWindow ();
			Selection.activeObject = newProfile;

			thisEffect.profile = newProfile;
		}
Beispiel #2
0
        public override void OnInspectorGUI()
        {
            bool isManager = thisEffect.GetComponent <HighlightManager>() != null;

            EditorGUILayout.Separator();
            serializedObject.Update();


            EditorGUILayout.BeginHorizontal();
            HighlightProfile prevProfile = (HighlightProfile)profile.objectReferenceValue;

            EditorGUILayout.PropertyField(profile, new GUIContent("Profile", "Create or load stored presets."));
            if (profile.objectReferenceValue != null)
            {
                if (prevProfile != profile.objectReferenceValue)
                {
                    profileChanged = true;
                }

                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("", GUILayout.Width(EditorGUIUtility.labelWidth));
                if (GUILayout.Button(new GUIContent("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width(60)))
                {
                    CreateProfile();
                    profileChanged     = false;
                    enableProfileApply = false;
                    GUIUtility.ExitGUI();
                    return;
                }
                if (GUILayout.Button(new GUIContent("Load", "Updates settings with the profile configuration."), GUILayout.Width(60)))
                {
                    profileChanged = true;
                }
                if (!enableProfileApply)
                {
                    GUI.enabled = false;
                }
                if (GUILayout.Button(new GUIContent("Save", "Updates profile configuration with changes in this inspector."), GUILayout.Width(60)))
                {
                    enableProfileApply = false;
                    profileChanged     = false;
                    thisEffect.profile.Save(thisEffect);
                    EditorUtility.SetDirty(thisEffect.profile);
                    GUIUtility.ExitGUI();
                    return;
                }
                GUI.enabled = true;
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.PropertyField(profileSync, new GUIContent("Sync With Profile", "If disabled, profile settings will only be loaded when clicking 'Load' which allows you to customize settings after loading a profile and keep those changes."));
                EditorGUILayout.BeginHorizontal();
            }
            else
            {
                if (GUILayout.Button(new GUIContent("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width(60)))
                {
                    CreateProfile();
                    GUIUtility.ExitGUI();
                    return;
                }
            }
            EditorGUILayout.EndHorizontal();


            if (isManager)
            {
                EditorGUILayout.HelpBox("These are default settings for highlighted objects. If the highlighted object already has a Highlight Effect component, those properties will be used.", MessageType.Info);
            }
            else
            {
                EditorGUILayout.PropertyField(previewInEditor);
            }

            EditorGUILayout.PropertyField(ignoreObjectVisibility);
            if (thisEffect.staticChildren)
            {
                EditorGUILayout.HelpBox("This GameObject or one of its children is marked as static. If highlight is not visible, add a MeshCollider to them.", MessageType.Warning);
            }

            EditorGUILayout.PropertyField(reflectionProbes);

            EditorGUILayout.Separator();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
            if (GUILayout.Button("Help", GUILayout.Width(50)))
            {
                EditorUtility.DisplayDialog("Quick Help", "Move the mouse over a setting for a short description.\n\nVisit kronnect.com's forum for support, questions and more cool assets.\n\nIf you like Highlight Plus please rate it or leave a review on the Asset Store! Thanks.", "Ok");
            }
            EditorGUILayout.EndHorizontal();
            EditorGUI.BeginChangeCheck();
            if (!isManager)
            {
                EditorGUILayout.PropertyField(ignore, new GUIContent("Ignore", "This object won't be highlighted."));
                if (!ignore.boolValue)
                {
                    EditorGUI.BeginChangeCheck();
                    EditorGUILayout.PropertyField(highlighted);
                    if (EditorGUI.EndChangeCheck())
                    {
                        foreach (HighlightEffect effect in targets)
                        {
                            effect.SetHighlighted(highlighted.boolValue);
                        }
                    }
                }
            }
            if (!ignore.boolValue)
            {
                EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include", "Additional objects to highlight. Pro tip: when highlighting multiple objects at the same time include them in the same layer or under the same parent."));
                if (effectGroup.intValue == (int)TargetOptions.Layer)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.PropertyField(alphaCutOff, new GUIContent("Alpha Cut Off", "Only for semi-transparent objects. Leave this to zero for normal opaque objects."));
                EditorGUILayout.PropertyField(cullBackFaces);
                EditorGUILayout.PropertyField(fadeInDuration);
                EditorGUILayout.PropertyField(fadeOutDuration);
                if ((PlayerSettings.virtualRealitySupported && ((outlineQuality.intValue == (int)QualityLevel.Highest && outline.floatValue > 0) || (glowQuality.intValue == (int)QualityLevel.Highest && glow.floatValue > 0))))
                {
                    EditorGUILayout.PropertyField(flipY, new GUIContent("Flip Y Fix", "Flips outline/glow effect to fix bug introduced in Unity 2019.1.0 when VR is enabled."));
                }
                if (glowQuality.intValue != (int)QualityLevel.Highest || outlineQuality.intValue != (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(constantWidth, new GUIContent("Constant Width", "Compensates outline/glow width with depth increase."));
                }
                EditorGUILayout.Separator();
                EditorGUILayout.LabelField("Effects", EditorStyles.boldLabel);

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(outline, "Outline", outline.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
                EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(outlineQuality, new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."));
                CheckVRSupport(outlineQuality.intValue);
                if (outlineQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(outlineDownsampling, new GUIContent("Downsampling"));
                }
                if (outlineQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(outlineOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
                    if (outlineOptimalBlit.boolValue)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(outlineBlitDebug, new GUIContent("Debug View", "Shows the blitting rectangle on the screen."));
                        if (outlineBlitDebug.boolValue && (!previewInEditor.boolValue || !highlighted.boolValue))
                        {
                            EditorGUILayout.HelpBox("Enable \"Preview In Editor\" and \"Highlighted\" to display the outline Debug View.", MessageType.Warning);
                        }
                        EditorGUI.indentLevel--;
                    }
                }

                GUI.enabled = outlineQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
                EditorGUILayout.PropertyField(outlineAlwaysOnTop, new GUIContent("Always On Top", "Shows outline on top of any occluding objects."));
                GUI.enabled = true;

                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(glow, "Outer Glow", glow.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
                EditorGUILayout.PropertyField(glowQuality, new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."));
                CheckVRSupport(glowQuality.intValue);
                if (glowQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(glowDownsampling, new GUIContent("Downsampling"));
                    EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
                }
                EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
                if (glowQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(glowOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
                    if (glowOptimalBlit.boolValue)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(glowBlitDebug, new GUIContent("Debug View", "Shows the blitting rectangle on the screen."));
                        if (glowBlitDebug.boolValue && (!previewInEditor.boolValue || !highlighted.boolValue))
                        {
                            EditorGUILayout.HelpBox("Enable \"Preview In Editor\" and \"Highlighted\" to display the glow Debug View.", MessageType.Warning);
                        }
                        EditorGUI.indentLevel--;
                    }
                    GUI.enabled = glowQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
                    EditorGUILayout.PropertyField(glowAlwaysOnTop, new GUIContent("Always On Top", "Shows outer glow on top of any occluding objects."));
                    GUI.enabled = true;
                }
                else
                {
                    GUI.enabled = glowQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
                    EditorGUILayout.PropertyField(glowAlwaysOnTop, new GUIContent("Always On Top", "Shows outer glow on top of any occluding objects."));
                    GUI.enabled = true;
                    EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
                    if (glowDithering.boolValue)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
                        EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
                        EditorGUI.indentLevel--;
                    }
                    EditorGUILayout.PropertyField(glowPasses, true);
                }
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(innerGlow, "Inner Glow", innerGlow.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
                EditorGUILayout.PropertyField(innerGlowAlwaysOnTop, new GUIContent("Always On Top", "Shows inner glow on top of any occluding objects."));
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(overlay, "Overlay", overlay.floatValue > 0);
                if (overlay.floatValue < overlayMinIntensity.floatValue)
                {
                    overlayMinIntensity.floatValue = overlay.floatValue;
                }
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
                EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
                if (overlayMinIntensity.floatValue > overlay.floatValue)
                {
                    overlay.floatValue = overlayMinIntensity.floatValue;
                }
                EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(targetFX, "Target", targetFX.boolValue);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture"));
                EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(targetFXCenter, new GUIContent("Center", "Optionally assign a transform. Target will follow transform. If the object is skinned, you can also assign a bone to reflect currenct animation position."));
                EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
                EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
                EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
                EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
                EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();
            }

            EditorGUILayout.BeginVertical(GUI.skin.box);
            EditorGUILayout.PropertyField(seeThrough);
            if (isManager && seeThrough.intValue == (int)SeeThroughMode.AlwaysWhenOccluded)
            {
                EditorGUILayout.HelpBox("This option is not valid in Manager.\nTo make an object always visible add a Highlight Effect component to the gameobject and enable this option on the component.", MessageType.Error);
            }
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("Intensity"));
            EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("Alpha"));
            EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("Color"));
            EditorGUI.indentLevel--;
            EditorGUILayout.EndVertical();

            if (serializedObject.ApplyModifiedProperties() || profileChanged)
            {
                if (thisEffect.profile != null)
                {
                    if (profileChanged)
                    {
                        thisEffect.profile.Load(thisEffect);
                        profileChanged     = false;
                        enableProfileApply = false;
                    }
                    else
                    {
                        enableProfileApply = true;
                    }
                }

                foreach (HighlightEffect effect in targets)
                {
                    effect.Refresh();
                }
            }
            if (thisEffect != null && thisEffect.previewInEditor)
            {
                EditorUtility.SetDirty(thisEffect);
            }
        }
        public override void OnInspectorGUI()
        {
            EditorGUILayout.Separator();

            // URP setup helpers
            pipe = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset;
            if (pipe == null)
            {
                EditorGUILayout.HelpBox("You must assign the Universal Rendering Pipeline asset in Project Settings / Graphics. Then, add the Highlight Plus Scriptable Render Feature to the list of Renderer Features of the Forward Renderer.", MessageType.Error);
                if (GUILayout.Button("Watch Setup Video Tutorial"))
                {
                    Application.OpenURL("https://youtu.be/OlCnEAcHJm0");
                }
                return;
            }

            if (!HighlightPlusRenderPassFeature.installed)
            {
                EditorGUILayout.HelpBox("Highlight Plus Render Feature must be added to the list of features of the Forward Renderer in the Universal Rendering Pipeline asset.", MessageType.Warning);
                if (GUILayout.Button("Watch Setup Video Tutorial"))
                {
                    Application.OpenURL("https://youtu.be/OlCnEAcHJm0");
                }
                if (GUILayout.Button("Go to Universal Rendering Pipeline Asset"))
                {
                    Selection.activeObject = pipe;
                }
                EditorGUILayout.Separator();
            }

            bool isManager = thisEffect.GetComponent <HighlightManager>() != null;

            serializedObject.Update();

            EditorGUILayout.BeginHorizontal();
            HighlightProfile prevProfile = (HighlightProfile)profile.objectReferenceValue;

            EditorGUILayout.PropertyField(profile, new GUIContent("Profile", "Create or load stored presets."));
            if (profile.objectReferenceValue != null)
            {
                if (prevProfile != profile.objectReferenceValue)
                {
                    profileChanged = true;
                }

                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("", GUILayout.Width(EditorGUIUtility.labelWidth));
                if (GUILayout.Button(new GUIContent("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width(60)))
                {
                    CreateProfile();
                    profileChanged     = false;
                    enableProfileApply = false;
                    GUIUtility.ExitGUI();
                    return;
                }
                if (GUILayout.Button(new GUIContent("Load", "Updates settings with the profile configuration."), GUILayout.Width(60)))
                {
                    profileChanged = true;
                }
                GUI.enabled = enableProfileApply;
                if (GUILayout.Button(new GUIContent("Save", "Updates profile configuration with changes in this inspector."), GUILayout.Width(60)))
                {
                    enableProfileApply = false;
                    profileChanged     = false;
                    thisEffect.profile.Save(thisEffect);
                    EditorUtility.SetDirty(thisEffect.profile);
                    GUIUtility.ExitGUI();
                    return;
                }
                GUI.enabled = true;
                if (GUILayout.Button(new GUIContent("Locate", "Finds the profile in the project"), GUILayout.Width(60)))
                {
                    if (thisEffect.profile != null)
                    {
                        Selection.activeObject = thisEffect.profile;
                        EditorGUIUtility.PingObject(thisEffect.profile);
                    }
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.PropertyField(profileSync, new GUIContent("Sync With Profile", "If disabled, profile settings will only be loaded when clicking 'Load' which allows you to customize settings after loading a profile and keep those changes."));
                EditorGUILayout.BeginHorizontal();
            }
            else
            {
                if (GUILayout.Button(new GUIContent("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width(60)))
                {
                    CreateProfile();
                    GUIUtility.ExitGUI();
                    return;
                }
            }
            EditorGUILayout.EndHorizontal();


            if (isManager)
            {
                EditorGUILayout.HelpBox("These are default settings for highlighted objects. If the highlighted object already has a Highlight Effect component, those properties will be used.", MessageType.Info);
            }
            else
            {
                EditorGUILayout.PropertyField(previewInEditor);
            }

            EditorGUILayout.PropertyField(ignoreObjectVisibility);
            if (thisEffect.staticChildren)
            {
                EditorGUILayout.HelpBox("This GameObject or one of its children is marked as static. If highlight is not visible, add a MeshCollider to them.", MessageType.Warning);
            }

            EditorGUILayout.PropertyField(reflectionProbes);
            EditorGUILayout.PropertyField(normalsOption);
            EditorGUILayout.PropertyField(GPUInstancing);

            EditorGUILayout.Separator();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
            if (GUILayout.Button("Help", GUILayout.Width(50)))
            {
                EditorUtility.DisplayDialog("Quick Help", "Move the mouse over a setting for a short description.\n\nVisit kronnect.com's forum for support, questions and more cool assets.\n\nIf you like Highlight Plus please rate it or leave a review on the Asset Store! Thanks.", "Ok");
            }
            EditorGUILayout.EndHorizontal();
            EditorGUI.BeginChangeCheck();
            if (!isManager)
            {
                EditorGUILayout.PropertyField(ignore, new GUIContent("Ignore", "This object won't be highlighted."));
                if (!ignore.boolValue)
                {
                    EditorGUILayout.PropertyField(highlighted);
                }
            }
            if (!ignore.boolValue)
            {
                EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include", "Additional objects to highlight. Pro tip: when highlighting multiple objects at the same time include them in the same layer or under the same parent."));
                if (effectGroup.intValue == (int)TargetOptions.LayerInScene || effectGroup.intValue == (int)TargetOptions.LayerInChildren)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
                    EditorGUI.indentLevel--;
                }
                if (effectGroup.intValue != (int)TargetOptions.OnlyThisObject && effectGroup.intValue != (int)TargetOptions.Scripting)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(effectNameFilter, new GUIContent("Object Name Filter"));
                    EditorGUILayout.PropertyField(combineMeshes);
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.PropertyField(alphaCutOff, new GUIContent("Alpha Cut Off", "Only for semi-transparent objects. Leave this to zero for normal opaque objects."));
                EditorGUILayout.PropertyField(cullBackFaces);
                EditorGUILayout.PropertyField(fadeInDuration);
                EditorGUILayout.PropertyField(fadeOutDuration);
                if ((PlayerSettings.virtualRealitySupported && ((outlineQuality.intValue == (int)QualityLevel.Highest && outline.floatValue > 0) || (glowQuality.intValue == (int)QualityLevel.Highest && glow.floatValue > 0))))
                {
                    EditorGUILayout.PropertyField(flipY, new GUIContent("Flip Y Fix", "Flips outline/glow effect to fix bug introduced in Unity 2019.1.0 when VR is enabled."));
                }
                if (glowQuality.intValue != (int)QualityLevel.Highest || outlineQuality.intValue != (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(constantWidth, new GUIContent("Constant Width", "Compensates outline/glow width with depth increase."));
                }
                EditorGUILayout.PropertyField(subMeshMask);
                EditorGUILayout.Separator();
                EditorGUILayout.LabelField("Effects", EditorStyles.boldLabel);

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(outline, "Outline", outline.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
                EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
                EditorGUILayout.BeginHorizontal();
                QualityPropertyField(outlineQuality);
                if (outlineQuality.intValue == (int)QualityLevel.Highest)
                {
                    GUILayout.Label("(Screen-Space Effect)");
                }
                else
                {
                    GUILayout.Label("(Mesh-based Effect)");
                }
                EditorGUILayout.EndHorizontal();
                CheckVRSupport(outlineQuality.intValue);
                CheckDepthTextureSupport(outlineQuality.intValue);
                if (outlineQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(outlineDownsampling, new GUIContent("Downsampling"));
                }
                if (outlineQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(outlineBlitDebug, new GUIContent("Debug View", "Shows the blitting rectangle on the screen."));
                    if (!Application.isPlaying && outlineBlitDebug.boolValue && (!previewInEditor.boolValue || !highlighted.boolValue))
                    {
                        EditorGUILayout.HelpBox("Enable \"Preview In Editor\" and \"Highlighted\" to display the outline Debug View.", MessageType.Warning);
                    }
                }

                //GUI.enabled = outlineQuality.intValue != (int)QualityLevel.Highest || CheckForwardMSAA();
                if (outlineQuality.intValue == (int)QualityLevel.Highest && (glow.floatValue > 0 && glowQuality.intValue == (int)QualityLevel.Highest))
                {
                    outlineVisibility.intValue = glowVisibility.intValue;
                }
                EditorGUILayout.PropertyField(outlineVisibility, new GUIContent("Visibility"));
                EditorGUILayout.PropertyField(outlineIndependent, new GUIContent("Independent", "Do not combine outline with other highlighted objects."));
                GUI.enabled = true;

                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(glow, "Outer Glow", glow.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
                EditorGUILayout.BeginHorizontal();
                QualityPropertyField(glowQuality);
                if (glowQuality.intValue == (int)QualityLevel.Highest)
                {
                    GUILayout.Label("(Screen-Space Effect)");
                }
                else
                {
                    GUILayout.Label("(Mesh-based Effect)");
                }
                EditorGUILayout.EndHorizontal();
                CheckVRSupport(glowQuality.intValue);
                CheckDepthTextureSupport(glowQuality.intValue);
                if (glowQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(glowDownsampling, new GUIContent("Downsampling"));
                    EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
                }
                EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
                if (glowQuality.intValue == (int)QualityLevel.Highest)
                {
                    EditorGUILayout.PropertyField(glowBlitDebug, new GUIContent("Debug View", "Shows the blitting rectangle on the screen."));
                    if (!Application.isPlaying && glowBlitDebug.boolValue && (!previewInEditor.boolValue || !highlighted.boolValue))
                    {
                        EditorGUILayout.HelpBox("Enable \"Preview In Editor\" and \"Highlighted\" to display the glow Debug View.", MessageType.Warning);
                    }
                    EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
                }
                else
                {
                    EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
                    EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
                    if (glowDithering.boolValue)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
                        EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
                        EditorGUI.indentLevel--;
                    }
                    EditorGUILayout.PropertyField(glowBlendPasses, new GUIContent("Blend Passes"));
                    if (!glowBlendPasses.boolValue)
                    {
                        HighlightEffect ef = (HighlightEffect)target;
                        if (ef.glowPasses != null)
                        {
                            for (int k = 0; k < ef.glowPasses.Length - 1; k++)
                            {
                                if (ef.glowPasses[k].offset > ef.glowPasses[k + 1].offset)
                                {
                                    EditorGUILayout.HelpBox("Glow pass " + k + " has a greater offset than the next one. Reduce it to ensure the next glow pass is visible.", MessageType.Warning);
                                }
                            }
                        }
                    }
                    EditorGUILayout.PropertyField(glowPasses, true);
                }
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(innerGlow, "Inner Glow", innerGlow.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
                EditorGUILayout.PropertyField(innerGlowVisibility, new GUIContent("Visibility"));
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(overlay, "Overlay", overlay.floatValue > 0);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
                EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
                EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(GUI.skin.box);
                DrawSectionField(targetFX, "Target", targetFX.boolValue);
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture", "The texture that contains the shape to be drawn over the highlighted object."));
                EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(targetFXCenter, new GUIContent("Center", "Optionally assign a transform. Target will follow transform. If the object is skinned, you can also assign a bone to reflect currenct animation position."));
                EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
                EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
                EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
                EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
                EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
                EditorGUI.indentLevel--;
                EditorGUILayout.EndVertical();
            }

            EditorGUILayout.BeginVertical(GUI.skin.box);
            EditorGUILayout.PropertyField(seeThrough);
            if (isManager && seeThrough.intValue == (int)SeeThroughMode.AlwaysWhenOccluded)
            {
                EditorGUILayout.HelpBox("This option is not valid in Manager.\nTo make an object always visible add a Highlight Effect component to the gameobject and enable this option on the component.", MessageType.Error);
            }
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("Intensity"));
            EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("Color Blend"));
            EditorGUILayout.PropertyField(seeThroughNoise, new GUIContent("Noise"));
            EditorGUILayout.PropertyField(seeThroughBorder, new GUIContent("Border When Hidden" + ((seeThroughBorder.floatValue > 0) ? " •" : "")));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughBorderWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(seeThroughBorderColor, new GUIContent("Color"));
            EditorGUI.indentLevel--;
            EditorGUILayout.EndVertical();
            EditorGUILayout.BeginVertical(GUI.skin.box);
            EditorGUILayout.LabelField("Hit FX Sample");
            if (!Application.isPlaying)
            {
                EditorGUILayout.HelpBox("Enter Play Mode to test this feature. In your code, call effect.HitFX() method to execute this hit effect.", MessageType.Info);
            }
            else
            {
                EditorGUI.indentLevel++;
                hitColor        = EditorGUILayout.ColorField(new GUIContent("Color"), hitColor);
                hitDuration     = EditorGUILayout.FloatField(new GUIContent("Duration"), hitDuration);
                hitMinIntensity = EditorGUILayout.Slider(new GUIContent("Min Intensity"), hitMinIntensity, 0, 1);
                if (GUILayout.Button("Execute Hit"))
                {
                    thisEffect.HitFX(hitColor, hitDuration, hitMinIntensity);
                }
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.EndVertical();

            if (serializedObject.ApplyModifiedProperties() || profileChanged)
            {
                if (thisEffect.profile != null)
                {
                    if (profileChanged)
                    {
                        thisEffect.profile.Load(thisEffect);
                        profileChanged     = false;
                        enableProfileApply = false;
                    }
                    else
                    {
                        enableProfileApply = true;
                    }
                }

                foreach (HighlightEffect effect in targets)
                {
                    effect.Refresh();
                }
            }
        }
        public override void OnInspectorGUI()
        {
            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(fadeInDuration);
            EditorGUILayout.PropertyField(fadeOutDuration);
            EditorGUILayout.PropertyField(overlay);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
            EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
            EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(outline);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(outlineHQ, new GUIContent("HQ", "Additional passes to create a better outline on certain shapes."));
            EditorGUILayout.PropertyField(outlineAlwaysOnTop, new GUIContent("Always On Top", "Shows outline on top of any occluding objects."));
            EditorGUILayout.PropertyField(outlineCullBackFaces, new GUIContent("Cull Back Faces", "Do not render back facing triangles."));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(innerGlow, new GUIContent("Inner Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(innerGlowAlwaysOnTop, new GUIContent("Always On Top", "Shows inner glow on top of any occluding objects."));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(glow, new GUIContent("Outer Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(glowHQ, new GUIContent("HQ", "Additional passes to create a better glow on certain shapes."));
            EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
            if (glowDithering.boolValue)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
                EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(glowAlwaysOnTop, new GUIContent("Always On Top", "Shows outer glow on top of any occluding objects."));
            EditorGUILayout.PropertyField(glowCullBackFaces, new GUIContent("Cull Back Faces", "Do not render back facing triangles."));
            EditorGUILayout.PropertyField(glowPasses, true);
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(targetFX, new GUIContent("Target"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture"));
            EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
            EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
            EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
            EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
            EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
            EditorGUI.indentLevel--;

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("See-Through Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(seeThrough);
            EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("   Intensity"));
            EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("   Alpha"));
            EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("   Color"));

            if (serializedObject.ApplyModifiedProperties() || (Event.current.type == EventType.ExecuteCommand &&
                                                               Event.current.commandName == "UndoRedoPerformed"))
            {
                // Triggers profile reload on all Volumetric Fog scripts
                HighlightEffect[] effects = FindObjectsOfType <HighlightEffect> ();
                for (int t = 0; t < targets.Length; t++)
                {
                    HighlightProfile profile = (HighlightProfile)targets [t];
                    for (int k = 0; k < effects.Length; k++)
                    {
                        if (effects [k] != null && effects [k].profile == profile && effects [k].profileSync)
                        {
                            profile.Load(effects [k]);
                            effects [k].Refresh();
                        }
                    }
                }
                EditorUtility.SetDirty(target);
            }
        }
        public override void OnInspectorGUI()
        {
            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include"));
            if (effectGroup.intValue == (int)TargetOptions.LayerInScene || effectGroup.intValue == (int)TargetOptions.LayerInChildren)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(alphaCutOff);
            EditorGUILayout.PropertyField(cullBackFaces);
            EditorGUILayout.PropertyField(depthClip);
            EditorGUILayout.PropertyField(fadeInDuration);
            EditorGUILayout.PropertyField(fadeOutDuration);
            EditorGUILayout.PropertyField(outline);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(outlineQuality, new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."));
            if (outlineQuality.intValue == (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(outlineDownsampling, new GUIContent("Downsampling"));
                EditorGUILayout.PropertyField(outlineOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
            }
            if (outlineQuality.intValue == (int)QualityLevel.Highest && glowQuality.intValue == (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
            }
            else
            {
                EditorGUILayout.PropertyField(outlineVisibility, new GUIContent("Visibility"));
            }
            if (outlineQuality.intValue != (int)QualityLevel.Highest)
            {
                GUI.enabled = outlineVisibility.intValue != (int)Visibility.AlwaysOnTop;
                EditorGUILayout.PropertyField(outlineIndependent, new GUIContent("Independent", "Shows full outline regardless of other highlighted objects."));
                GUI.enabled = true;
            }
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(glow, new GUIContent("Outer Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(glowQuality, new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."));
            if (glowQuality.intValue == (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowDownsampling, new GUIContent("Downsampling"));
                EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
                EditorGUILayout.PropertyField(glowBlendMode, new GUIContent("Blend Mode"));
                EditorGUILayout.PropertyField(glowOptimalBlit, new GUIContent("Optimal Blit", "Blits result over a section of the screen instead of rendering to the full screen buffer."));
            }
            EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
            if (glowQuality.intValue != (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
                if (glowDithering.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
                    EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.PropertyField(glowPasses, true);
            }
            EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(innerGlow, new GUIContent("Inner Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(innerGlowVisibility, new GUIContent("Visibility"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(overlay);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
            EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
            EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(targetFX, new GUIContent("Target"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture"));
            EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
            EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
            EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
            EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
            EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
            EditorGUI.indentLevel--;

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("See-Through Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(seeThrough);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughOccluderMask, new GUIContent("Occluder Layer"));
            if (seeThroughOccluderMask.intValue > 0)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(seeThroughOccluderThreshold, new GUIContent("Radius Threshold", "Multiplier to the object bounds. Making the bounds smaller prevents false occlusion tests."));
                EditorGUILayout.PropertyField(seeThroughOccluderCheckInterval, new GUIContent("Check Interval", "Interval in seconds between occlusion tests."));
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("Intensity"));
            EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("Color Blend"));
            EditorGUILayout.PropertyField(seeThroughNoise, new GUIContent("Noise"));
            EditorGUILayout.PropertyField(seeThroughBorder, new GUIContent("Border When Hidden"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughBorderWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(seeThroughBorderColor, new GUIContent("Color"));
            EditorGUI.indentLevel--;
            EditorGUI.indentLevel--;

            if (serializedObject.ApplyModifiedProperties() || (Event.current.type == EventType.ExecuteCommand &&
                                                               Event.current.commandName == "UndoRedoPerformed"))
            {
                // Triggers profile reload on all Highlight Effect scripts
                HighlightEffect[] effects = FindObjectsOfType <HighlightEffect>();
                for (int t = 0; t < targets.Length; t++)
                {
                    HighlightProfile profile = (HighlightProfile)targets[t];
                    for (int k = 0; k < effects.Length; k++)
                    {
                        if (effects[k] != null && effects[k].profile == profile && effects[k].profileSync)
                        {
                            profile.Load(effects[k]);
                            effects[k].Refresh();
                        }
                    }
                }
                EditorUtility.SetDirty(target);
            }
        }
Beispiel #6
0
		public override void OnInspectorGUI () {
			bool isManager = thisEffect.GetComponent<HighlightManager> () != null;
			EditorGUILayout.Separator ();
			serializedObject.Update ();


			EditorGUILayout.BeginHorizontal ();
			HighlightProfile prevProfile = (HighlightProfile)profile.objectReferenceValue;
			EditorGUILayout.PropertyField (profile, new GUIContent ("Profile", "Create or load stored presets."));
			if (profile.objectReferenceValue != null) {

				if (prevProfile != profile.objectReferenceValue) {
					profileChanged = true;
				}

				EditorGUILayout.EndHorizontal ();
				EditorGUILayout.BeginHorizontal ();
				GUILayout.Label ("", GUILayout.Width (EditorGUIUtility.labelWidth));
				if (GUILayout.Button (new GUIContent ("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width (60))) {
					CreateProfile ();
					profileChanged = false;
					enableProfileApply = false;
					GUIUtility.ExitGUI ();
					return;
				}
				if (GUILayout.Button (new GUIContent ("Load", "Updates fog settings with the profile configuration."), GUILayout.Width (60))) {
					profileChanged = true;
				}
				if (!enableProfileApply)
					GUI.enabled = false;
				if (GUILayout.Button (new GUIContent ("Save", "Updates profile configuration with changes in this inspector."), GUILayout.Width (60))) {
					enableProfileApply = false;
					profileChanged = false;
					thisEffect.profile.Save (thisEffect);
					EditorUtility.SetDirty (thisEffect.profile);
					GUIUtility.ExitGUI ();
					return;
				}
				GUI.enabled = true;
				EditorGUILayout.EndHorizontal ();
				EditorGUILayout.PropertyField (profileSync, new GUIContent ("Sync With Profile", "If disabled, profile settings will only be loaded when clicking 'Load' which allows you to customize settings after loading a profile and keep those changes."));
				EditorGUILayout.BeginHorizontal ();
			} else {
				if (GUILayout.Button (new GUIContent ("Create", "Creates a new profile which is a copy of the current settings."), GUILayout.Width (60))) {
					CreateProfile ();
					GUIUtility.ExitGUI ();
					return;
				}
			}
			EditorGUILayout.EndHorizontal ();


			if (isManager) {
				EditorGUILayout.HelpBox ("These are default settings for highlighted objects. If the highlighted object already has a Highlight Effect component, those properties will be used.", MessageType.Info);
			} else {
				EditorGUILayout.PropertyField (previewInEditor);
			}

			EditorGUILayout.PropertyField (ignoreObjectVisibility);
			if (thisEffect.staticChildren) {
				EditorGUILayout.HelpBox ("This GameObject or one of its children is marked as static. If highlight is not visible, add a MeshCollider to them.", MessageType.Warning);
			}

			EditorGUILayout.Separator ();
			EditorGUILayout.LabelField ("Highlight Options", EditorStyles.boldLabel);
			EditorGUI.BeginChangeCheck ();
			if (!isManager) {
				EditorGUILayout.PropertyField (ignore, new GUIContent ("Ignore", "This object won't be highlighted."));
				if (!ignore.boolValue) {
					EditorGUI.BeginChangeCheck ();
					EditorGUILayout.PropertyField (highlighted);
					if (EditorGUI.EndChangeCheck ()) {
						foreach (HighlightEffect effect in targets) {
							effect.SetHighlighted (highlighted.boolValue);
						}
					}
				}
			}
			if (!ignore.boolValue) {
				EditorGUILayout.PropertyField (fadeInDuration);
				EditorGUILayout.PropertyField (fadeOutDuration);
				DrawSectionField (overlay, "Overlay", overlay.floatValue > 0);
				if (overlay.floatValue < overlayMinIntensity.floatValue) {
					overlayMinIntensity.floatValue = overlay.floatValue;
				}
				EditorGUI.indentLevel++;
				EditorGUILayout.PropertyField (overlayColor, new GUIContent ("Color"));
				EditorGUILayout.PropertyField (overlayBlending, new GUIContent ("Blending"));
				EditorGUILayout.PropertyField (overlayMinIntensity, new GUIContent ("Min Intensity"));
				if (overlayMinIntensity.floatValue > overlay.floatValue) {
					overlay.floatValue = overlayMinIntensity.floatValue;
				}
				EditorGUILayout.PropertyField (overlayAnimationSpeed, new GUIContent ("Animation Speed"));
				EditorGUI.indentLevel--;
				DrawSectionField (outline, "Outline", outline.floatValue > 0);
				EditorGUI.indentLevel++;
				EditorGUILayout.PropertyField (outlineWidth, new GUIContent ("Width"));
				EditorGUILayout.PropertyField (outlineColor, new GUIContent ("Color"));
				EditorGUILayout.PropertyField (outlineHQ, new GUIContent ("HQ", "Additional passes to create a better outline on certain shapes."));
				EditorGUILayout.PropertyField (outlineAlwaysOnTop, new GUIContent ("Always On Top", "Shows outline on top of any occluding objects."));
				EditorGUILayout.PropertyField (outlineCullBackFaces, new GUIContent ("Cull Back Faces", "Do not render back facing triangles."));
				EditorGUI.indentLevel--;
				DrawSectionField (innerGlow, "Inner Glow", innerGlow.floatValue > 0);
				EditorGUI.indentLevel++;
				EditorGUILayout.PropertyField (innerGlowColor, new GUIContent ("Color"));
				EditorGUILayout.PropertyField (innerGlowWidth, new GUIContent ("Width"));
				EditorGUILayout.PropertyField (innerGlowAlwaysOnTop, new GUIContent ("Always On Top", "Shows inner glow on top of any occluding objects."));
				EditorGUI.indentLevel--;
				DrawSectionField (glow, "Outer Glow", glow.floatValue > 0);
				EditorGUI.indentLevel++;
				EditorGUILayout.PropertyField (glowWidth, new GUIContent ("Width"));
				EditorGUILayout.PropertyField (glowHQ, new GUIContent ("HQ", "Additional passes to create a better glow on certain shapes."));
				EditorGUILayout.PropertyField (glowAnimationSpeed, new GUIContent ("Animation Speed"));
				EditorGUILayout.PropertyField (glowDithering, new GUIContent ("Dithering"));
				if (glowDithering.boolValue) {
					EditorGUI.indentLevel++;
					EditorGUILayout.PropertyField (glowMagicNumber1, new GUIContent ("Magic Number 1"));
					EditorGUILayout.PropertyField (glowMagicNumber2, new GUIContent ("Magic Number 2"));
					EditorGUI.indentLevel--;
				}
				EditorGUILayout.PropertyField (glowAlwaysOnTop, new GUIContent ("Always On Top", "Shows outer glow on top of any occluding objects."));
				EditorGUILayout.PropertyField (glowCullBackFaces, new GUIContent ("Cull Back Faces", "Do not render back facing triangles."));
				EditorGUILayout.PropertyField (glowPasses, true);
				EditorGUI.indentLevel--;
				DrawSectionField (targetFX, "Target", targetFX.boolValue);
				EditorGUI.indentLevel++;
				EditorGUILayout.PropertyField (targetFXTexture, new GUIContent ("Texture"));
				EditorGUILayout.PropertyField (targetFXColor, new GUIContent ("Color"));
				EditorGUILayout.PropertyField (targetFXCenter, new GUIContent ("Center", "Optionally assign a transform. Target will follow transform. If the object is skinned, you can also assign a bone to reflect currenct animation position."));
				EditorGUILayout.PropertyField (targetFXRotationSpeed, new GUIContent ("Rotation Speed"));
				EditorGUILayout.PropertyField (targetFXInitialScale, new GUIContent ("Initial Scale"));
				EditorGUILayout.PropertyField (targetFXEndScale, new GUIContent ("End Scale"));
				EditorGUILayout.PropertyField (targetFXTransitionDuration, new GUIContent ("Transition Duration"));
				EditorGUILayout.PropertyField (targetFXStayDuration, new GUIContent ("Stay Duration"));
				EditorGUI.indentLevel--;
			}
			EditorGUILayout.Separator ();
			EditorGUILayout.LabelField ("See-Through Options", EditorStyles.boldLabel);
			EditorGUILayout.PropertyField (seeThrough);
			if (isManager && seeThrough.intValue == (int)SeeThroughMode.AlwaysWhenOccluded) {
				EditorGUILayout.HelpBox ("This option is not valid in Manager.\nTo make an object always visible add a Highlight Effect component to the gameobject and enable this option on the component.", MessageType.Error);
			}
			EditorGUI.indentLevel++;
			EditorGUILayout.PropertyField (seeThroughIntensity, new GUIContent ("Intensity"));
			EditorGUILayout.PropertyField (seeThroughTintAlpha, new GUIContent ("Alpha"));
			EditorGUILayout.PropertyField (seeThroughTintColor, new GUIContent ("Color"));
			EditorGUI.indentLevel--;

			if (serializedObject.ApplyModifiedProperties () || profileChanged) {
				if (thisEffect.profile != null) {
					if (profileChanged) {
						thisEffect.profile.Load (thisEffect);
						profileChanged = false;
						enableProfileApply = false;
					} else {
						enableProfileApply = true;
					}
				}

				foreach (HighlightEffect effect in targets) {
					effect.Refresh ();
				}
			}
			HighlightEffect _effect = (HighlightEffect)target;
			if (_effect != null && _effect.previewInEditor) {
				EditorUtility.SetDirty (_effect);
			}
		}
        public override void OnInspectorGUI()
        {
            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include"));
            if (effectGroup.intValue == (int)TargetOptions.Layer)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(alphaCutOff);
            EditorGUILayout.PropertyField(cullBackFaces);
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(fadeInDuration);
            EditorGUILayout.PropertyField(fadeOutDuration);
            EditorGUILayout.PropertyField(outline);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(outlineQuality, new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."));
            EditorGUILayout.PropertyField(outlineAlwaysOnTop, new GUIContent("Always On Top", "Shows outline on top of any occluding objects."));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(glow, new GUIContent("Outer Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(glowQuality, new GUIContent("Quality", "Default and High use a mesh displacement technique. Highest quality can provide best look and also performance depending on the complexity of mesh."));
            EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUILayout.PropertyField(glowAlwaysOnTop, new GUIContent("Always On Top", "Shows outer glow on top of any occluding objects."));
            if (glowQuality.intValue != (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
                if (glowDithering.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
                    EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.PropertyField(glowPasses, true);
            }
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(innerGlow, new GUIContent("Inner Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(innerGlowAlwaysOnTop, new GUIContent("Always On Top", "Shows inner glow on top of any occluding objects."));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(overlay);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
            EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
            EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(targetFX, new GUIContent("Target"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture"));
            EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
            EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
            EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
            EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
            EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
            EditorGUI.indentLevel--;

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("See-Through Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(seeThrough);
            EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("   Intensity"));
            EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("   Alpha"));
            EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("   Color"));

            if (serializedObject.ApplyModifiedProperties() || (Event.current.type == EventType.ExecuteCommand &&
                                                               Event.current.commandName == "UndoRedoPerformed"))
            {
                // Triggers profile reload on all Highlight Effect scripts
                HighlightEffect[] effects = FindObjectsOfType <HighlightEffect> ();
                for (int t = 0; t < targets.Length; t++)
                {
                    HighlightProfile profile = (HighlightProfile)targets [t];
                    for (int k = 0; k < effects.Length; k++)
                    {
                        if (effects [k] != null && effects [k].profile == profile && effects [k].profileSync)
                        {
                            profile.Load(effects [k]);
                            effects [k].Refresh();
                        }
                    }
                }
                EditorUtility.SetDirty(target);
            }
        }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("Highlight Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(effectGroup, new GUIContent("Include"));
            if (effectGroup.intValue == (int)TargetOptions.LayerInScene || effectGroup.intValue == (int)TargetOptions.LayerInChildren)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(effectGroupLayer, new GUIContent("Layer"));
                EditorGUI.indentLevel--;
            }
            if (effectGroup.intValue != (int)TargetOptions.OnlyThisObject && effectGroup.intValue != (int)TargetOptions.Scripting)
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.PropertyField(effectNameFilter, new GUIContent("Object Name Filter"));
                EditorGUILayout.PropertyField(combineMeshes);
                EditorGUI.indentLevel--;
            }
            EditorGUILayout.PropertyField(alphaCutOff);
            EditorGUILayout.PropertyField(cullBackFaces);
            EditorGUILayout.PropertyField(normalsOption);
            EditorGUILayout.PropertyField(fadeInDuration);
            EditorGUILayout.PropertyField(fadeOutDuration);
            EditorGUILayout.PropertyField(constantWidth);
            EditorGUILayout.PropertyField(outline);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(outlineWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(outlineColor, new GUIContent("Color"));
            HighlightEffectEditor.QualityPropertyField(outlineQuality);
            if (outlineQuality.intValue == (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(outlineDownsampling, new GUIContent("Downsampling"));
            }
            if (outlineQuality.intValue == (int)QualityLevel.Highest && glowQuality.intValue == (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
            }
            else
            {
                EditorGUILayout.PropertyField(outlineVisibility, new GUIContent("Visibility"));
            }
            EditorGUILayout.PropertyField(outlineIndependent, new GUIContent("Independent", "Do not combine outline with other highlighted objects."));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(glow, new GUIContent("Outer Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(glowWidth, new GUIContent("Width"));
            HighlightEffectEditor.QualityPropertyField(glowQuality);
            if (glowQuality.intValue == (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowDownsampling, new GUIContent("Downsampling"));
                EditorGUILayout.PropertyField(glowHQColor, new GUIContent("Color"));
            }
            EditorGUILayout.PropertyField(glowAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUILayout.PropertyField(glowVisibility, new GUIContent("Visibility"));
            if (glowQuality.intValue != (int)QualityLevel.Highest)
            {
                EditorGUILayout.PropertyField(glowDithering, new GUIContent("Dithering"));
                if (glowDithering.boolValue)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(glowMagicNumber1, new GUIContent("Magic Number 1"));
                    EditorGUILayout.PropertyField(glowMagicNumber2, new GUIContent("Magic Number 2"));
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.PropertyField(glowBlendPasses, new GUIContent("Blend Passes"));
                EditorGUILayout.PropertyField(glowPasses, true);
            }
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(innerGlow, new GUIContent("Inner Glow"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(innerGlowColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(innerGlowWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(innerGlowVisibility, new GUIContent("Visibility"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(overlay);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(overlayColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(overlayBlending, new GUIContent("Blending"));
            EditorGUILayout.PropertyField(overlayMinIntensity, new GUIContent("Min Intensity"));
            EditorGUILayout.PropertyField(overlayAnimationSpeed, new GUIContent("Animation Speed"));
            EditorGUI.indentLevel--;
            EditorGUILayout.PropertyField(targetFX, new GUIContent("Target"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(targetFXTexture, new GUIContent("Texture"));
            EditorGUILayout.PropertyField(targetFXColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(targetFXRotationSpeed, new GUIContent("Rotation Speed"));
            EditorGUILayout.PropertyField(targetFXInitialScale, new GUIContent("Initial Scale"));
            EditorGUILayout.PropertyField(targetFXEndScale, new GUIContent("End Scale"));
            EditorGUILayout.PropertyField(targetFXTransitionDuration, new GUIContent("Transition Duration"));
            EditorGUILayout.PropertyField(targetFXStayDuration, new GUIContent("Stay Duration"));
            EditorGUI.indentLevel--;

            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("See-Through Options", EditorStyles.boldLabel);
            EditorGUILayout.PropertyField(seeThrough);
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughIntensity, new GUIContent("Intensity"));
            EditorGUILayout.PropertyField(seeThroughTintColor, new GUIContent("Color"));
            EditorGUILayout.PropertyField(seeThroughTintAlpha, new GUIContent("Color Blend"));
            EditorGUILayout.PropertyField(seeThroughNoise, new GUIContent("Noise"));
            EditorGUILayout.PropertyField(seeThroughBorder, new GUIContent("Border When Hidden"));
            EditorGUI.indentLevel++;
            EditorGUILayout.PropertyField(seeThroughBorderWidth, new GUIContent("Width"));
            EditorGUILayout.PropertyField(seeThroughBorderColor, new GUIContent("Color"));
            EditorGUI.indentLevel--;
            EditorGUI.indentLevel--;

            if (serializedObject.ApplyModifiedProperties() || (Event.current.type == EventType.ExecuteCommand &&
                                                               Event.current.commandName == "UndoRedoPerformed"))
            {
                // Triggers profile reload on all Highlight Effect scripts
                HighlightEffect[] effects = FindObjectsOfType <HighlightEffect>();
                for (int t = 0; t < targets.Length; t++)
                {
                    HighlightProfile profile = (HighlightProfile)targets[t];
                    for (int k = 0; k < effects.Length; k++)
                    {
                        if (effects[k] != null && effects[k].profile == profile && effects[k].profileSync)
                        {
                            profile.Load(effects[k]);
                            effects[k].Refresh();
                        }
                    }
                }
                EditorUtility.SetDirty(target);
            }
        }