/// <summary>
        /// Draws the inspector.
        /// </summary>
        public static MovementVariable[] DrawInspector(MovementVariable[] movementData, ref bool showDetails, Character target)
        {
            if (movementData == null || movementData.Length < MovementVariableCount)
            {
                movementData = new MovementVariable[MovementVariableCount];
            }

            // Air speed
            if (movementData[AirSpeedIndex] == null)
            {
                movementData[AirSpeedIndex] = new MovementVariable(DefaultAirSpeed);
            }
            movementData[AirSpeedIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Air Speed (x)", "How fast the character moves in the X direction whle in the air."), movementData[AirSpeedIndex].FloatValue);
            if (movementData[AirSpeedIndex].FloatValue < 0)
            {
                movementData[AirSpeedIndex].FloatValue = 0.0f;
            }

            showDetails = EditorGUILayout.Foldout(showDetails, "Details");
            if (showDetails)
            {
                movementData = AirMovement.DrawStandardJumpDetails(movementData, JumpRelativeGravityIndex, GroundedLeewayIndex, JumpWhenButtonHeldIndex);
            }

            return(movementData);
        }
        /// <summary>
        /// Draws the inspector.
        /// </summary>
        public static MovementVariable[] DrawInspector(MovementVariable[] movementData, ref bool showDetails, Character target)
        {
            if (movementData == null || movementData.Length != MovementVariableCount)
            {
                movementData = new MovementVariable[MovementVariableCount];
            }

            // Air speed
            if (movementData[AirSpeedIndex] == null)
            {
                movementData[AirSpeedIndex] = new MovementVariable(DefaultAirSpeed);
            }
            movementData[AirSpeedIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Air Speed (x)", "How fast the character moves in the X direction whle in the air."), movementData[AirSpeedIndex].FloatValue);
            if (movementData[AirSpeedIndex].FloatValue < 0)
            {
                movementData[AirSpeedIndex].FloatValue = 0.0f;
            }

            // Jump height
            if (movementData[JumpHeightIndex] == null)
            {
                movementData[JumpHeightIndex] = new MovementVariable(DefaultJumpHeight);
            }
            movementData[JumpHeightIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Jump Height", "How high the character jumps"), movementData[JumpHeightIndex].FloatValue);
            if (movementData[JumpHeightIndex].FloatValue < 0)
            {
                movementData[JumpHeightIndex].FloatValue = 0.0f;
            }

            showDetails = EditorGUILayout.Foldout(showDetails, "Details");

            // Make sure we set defaults regardless of showDetails
            if (movementData[JumpRelativeGravityIndex] == null || movementData[JumpRelativeGravityIndex].FloatValue <0.01f || movementData[JumpRelativeGravityIndex].FloatValue> 2.0f)
            {
                movementData[JumpRelativeGravityIndex] = new MovementVariable(DefaultRelativeJumpGravity);
            }
            if (movementData[GroundedLeewayIndex] == null)
            {
                movementData[GroundedLeewayIndex] = new MovementVariable(DefaultGroundedLeeway);
            }
            if (movementData[JumpWhenButtonHeldIndex] == null)
            {
                movementData[JumpWhenButtonHeldIndex] = new MovementVariable();
            }



            if (showDetails)
            {
                movementData = AirMovement.DrawStandardJumpDetails(movementData, JumpRelativeGravityIndex, GroundedLeewayIndex, JumpWhenButtonHeldIndex);
            }

            return(movementData);
        }
        /// <summary>
        /// Draws the inspector.
        /// </summary>
        public static MovementVariable[] DrawInspector(MovementVariable[] movementData, ref bool showDetails, Character target)
        {
            if (movementData == null || movementData.Length < MovementVariableCount)
            {
                movementData = new MovementVariable[MovementVariableCount];
            }

            // Air speed
            if (movementData[AirSpeedIndex] == null)
            {
                movementData[AirSpeedIndex] = new MovementVariable(DefaultAirSpeed);
            }
            movementData[AirSpeedIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Air Speed (x)", "How fast the character moves in the X direction whle in the air."), movementData[AirSpeedIndex].FloatValue);
            if (movementData[AirSpeedIndex].FloatValue < 0)
            {
                movementData[AirSpeedIndex].FloatValue = 0.0f;
            }

            // Min Jump height
            if (movementData[MinJumpHeightIndex] == null)
            {
                movementData[MinJumpHeightIndex] = new MovementVariable(DefaultMinJumpHeight);
            }
            movementData[MinJumpHeightIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Min Jump Height", "How high the character jumps if jump button is tapped."), movementData[MinJumpHeightIndex].FloatValue);
            if (movementData[MinJumpHeightIndex].FloatValue < 0)
            {
                movementData[MinJumpHeightIndex].FloatValue = 0.0f;
            }

            // Max Jump height
            if (movementData[MaxJumpHeightIndex] == null)
            {
                movementData[MaxJumpHeightIndex] = new MovementVariable(DefaultMaxJumpHeight);
            }
            movementData[MaxJumpHeightIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Max Jump Height", "How high the character jumps if jump button is held for full jump acceleration time."), movementData[MaxJumpHeightIndex].FloatValue);
            if (movementData[MaxJumpHeightIndex].FloatValue < movementData[MinJumpHeightIndex].FloatValue)
            {
                movementData[MaxJumpHeightIndex].FloatValue = movementData[MinJumpHeightIndex].FloatValue;
            }

            // Jump Time
            if (movementData[MaxJumpAccelerationTimeIndex] == null)
            {
                movementData[MaxJumpAccelerationTimeIndex] = new MovementVariable(DefaultMaxJumpAccelerationTime);
            }
            movementData[MaxJumpAccelerationTimeIndex].FloatValue = EditorGUILayout.Slider(new GUIContent("Max Jump Time", "How long the player has to hold jump for the max height to be reached."), movementData[MaxJumpAccelerationTimeIndex].FloatValue, 0.01f, 1.0f);

            // Jump Time
            if (movementData[CanDoubleJumpIndex] == null)
            {
                movementData[CanDoubleJumpIndex] = new MovementVariable();
            }
            movementData[CanDoubleJumpIndex].BoolValue = EditorGUILayout.Toggle(new GUIContent("Can Double Jump", "If true player can double jump."), movementData[CanDoubleJumpIndex].BoolValue);


            showDetails = EditorGUILayout.Foldout(showDetails, "Details");

            // Make sure we set defaults regardless of showDetails
            if (movementData[JumpRelativeGravityIndex] == null || movementData[JumpRelativeGravityIndex].FloatValue <0.01f || movementData[JumpRelativeGravityIndex].FloatValue> 2.0f)
            {
                movementData[JumpRelativeGravityIndex] = new MovementVariable(DefaultRelativeJumpGravity);
            }
            if (movementData[GroundedLeewayIndex] == null)
            {
                movementData[GroundedLeewayIndex] = new MovementVariable(DefaultGroundedLeeway);
            }
            if (movementData[JumpWhenButtonHeldIndex] == null)
            {
                movementData[JumpWhenButtonHeldIndex] = new MovementVariable();
            }


            if (showDetails)
            {
                movementData = AirMovement.DrawStandardJumpDetails(movementData, JumpRelativeGravityIndex, GroundedLeewayIndex, JumpWhenButtonHeldIndex);
            }

            // As this may not be set if show details are closed lets set it.
            if (movementData [JumpRelativeGravityIndex] == null)
            {
                movementData [JumpRelativeGravityIndex] = new MovementVariable(DefaultRelativeJumpGravity);
            }

            // Check for things that don't look right
            if (((movementData[MaxJumpHeightIndex].FloatValue - movementData[MinJumpHeightIndex].FloatValue) * movementData[MaxJumpAccelerationTimeIndex].FloatValue) > 0.5f)
            {
                EditorGUILayout.HelpBox("Your jump settings mean that your character may moves in an unnatural floaty way if jump is held. Consider reducing Max Jump Time or increasing the Min Jump Height.", MessageType.Warning);
                float betterTime = 0.5f / (movementData[MaxJumpHeightIndex].FloatValue - movementData[MinJumpHeightIndex].FloatValue);
                if (betterTime < 1 && betterTime >= 0.1f)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.FlexibleSpace();
                    if (GUILayout.Button(string.Format("Set time to {0:0.00}", betterTime)))
                    {
                        movementData[MaxJumpAccelerationTimeIndex].FloatValue = betterTime;
                    }
                    GUILayout.EndHorizontal();
                }
            }

            // Check for things that don't look right
            if (movementData[JumpRelativeGravityIndex].FloatValue < 1.4f)
            {
                EditorGUILayout.HelpBox("Variable height jumps tend to look more natural with a high relative jump gravity.", MessageType.Warning);
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Set to " + DefaultRelativeJumpGravity))
                {
                    movementData[JumpRelativeGravityIndex].FloatValue = DefaultRelativeJumpGravity;
                }
                GUILayout.EndHorizontal();
            }
            return(movementData);
        }
        /// <summary>
        /// Draws the inspector.
        /// </summary>
        public static MovementVariable[] DrawInspector(MovementVariable[] movementData, ref bool showDetails, Character target)
        {
            if (movementData != null && movementData.Length == MovementVariableCount - 1)
            {
                MovementVariable[] tmp = movementData;
                movementData = new MovementVariable[MovementVariableCount];
                System.Array.Copy(tmp, movementData, MovementVariableCount - 1);
            }
            else if (movementData == null || movementData.Length < MovementVariableCount)
            {
                movementData = new MovementVariable[MovementVariableCount];
            }

            // Air speed
            if (movementData[AirSpeedIndex] == null)
            {
                movementData[AirSpeedIndex] = new MovementVariable(DefaultAirSpeed);
            }
            movementData[AirSpeedIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Air Speed (x)", "How fast the character moves in the X direction whle in the air."), movementData[AirSpeedIndex].FloatValue);
            if (movementData[AirSpeedIndex].FloatValue < 0)
            {
                movementData[AirSpeedIndex].FloatValue = 0.0f;
            }

            // Jump height
            if (movementData[JumpHeightIndex] == null)
            {
                movementData[JumpHeightIndex] = new MovementVariable(DefaultJumpHeight);
            }
            movementData[JumpHeightIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Jump Height", "How high the character jumps"), movementData[JumpHeightIndex].FloatValue);
            if (movementData[JumpHeightIndex].FloatValue < 0)
            {
                movementData[JumpHeightIndex].FloatValue = 0.0f;
            }

            // Can double-jump
            if (movementData[CanDoubleJumpIndex] == null)
            {
                movementData[CanDoubleJumpIndex] = new MovementVariable(DefaultCanDoubleJump);
            }
            movementData[CanDoubleJumpIndex].BoolValue = EditorGUILayout.Toggle(new GUIContent("Can Double-jump", "Can the character double-jump?"), movementData[CanDoubleJumpIndex].BoolValue);

            // Double-jump settings
            if (movementData[DoubleJumpHeightIndex] == null)
            {
                movementData[DoubleJumpHeightIndex] = new MovementVariable(DefaultDoubleJumpHeight);
            }
            if (movementData[MaxDoubleJumpCountIndex] == null)
            {
                movementData[MaxDoubleJumpCountIndex] = new MovementVariable(2);
            }
            if (movementData[CanDoubleJumpIndex].BoolValue)
            {
                // Double-jump height
                movementData[DoubleJumpHeightIndex].FloatValue = EditorGUILayout.FloatField(new GUIContent("Double Jump Height", "How high the character jumps on a double-jump."), movementData[DoubleJumpHeightIndex].FloatValue);
                if (movementData[DoubleJumpHeightIndex].FloatValue < 0)
                {
                    movementData[DoubleJumpHeightIndex].FloatValue = 0.0f;
                }

                if (EditorGUILayout.Toggle(new GUIContent("Infinite Double Jumps", "Can the character jump in the air forever?"), movementData[MaxDoubleJumpCountIndex].IntValue == -1))
                {
                    movementData[MaxDoubleJumpCountIndex].IntValue = -1;
                }
                else
                {
                    // Max Double Jump Count
                    movementData[MaxDoubleJumpCountIndex].IntValue = 1 + EditorGUILayout.IntField(new GUIContent("Max Jumps", "How many times can the character jump while in the air."), movementData[MaxDoubleJumpCountIndex].IntValue - 1);
                    if (movementData[MaxDoubleJumpCountIndex].IntValue < 2)
                    {
                        movementData[MaxDoubleJumpCountIndex].IntValue = 2;
                    }
                }
            }

            showDetails = EditorGUILayout.Foldout(showDetails, "Details");

            // Make sure we set defaults regardless of showDetails
            if (movementData[JumpRelativeGravityIndex] == null || movementData[JumpRelativeGravityIndex].FloatValue <0.01f || movementData[JumpRelativeGravityIndex].FloatValue> 2.0f)
            {
                movementData[JumpRelativeGravityIndex] = new MovementVariable(DefaultRelativeJumpGravity);
            }
            if (movementData[GroundedLeewayIndex] == null)
            {
                movementData[GroundedLeewayIndex] = new MovementVariable(DefaultGroundedLeeway);
            }
            if (movementData[JumpWhenButtonHeldIndex] == null)
            {
                movementData[JumpWhenButtonHeldIndex] = new MovementVariable();
            }

            if (showDetails)
            {
                movementData = AirMovement.DrawStandardJumpDetails(movementData, JumpRelativeGravityIndex, GroundedLeewayIndex, JumpWhenButtonHeldIndex);
            }
            return(movementData);
        }