Beispiel #1
0
 /// <summary>
 /// Executed every frame
 /// </summary>
 public void Update()
 {
     if (timerMode)
     {
         // Elapse time if in timer mode
         timeElapsed += Time.deltaTime;
         if ((!timeSkillActivated && timeElapsed <= maxTime) || (timeSkillActivated && timeElapsed <= maxTimeSkill))
         {
             // Update timer if not reach maximum yet
             if (timeSkillActivated)
             {
                 healthBar.UpdateBar(maxTimeSkill - timeElapsed, maxTimeSkill);
             }
             else
             {
                 healthBar.UpdateBar(maxTime - timeElapsed, maxTime);
             }
         }
         else
         {
             // Maximum allowed time reached
             // Disable timer mode and restore health bar
             timerMode = false;
             healthBar.UpdateBar(health, maxHealth);
             // Disable prolong timer mode
             timeSkillActivated = false;
             // Restore the text
             healthBar.UpdateTextColor(Color.white);
             // Raise TimeReached event
             OnTimeReached(EventArgs.Empty);
         }
     }
 }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.BeginVertical("Box");

        // ----- < BAR NAME > ----- //
        if (statusName.stringValue == string.Empty && Event.current.type == EventType.Repaint)
        {
            GUIStyle style = new GUIStyle(GUI.skin.textField);
            style.normal.textColor = new Color(0.5f, 0.5f, 0.5f, 0.75f);
            EditorGUILayout.TextField(new GUIContent("Bar Name", "The unique name to be used in reference to this bar."), "Bar Name", style);
        }
        else
        {
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(statusName, new GUIContent("Bar Name", "The unique name to be used in reference to this bar."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                DuplicateStatusName.target = GetDuplicateBarName();
                NameUnassigned.target      = targ.barName == string.Empty;
                ExampleCode.target         = targ.barName != string.Empty && !GetDuplicateBarName();
                GenerateExampleCode();
            }
        }
        // ----- < END BAR NAME > ----- //

        // ----- < NAME ERRORS > ----- //
        if (EditorGUILayout.BeginFadeGroup(DuplicateStatusName.faded))
        {
            EditorGUILayout.HelpBox("The bar name \"" + targ.barName + "\" is already being used in this scene. Please make each Simple Health Bar has a unique name.", MessageType.Warning);
        }
        EditorGUILayout.EndFadeGroup();

        if (EditorGUILayout.BeginFadeGroup(ExampleCode.faded))
        {
            GUILayout.Space(1);
            EditorGUILayout.LabelField("Example Code Generator", EditorStyles.boldLabel);
            EditorGUI.BeginChangeCheck();
            functionList = ( FunctionList )EditorGUILayout.EnumPopup("Function", functionList);
            if (EditorGUI.EndChangeCheck())
            {
                GenerateExampleCode();
            }

            EditorGUILayout.TextField(exampleCode);

            GUILayout.Space(1);
        }
        EditorGUILayout.EndFadeGroup();
        // ----- < END NAME ERRORS > ----- //

        EditorGUILayout.EndVertical();

        // ----- < BAR IMAGE > ----- //
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(statusImage, new GUIContent("Image", "The image component to be used for this bar."));
        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
            if (targ.barImage != null && targ.barImage.type != Image.Type.Filled)
            {
                targ.barImage.type       = Image.Type.Filled;
                targ.barImage.fillMethod = Image.FillMethod.Horizontal;
                EditorUtility.SetDirty(targ.barImage);
            }
            if (targ.barImage != null)
            {
                statusColor.colorValue = targ.barImage.color;
                serializedObject.ApplyModifiedProperties();
            }
            targ.UpdateBar(testValue, 100.0f);

            ImageWarning.target          = GetBarImageWarning();
            StatusImageAssigned.target   = GetImageAssigned();
            StatusImageUnassigned.target = GetImageUnassigned();
        }

        if (EditorGUILayout.BeginFadeGroup(StatusImageUnassigned.faded))
        {
            EditorGUILayout.BeginVertical("Box");
            EditorGUILayout.HelpBox("Image is unassigned.", MessageType.Warning);
            if (GUILayout.Button("Find", EditorStyles.miniButton))
            {
                statusImage.objectReferenceValue = targ.GetComponent <Image>();
                serializedObject.ApplyModifiedProperties();
                if (targ.barImage != null)
                {
                    targ.barImage.type       = Image.Type.Filled;
                    targ.barImage.fillMethod = Image.FillMethod.Horizontal;
                    EditorUtility.SetDirty(targ.barImage);

                    statusColor.colorValue = targ.barImage.color;
                    serializedObject.ApplyModifiedProperties();
                }

                ImageWarning.target          = GetBarImageWarning();
                StatusImageAssigned.target   = GetImageAssigned();
                StatusImageUnassigned.target = GetImageUnassigned();
            }
            EditorGUILayout.EndVertical();
        }
        EditorGUILayout.EndFadeGroup();
        // ----- < END BAR IMAGE > ----- //

        if (EditorGUILayout.BeginFadeGroup(StatusImageAssigned.faded))
        {
            // ----- < BAR IMAGE ERROR > ----- //
            if (EditorGUILayout.BeginFadeGroup(ImageWarning.faded))
            {
                EditorGUILayout.BeginVertical("Box");
                EditorGUILayout.HelpBox("Invalid Image Type: " + targ.barImage.type.ToString(), MessageType.Warning);
                if (GUILayout.Button("Fix", EditorStyles.miniButton))
                {
                    targ.barImage.type = Image.Type.Filled;
                    EditorUtility.SetDirty(targ.barImage);

                    ImageWarning.target = GetBarImageWarning();
                }
                EditorGUILayout.EndVertical();
            }
            if (StatusImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END BAR IMAGE ERROR > ----- //

            // ----- < BAR COLORS > ----- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(colorMode, new GUIContent("Color Mode", "The mode in which to display the color to the image component."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                UpdateColor();
                ImageColorWarning.target = GetColorWarning();
            }

            EditorGUI.BeginChangeCheck();
            EditorGUI.indentLevel = 1;
            if (targ.colorMode == SimpleHealthBar.ColorMode.Single)
            {
                EditorGUILayout.PropertyField(statusColor, new GUIContent("Image Color", "The color of this image."));
            }
            else
            {
                EditorGUILayout.PropertyField(statusGradient, new GUIContent("Image Gradient", "The color gradient of this image."));
            }
            EditorGUI.indentLevel = 0;
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                UpdateColor();
                ImageColorWarning.target = GetColorWarning();
            }

            if (EditorGUILayout.BeginFadeGroup(ImageColorWarning.faded))
            {
                EditorGUILayout.BeginVertical("Box");
                EditorGUILayout.HelpBox("Image color has been modified incorrectly.", MessageType.Warning);
                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Update Image", EditorStyles.miniButtonLeft))
                {
                    targ.barImage.color = statusColor.colorValue;
                    EditorUtility.SetDirty(targ.barImage);
                    ImageColorWarning.target = GetColorWarning();
                }
                if (GUILayout.Button("Update Script", EditorStyles.miniButtonRight))
                {
                    statusColor.colorValue = targ.barImage.color;
                    serializedObject.ApplyModifiedProperties();
                    ImageColorWarning.target = GetColorWarning();
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
            }
            if (StatusImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END BAR COLORS > ----- //

            EditorGUILayout.Space();

            // ------- < TEXT OPTIONS > ------- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(displayText, new GUIContent("Display Text", "Determines how this bar will display text to the user."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                DisplayTextOptions.target = targ.displayText != SimpleHealthBar.DisplayText.Disabled;

                targ.UpdateBar(testValue, 100.0f);
                if (statusText.objectReferenceValue != null)
                {
                    EditorUtility.SetDirty(targ.barText);
                }
            }

            if (EditorGUILayout.BeginFadeGroup(DisplayTextOptions.faded))
            {
                EditorGUI.indentLevel = 1;

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(statusText, new GUIContent("Text", "The Text component to be used for the status text."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateTextColor(statusTextColor);
                    targ.UpdateBar(testValue, 100.0f);
                    if (statusText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.BeginChangeCheck();
                statusTextColor = EditorGUILayout.ColorField(new GUIContent("Text Color", "The color of the Text component."), statusTextColor);
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateTextColor(statusTextColor);
                    if (statusText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(additionalText, new GUIContent("Additional Text", "Additional text to be displayed before the current information."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateBar(testValue, 100.0f);
                    if (statusText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.indentLevel = 2;
                switch (targ.displayText)
                {
                case SimpleHealthBar.DisplayText.Percentage:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue + "%");
                }
                break;

                case SimpleHealthBar.DisplayText.CurrentValue:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue);
                }
                break;

                case SimpleHealthBar.DisplayText.CurrentAndMaxValues:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue + " / 100");
                }
                break;

                default:
                {
                    EditorGUILayout.LabelField("Text Preview: Default");
                }
                break;
                }
                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (StatusImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END TEXT OPTIONS > ----- //

            // ----- < FILL CONSTRAINT > ----- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(fillConstraint, new GUIContent("Fill Constraint", "Determines whether or not the image fill should be constrained."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                FillConstraintOptions.target = targ.fillConstraint;
            }

            if (EditorGUILayout.BeginFadeGroup(FillConstraintOptions.faded))
            {
                EditorGUI.indentLevel = 1;

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.Slider(fillConstraintMin, 0.0f, targ.fillConstraintMax, new GUIContent("Fill Minimum", "The minimum fill amount."));
                EditorGUILayout.Slider(fillConstraintMax, targ.fillConstraintMin, 1.0f, new GUIContent("Fill Maximum", "The maximum fill amount."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    if (targ.barImage != null)
                    {
                        targ.barImage.enabled = false;
                        targ.UpdateBar(testValue, 100.0f);
                        targ.barImage.enabled = true;
                    }
                }

                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (StatusImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // --- < END FILL CONSTRAINT > --- //

            // ----- < TEST VALUE > ----- //
            EditorGUI.BeginChangeCheck();
            testValue = EditorGUILayout.Slider(new GUIContent("Test Value"), testValue, 0.0f, 100.0f);
            if (EditorGUI.EndChangeCheck())
            {
                if (targ.barImage != null)
                {
                    targ.barImage.enabled = false;
                    targ.UpdateBar(testValue, 100.0f);
                    targ.barImage.enabled = true;

                    EditorUtility.SetDirty(targ.barImage);
                }
            }
            // ----- < END TEST VALUE > ----- //
        }
        EditorGUILayout.EndFadeGroup();

        Repaint();
    }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.Space();

        EditorGUILayout.BeginVertical("Box");

        // ----- < BAR NAME > ----- //
        if (barName == string.Empty && Event.current.type == EventType.Repaint)
        {
            GUIStyle style = new GUIStyle(GUI.skin.textField);
            style.normal.textColor = new Color(0.5f, 0.5f, 0.5f, 0.75f);
            EditorGUILayout.TextField(new GUIContent("Bar Name", "The unique name to be used in reference to this bar."), "Bar Name", style);
        }
        else
        {
            EditorGUI.BeginChangeCheck();
            barName = EditorGUILayout.TextField(new GUIContent("Bar Name", "The unique name to be used in reference to this bar."), barName);
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                ExampleCode.target = barName != string.Empty;
                GenerateExampleCode();
            }
        }
        // ----- < END BAR NAME > ----- //

        // ----- < NAME ERRORS > ----- //
        if (EditorGUILayout.BeginFadeGroup(ExampleCode.faded))
        {
            GUILayout.Space(1);

            EditorGUILayout.LabelField("Public Variable", EditorStyles.boldLabel);
            EditorGUILayout.LabelField("Copy this variable declaration into your custom scripts.", EditorStyles.wordWrappedLabel);
            EditorGUILayout.TextField("public SimpleHealthBar " + barName + ";");

            EditorGUILayout.LabelField("Example Code Generator", EditorStyles.boldLabel);
            EditorGUILayout.LabelField("Please choose the function that you want to use. Afterward, copy and paste the provided code into your scripts where you want to display a status to the user.", EditorStyles.wordWrappedLabel);
            EditorGUI.BeginChangeCheck();
            functionList = ( FunctionList )EditorGUILayout.EnumPopup("Function", functionList);
            if (EditorGUI.EndChangeCheck())
            {
                GenerateExampleCode();
            }

            EditorGUILayout.TextField(exampleCode);

            GUILayout.Space(1);
        }
        EditorGUILayout.EndFadeGroup();
        // ----- < END NAME ERRORS > ----- //

        EditorGUILayout.EndVertical();

        // ----- < BAR IMAGE > ----- //
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(barImage, new GUIContent("Bar Image", "The image component to be used for this bar."));
        EditorGUILayout.PropertyField(barImageBG, new GUIContent("Bar Image BackGround", "The BackGround image component to be used for this bar."));

        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
            if (targ.barImage != null && targ.barImage.type != Image.Type.Filled)
            {
                targ.barImage.type       = Image.Type.Filled;
                targ.barImage.fillMethod = Image.FillMethod.Horizontal;
                EditorUtility.SetDirty(targ.barImage);
            }
            if (targ.barImage != null)
            {
                barColor.colorValue = targ.barImage.color;
                serializedObject.ApplyModifiedProperties();
            }
            targ.UpdateBar(testValue, 100.0f);

            ImageFilledWarning.target = GetBarImageWarning();
            ImageAssigned.target      = GetImageAssigned();
            ImageUnassigned.target    = GetImageUnassigned();
        }

        if (EditorGUILayout.BeginFadeGroup(ImageUnassigned.faded))
        {
            EditorGUILayout.BeginVertical("Box");
            EditorGUILayout.HelpBox("Image is unassigned.", MessageType.Warning);
            if (GUILayout.Button("Find", EditorStyles.miniButton))
            {
                barImage.objectReferenceValue = targ.GetComponent <Image>();
                serializedObject.ApplyModifiedProperties();
                if (targ.barImage != null)
                {
                    if (targ.barImage.type != Image.Type.Filled)
                    {
                        targ.barImage.type       = Image.Type.Filled;
                        targ.barImage.fillMethod = Image.FillMethod.Horizontal;
                        EditorUtility.SetDirty(targ.barImage);
                    }

                    barColor.colorValue = targ.barImage.color;
                    serializedObject.ApplyModifiedProperties();
                }

                ImageFilledWarning.target = GetBarImageWarning();
                ImageAssigned.target      = GetImageAssigned();
                ImageUnassigned.target    = GetImageUnassigned();
            }
            EditorGUILayout.EndVertical();
        }
        EditorGUILayout.EndFadeGroup();
        // ----- < END BAR IMAGE > ----- //

        if (EditorGUILayout.BeginFadeGroup(ImageAssigned.faded))
        {
            // ----- < BAR IMAGE ERROR > ----- //
            if (EditorGUILayout.BeginFadeGroup(ImageFilledWarning.faded))
            {
                EditorGUILayout.BeginVertical("Box");
                EditorGUILayout.HelpBox("Invalid Image Type: " + targ.barImage.type.ToString(), MessageType.Warning);
                if (GUILayout.Button("Fix", EditorStyles.miniButton))
                {
                    targ.barImage.type = Image.Type.Filled;
                    EditorUtility.SetDirty(targ.barImage);

                    ImageFilledWarning.target = GetBarImageWarning();
                }
                EditorGUILayout.EndVertical();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END BAR IMAGE ERROR > ----- //

            // ----- < BAR COLORS > ----- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(colorMode, new GUIContent("Color Mode", "The mode in which to display the color to the barImage component."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                UpdateStatusColor();
                ImageColorWarning.target = GetColorWarning();
            }

            EditorGUI.BeginChangeCheck();
            EditorGUI.indentLevel = 1;
            if (targ.colorMode == SimpleHealthBar.ColorMode.Single)
            {
                EditorGUILayout.PropertyField(barColor, new GUIContent("Color", "The color of this barImage."));
            }
            else
            {
                EditorGUILayout.PropertyField(barGradient, new GUIContent("Gradient", "The color gradient of this barImage."));
            }
            EditorGUI.indentLevel = 0;
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                UpdateStatusColor();
                ImageColorWarning.target = GetColorWarning();
            }

            if (GetColorWarning())
            {
                ImageColorWarning.target = GetColorWarning();
            }

            if (EditorGUILayout.BeginFadeGroup(ImageColorWarning.faded))
            {
                EditorGUILayout.BeginVertical("Box");
                EditorGUILayout.HelpBox("Image color has been modified incorrectly.", MessageType.Warning);
                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Update Image", EditorStyles.miniButtonLeft))
                {
                    targ.barImage.color = barColor.colorValue;
                    EditorUtility.SetDirty(targ.barImage);
                    ImageColorWarning.target = GetColorWarning();
                }
                if (GUILayout.Button("Update Script", EditorStyles.miniButtonRight))
                {
                    barColor.colorValue = targ.barImage.color;
                    serializedObject.ApplyModifiedProperties();
                    ImageColorWarning.target = GetColorWarning();
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END BAR COLORS > ----- //

            EditorGUILayout.Space();

            // ------- < TEXT OPTIONS > ------- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(displayText, new GUIContent("Display Text", "Determines how this bar will display text to the user."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                DisplayTextOption.target = targ.displayText != SimpleHealthBar.DisplayText.Disabled;

                targ.UpdateBar(testValue, 100.0f);
                if (barText.objectReferenceValue != null)
                {
                    EditorUtility.SetDirty(targ.barText);
                }
            }

            if (EditorGUILayout.BeginFadeGroup(DisplayTextOption.faded))
            {
                EditorGUI.indentLevel = 1;

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(barText, new GUIContent("Bar Text", "The Text component to be used for the text."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateTextColor(textColor);
                    targ.UpdateBar(testValue, 100.0f);
                    if (barText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.BeginChangeCheck();
                textColor = EditorGUILayout.ColorField(new GUIContent("Text Color", "The color of the Text component."), textColor);
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateTextColor(textColor);
                    if (barText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(additionalText, new GUIContent("Additional Text", "Additional text to be displayed before the current information."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateBar(testValue, 100.0f);
                    if (barText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.indentLevel = 2;
                switch (targ.displayText)
                {
                case SimpleHealthBar.DisplayText.Percentage:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue + "%");
                }
                break;

                case SimpleHealthBar.DisplayText.CurrentValue:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue);
                }
                break;

                case SimpleHealthBar.DisplayText.CurrentAndMaxValues:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue + " / 100");
                }
                break;

                default:
                {
                    EditorGUILayout.LabelField("Text Preview: Default");
                }
                break;
                }
                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END TEXT OPTIONS > ----- //

            // ----- < TEST VALUE > ----- //
            EditorGUI.BeginChangeCheck();
            testValue = EditorGUILayout.Slider(new GUIContent("Test Value"), testValue, 0.0f, 100.0f);
            if (EditorGUI.EndChangeCheck())
            {
                if (targ.barImage != null)
                {
                    targ.barImage.enabled = false;
                    targ.UpdateBar(testValue, 100.0f);
                    targ.barImage.enabled = true;
                    EditorUtility.SetDirty(targ.barImage);
                }
            }
            // ----- < END TEST VALUE > ----- //
        }
        EditorGUILayout.EndFadeGroup();

        EditorGUILayout.Space();

        Repaint();
    }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        EditorGUILayout.Space();

        EditorGUILayout.BeginVertical("Box");

        // ----- < BAR NAME > ----- //
        if (barName.stringValue == string.Empty && Event.current.type == EventType.Repaint)
        {
            GUIStyle style = new GUIStyle(GUI.skin.textField);
            style.normal.textColor = new Color(0.5f, 0.5f, 0.5f, 0.75f);
            EditorGUILayout.TextField(new GUIContent("Bar Name", "The unique name to be used in reference to this bar."), "Bar Name", style);
        }
        else
        {
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(barName, new GUIContent("Bar Name", "The unique name to be used in reference to this bar."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                DuplicateBarName.target = GetDuplicateBarName();
                ExampleCode.target      = targ.barName != string.Empty && !GetDuplicateBarName();
                GenerateExampleCode();
            }
        }
        // ----- < END BAR NAME > ----- //

        // ----- < NAME ERRORS > ----- //
        if (EditorGUILayout.BeginFadeGroup(DuplicateBarName.faded))
        {
            EditorGUILayout.HelpBox("The bar name \"" + targ.barName + "\" is already being used in this scene. Please make each Ultimate Health Bar has a unique name.", MessageType.Warning);
        }
        EditorGUILayout.EndFadeGroup();

        if (EditorGUILayout.BeginFadeGroup(ExampleCode.faded))
        {
            GUILayout.Space(1);
            EditorGUILayout.LabelField("Example Code Generator", EditorStyles.boldLabel);
            EditorGUI.BeginChangeCheck();
            functionList = ( FunctionList )EditorGUILayout.EnumPopup("Function", functionList);
            if (EditorGUI.EndChangeCheck())
            {
                GenerateExampleCode();
            }

            EditorGUILayout.TextField(exampleCode);

            GUILayout.Space(1);
        }
        EditorGUILayout.EndFadeGroup();
        // ----- < END NAME ERRORS > ----- //

        EditorGUILayout.EndVertical();

        // ----- < BAR IMAGE > ----- //
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(barImage, new GUIContent("Bar Image", "The image component to be used for this bar."));
        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
            if (targ.barImage != null && targ.barImage.type != Image.Type.Filled)
            {
                targ.barImage.type       = Image.Type.Filled;
                targ.barImage.fillMethod = Image.FillMethod.Horizontal;
                EditorUtility.SetDirty(targ.barImage);
            }
            if (targ.barImage != null)
            {
                barColor.colorValue = targ.barImage.color;
                serializedObject.ApplyModifiedProperties();
            }
            targ.UpdateBar(testValue, 100.0f);

            ImageFilledWarning.target = GetBarImageWarning();
            ImageAssigned.target      = GetImageAssigned();
            ImageUnassigned.target    = GetImageUnassigned();
        }

        if (EditorGUILayout.BeginFadeGroup(ImageUnassigned.faded))
        {
            EditorGUILayout.BeginVertical("Box");
            EditorGUILayout.HelpBox("Image is unassigned.", MessageType.Warning);
            if (GUILayout.Button("Find", EditorStyles.miniButton))
            {
                barImage.objectReferenceValue = targ.GetComponent <Image>();
                serializedObject.ApplyModifiedProperties();
                if (targ.barImage != null)
                {
                    if (targ.barImage.type != Image.Type.Filled)
                    {
                        targ.barImage.type       = Image.Type.Filled;
                        targ.barImage.fillMethod = Image.FillMethod.Horizontal;
                        EditorUtility.SetDirty(targ.barImage);
                    }

                    barColor.colorValue = targ.barImage.color;
                    serializedObject.ApplyModifiedProperties();
                }

                ImageFilledWarning.target = GetBarImageWarning();
                ImageAssigned.target      = GetImageAssigned();
                ImageUnassigned.target    = GetImageUnassigned();
            }
            EditorGUILayout.EndVertical();
        }
        EditorGUILayout.EndFadeGroup();
        // ----- < END BAR IMAGE > ----- //

        if (EditorGUILayout.BeginFadeGroup(ImageAssigned.faded))
        {
            // ----- < BAR IMAGE ERROR > ----- //
            if (EditorGUILayout.BeginFadeGroup(ImageFilledWarning.faded))
            {
                EditorGUILayout.BeginVertical("Box");
                EditorGUILayout.HelpBox("Invalid Image Type: " + targ.barImage.type.ToString(), MessageType.Warning);
                if (GUILayout.Button("Fix", EditorStyles.miniButton))
                {
                    targ.barImage.type = Image.Type.Filled;
                    EditorUtility.SetDirty(targ.barImage);

                    ImageFilledWarning.target = GetBarImageWarning();
                }
                EditorGUILayout.EndVertical();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END BAR IMAGE ERROR > ----- //

            // ----- < BAR COLORS > ----- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(colorMode, new GUIContent("Color Mode", "The mode in which to display the color to the barImage component."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                UpdateStatusColor();
                ImageColorWarning.target = GetColorWarning();
            }

            EditorGUI.BeginChangeCheck();
            EditorGUI.indentLevel = 1;
            if (targ.colorMode == SimpleHealthBar.ColorMode.Single)
            {
                EditorGUILayout.PropertyField(barColor, new GUIContent("Color", "The color of this barImage."));
            }
            else
            {
                EditorGUILayout.PropertyField(barGradient, new GUIContent("Gradient", "The color gradient of this barImage."));
            }
            EditorGUI.indentLevel = 0;
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                UpdateStatusColor();
                ImageColorWarning.target = GetColorWarning();
            }

            if (GetColorWarning())
            {
                ImageColorWarning.target = GetColorWarning();
            }

            if (EditorGUILayout.BeginFadeGroup(ImageColorWarning.faded))
            {
                EditorGUILayout.BeginVertical("Box");
                EditorGUILayout.HelpBox("Image color has been modified incorrectly.", MessageType.Warning);
                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Update Image", EditorStyles.miniButtonLeft))
                {
                    targ.barImage.color = barColor.colorValue;
                    EditorUtility.SetDirty(targ.barImage);
                    ImageColorWarning.target = GetColorWarning();
                }
                if (GUILayout.Button("Update Script", EditorStyles.miniButtonRight))
                {
                    barColor.colorValue = targ.barImage.color;
                    serializedObject.ApplyModifiedProperties();
                    ImageColorWarning.target = GetColorWarning();
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END BAR COLORS > ----- //

            EditorGUILayout.Space();

            // ------- < TEXT OPTIONS > ------- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(displayText, new GUIContent("Display Text", "Determines how this bar will display text to the user."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                DisplayTextOption.target = targ.displayText != SimpleHealthBar.DisplayText.Disabled;

                targ.UpdateBar(testValue, 100.0f);
                if (barText.objectReferenceValue != null)
                {
                    EditorUtility.SetDirty(targ.barText);
                }
            }

            if (EditorGUILayout.BeginFadeGroup(DisplayTextOption.faded))
            {
                EditorGUI.indentLevel = 1;

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(barText, new GUIContent("Bar Text", "The Text component to be used for the text."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateTextColor(textColor);
                    targ.UpdateBar(testValue, 100.0f);
                    if (barText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.BeginChangeCheck();
                textColor = EditorGUILayout.ColorField(new GUIContent("Text Color", "The color of the Text component."), textColor);
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateTextColor(textColor);
                    if (barText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(additionalText, new GUIContent("Additional Text", "Additional text to be displayed before the current information."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    targ.UpdateBar(testValue, 100.0f);
                    if (barText.objectReferenceValue != null)
                    {
                        EditorUtility.SetDirty(targ.barText);
                    }
                }

                EditorGUI.indentLevel = 2;
                switch (targ.displayText)
                {
                case SimpleHealthBar.DisplayText.Percentage:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue + "%");
                }
                break;

                case SimpleHealthBar.DisplayText.CurrentValue:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue);
                }
                break;

                case SimpleHealthBar.DisplayText.CurrentAndMaxValues:
                {
                    EditorGUILayout.LabelField("Text Preview: " + targ.additionalText + testValue + " / 100");
                }
                break;

                default:
                {
                    EditorGUILayout.LabelField("Text Preview: Default");
                }
                break;
                }
                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END TEXT OPTIONS > ----- //

            // ----- < SMOOTH FILL OPTIONS > ----- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(smoothFill, new GUIContent("Smooth Fill", "Determines if the fill amount should be applied over time or not."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                SmoothFillOption.target = targ.smoothFill;
            }
            if (EditorGUILayout.BeginFadeGroup(SmoothFillOption.faded))
            {
                EditorGUI.indentLevel = 1;
                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(smoothFillDuration, new GUIContent("Fill Duration", "Determines how long it takes for the fill amount to reach the target fill amount."));
                if (EditorGUI.EndChangeCheck())
                {
                    if (smoothFillDuration.floatValue < 0)
                    {
                        smoothFillDuration.floatValue = 0;
                    }

                    serializedObject.ApplyModifiedProperties();
                }
                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // ----- < END SMOOTH FILL OPTIONS > ----- //

            // DRAMATIC FILL //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(dramaticFill, new GUIContent("Dramatic Fill", "Determines whether an image should be used for a dramatic fill or not."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                DramaticFillOption.target = targ.dramaticFill != SimpleHealthBar.DramaticFill.Disabled;
                if (targ.dramaticFill != SimpleHealthBar.DramaticFill.Disabled)
                {
                    DramOptionDecrease.target = GetDramaticFillDecrease();
                }

                if (targ.dramaticFill == SimpleHealthBar.DramaticFill.Decrease && targ.smoothFill == true)
                {
                    smoothFill.boolValue = false;
                    serializedObject.ApplyModifiedProperties();
                    SmoothFillOption.target = targ.smoothFill;
                }
                if (targ.dramaticFill == SimpleHealthBar.DramaticFill.Increase && targ.smoothFill == false)
                {
                    smoothFill.boolValue = true;
                    serializedObject.ApplyModifiedProperties();
                    SmoothFillOption.target = targ.smoothFill;
                }
                if (targ.dramaticFill == SimpleHealthBar.DramaticFill.Disabled && targ.dramaticImage != null)
                {
                    targ.dramaticImage.gameObject.SetActive(false);
                }
                else if (targ.dramaticFill != SimpleHealthBar.DramaticFill.Disabled && targ.dramaticImage != null)
                {
                    targ.dramaticImage.gameObject.SetActive(true);
                }
            }
            if (EditorGUILayout.BeginFadeGroup(DramaticFillOption.faded))
            {
                EditorGUI.indentLevel = 1;
                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(dramaticStatusImage, new GUIContent("Image", "The image component to use for the dramatic fill."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    DramImageUnassigned.target = targ.dramaticImage == null;
                    DramImageAssigned.target   = targ.dramaticImage != null;
                    targ.dramaticImage.color   = targ.dramaticColor;
                    EditorUtility.SetDirty(targ.dramaticImage);
                }

                if (EditorGUILayout.BeginFadeGroup(DramImageUnassigned.faded))
                {
                    EditorGUILayout.BeginVertical("Box");
                    EditorGUI.indentLevel = 0;
                    EditorGUILayout.HelpBox("The Dramatic Fill option uses a separate barImage to display under the barImage. Click the button below to create the needed image.", MessageType.None);
                    if (GUILayout.Button("Generate Image", EditorStyles.miniButton))
                    {
                        GameObject obj = new GameObject(targ != null && targ.barName != string.Empty ? "Dramatic " + targ.barName + " Fill" : "Dramatic Fill");
                        obj.layer = LayerMask.NameToLayer("UI");
                        obj.AddComponent <CanvasRenderer>();
                        obj.transform.SetParent(targ.gameObject.transform.parent);
                        obj.transform.SetSiblingIndex(targ.transform.GetSiblingIndex());

                        Image img = obj.AddComponent <Image>();
                        if (targ != null && targ.barImage != null && targ.barImage.sprite != null)
                        {
                            img.sprite = targ.barImage.sprite;
                        }
                        img.type       = Image.Type.Filled;
                        img.fillMethod = Image.FillMethod.Horizontal;

                        RectTransform rt = obj.GetComponent <RectTransform>();
                        rt.anchorMax = new Vector2(1, 1);
                        rt.anchorMin = new Vector2(0, 0);
                        rt.offsetMin = new Vector2(0, 0);
                        rt.offsetMax = new Vector2(0, 0);

                        EditorUtility.SetDirty(obj);

                        targ.dramaticImage = img;
                        EditorUtility.SetDirty(targ);

                        DramImageUnassigned.target = targ.dramaticImage == null;
                        DramImageAssigned.target   = targ.dramaticImage != null;

                        targ.dramaticImage.color = targ.dramaticColor;
                        EditorUtility.SetDirty(targ.dramaticImage);
                    }
                    EditorGUI.indentLevel = 1;
                    EditorGUILayout.EndVertical();
                }
                if (ImageAssigned.faded == 1.0f && DramaticFillOption.faded == 1.0f)
                {
                    EditorGUILayout.EndFadeGroup();
                }

                if (EditorGUILayout.BeginFadeGroup(DramImageAssigned.faded))
                {
                    EditorGUI.BeginChangeCheck();
                    EditorGUILayout.PropertyField(dramaticStatusColor, new GUIContent("Color", "The color to apply to the dramatic fill image."));
                    if (EditorGUI.EndChangeCheck())
                    {
                        serializedObject.ApplyModifiedProperties();
                        targ.dramaticImage.color = targ.dramaticColor;
                        EditorUtility.SetDirty(targ.dramaticImage);
                    }

                    if (EditorGUILayout.BeginFadeGroup(DramOptionDecrease.faded))
                    {
                        EditorGUI.BeginChangeCheck();
                        EditorGUILayout.PropertyField(secondsDelay, new GUIContent("Delay", "Tooltip"));
                        if (EditorGUI.EndChangeCheck())
                        {
                            if (secondsDelay.floatValue < 0)
                            {
                                secondsDelay.floatValue = 0;
                            }

                            serializedObject.ApplyModifiedProperties();
                        }

                        EditorGUI.BeginChangeCheck();
                        EditorGUILayout.Slider(resetSensitivity, 0.0f, 1.0f, new GUIContent("Reset Sensitivity", "Tooltip"));
                        EditorGUILayout.Slider(fillSpeed, 0.0f, 1.0f, new GUIContent("Fill Speed", "Amount of fill per second."));
                        if (EditorGUI.EndChangeCheck())
                        {
                            serializedObject.ApplyModifiedProperties();
                        }
                    }
                    if (ImageAssigned.faded == 1.0f && DramaticFillOption.faded == 1.0f && DramImageAssigned.faded == 1.0f)
                    {
                        EditorGUILayout.EndFadeGroup();
                    }
                }
                if (ImageAssigned.faded == 1.0f && DramaticFillOption.faded == 1.0f)
                {
                    EditorGUILayout.EndFadeGroup();
                }

                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // END DRAMATIC FILL //

            // ----- < FILL CONSTRAINT > ----- //
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(fillConstraint, new GUIContent("Fill Constraint", "Determines whether or not the barImage fill should be constrained."));
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                FillConstraintOption.target = targ.fillConstraint;
            }

            if (EditorGUILayout.BeginFadeGroup(FillConstraintOption.faded))
            {
                EditorGUI.indentLevel = 1;

                EditorGUI.BeginChangeCheck();
                EditorGUILayout.Slider(fillConstraintMin, 0.0f, targ.fillConstraintMax, new GUIContent("Fill Minimum", "The minimum fill amount."));
                EditorGUILayout.Slider(fillConstraintMax, targ.fillConstraintMin, 1.0f, new GUIContent("Fill Maximum", "The maximum fill amount."));
                if (EditorGUI.EndChangeCheck())
                {
                    serializedObject.ApplyModifiedProperties();
                    if (targ.barImage != null)
                    {
                        targ.barImage.enabled = false;
                        targ.UpdateBar(testValue, 100.0f);
                        targ.barImage.enabled = true;
                    }
                }

                EditorGUI.indentLevel = 0;
                EditorGUILayout.Space();
            }
            if (ImageAssigned.faded == 1.0f)
            {
                EditorGUILayout.EndFadeGroup();
            }
            // --- < END FILL CONSTRAINT > --- //

            // ----- < TEST VALUE > ----- //
            EditorGUI.BeginChangeCheck();
            testValue = EditorGUILayout.Slider(new GUIContent("Test Value"), testValue, 0.0f, 100.0f);
            if (EditorGUI.EndChangeCheck())
            {
                if (targ.barImage != null)
                {
                    targ.barImage.enabled = false;
                    targ.UpdateBar(testValue, 100.0f);
                    targ.barImage.enabled = true;

                    EditorUtility.SetDirty(targ.barImage);
                }
            }
            // ----- < END TEST VALUE > ----- //
        }
        EditorGUILayout.EndFadeGroup();

        EditorGUILayout.Space();

        Repaint();
    }