void StateDetailOnEditor()
    {
        if (states.index == -1 || states.index >= _instance.States.Length)
        {
            return;
        }

        AnimationPlayer.AnimationState state = _instance.States[states.index];
        if (state == null)
        {
            return;
        }

        EditorGUILayout.BeginVertical("Box");
        EditorGUILayout.LabelField(state.name, EditorStyles.boldLabel);
        EditorGUI.indentLevel++;

        bool isDirty = false;
        var  speed   = EditorGUILayout.DelayedFloatField("Speed", state.speed);

        if (speed != state.speed)
        {
            state.speed = speed;
            isDirty     = true;
        }

        var applyFootIK = EditorGUILayout.Toggle("Apply Foot IK", state.applyFootIK);

        if (applyFootIK != state.applyFootIK)
        {
            state.applyFootIK = applyFootIK;
            isDirty           = true;
        }

        var applyPlayableIK = EditorGUILayout.Toggle("Apply Playable IK", state.applyPlayableIK);

        if (applyPlayableIK != state.applyPlayableIK)
        {
            state.applyPlayableIK = applyPlayableIK;
            isDirty = true;
        }

        if (isDirty)
        {
            EditorUtility.SetDirty(_instance);
        }

        EditorGUI.indentLevel--;
        EditorGUILayout.EndVertical();
    }
    void StateOnPlay()
    {
        EditorGUILayout.LabelField("Play Mode", EditorStyles.boldLabel);

        // Controller
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Play"))
        {
            _instance.Play();
        }
        if (GUILayout.Button("Stop"))
        {
            _instance.Stop();
        }

        EditorGUILayout.EndHorizontal();

        // State Information
        Color weightZeroColor = new Color(0.18f, 0.3f, 0.15f, 0.7f);
        Color weightOneColor  = new Color(0.68f, 0.825f, 0.65f, 0.3f);

        EditorGUILayout.BeginVertical("Box");
        EditorGUI.indentLevel++;

        playDetailFoldOpened = EditorGUILayout.Foldout(playDetailFoldOpened, playDetailFoldOpened ? "Detail" : "Simple");
        for (int i = 0; i < _instance.States.Length; i++)
        {
            AnimationPlayer.AnimationState state = _instance.States[i];
            if (state == null)
            {
                continue;
            }

            if (i == _instance.CurStateIndex)
            {
                EditorGUILayout.LabelField(state.name, EditorStyles.boldLabel);
            }
            else
            {
                EditorGUILayout.LabelField(state.name);
            }

            EditorGUILayout.ObjectField(state.clip, typeof(AnimationClip), true);
            Rect controlRect = GUILayoutUtility.GetLastRect();
            Rect timeRect    = controlRect;
            timeRect.x      += 16;
            timeRect.y      += 1;
            timeRect.width  -= 35;
            timeRect.height -= 2;
            timeRect.width  *= (state.normalizedTime - (int)state.normalizedTime);
            Color weightColor = Color.Lerp(weightZeroColor, weightOneColor, state.weight);
            EditorGUI.DrawRect(timeRect, weightColor);

            if (playDetailFoldOpened)
            {
                EditorGUILayout.DelayedFloatField("Time", state.time);
                EditorGUILayout.DelayedFloatField("NormalizedTime", state.normalizedTime);
                EditorGUILayout.DelayedFloatField("Weight", state.weight);
                EditorGUILayout.DelayedFloatField("FadeSpeed", state.fadeSpeed);
            }
        }

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