void OnSceneGUI()
    {
        //Debug.Log(this.target.GetType());
        EnhanceCharacterJoint script = (EnhanceCharacterJoint)this.target;

        if (script != null)
        {
            CharacterJoint joint = (CharacterJoint)script.gameObject.GetComponent(typeof(CharacterJoint));

            Vector3 twistAxis  = joint.transform.TransformDirection(joint.axis).normalized;
            Vector3 swing1Axis = joint.transform.TransformDirection(joint.swingAxis).normalized;
            Vector3 swing2Axis = Vector3.Cross(twistAxis, swing1Axis);

            var   position = joint.transform.position;
            float size     = HandleUtility.GetHandleSize(position);

            Handles.color = new Color(1, 0.5f, 0); // orange == twist, direction = swing1, rotates about twist axis
            Handles.DrawWireArc(position, twistAxis, swing1Axis, joint.highTwistLimit.limit, size);
            Handles.DrawWireArc(position, twistAxis, swing1Axis, joint.lowTwistLimit.limit, size);
            Handles.DrawLine(position, position + Quaternion.AngleAxis(joint.highTwistLimit.limit, twistAxis) * swing1Axis * size);
            Handles.DrawLine(position, position + Quaternion.AngleAxis(joint.lowTwistLimit.limit, twistAxis) * swing1Axis * size);

            Handles.color = new Color(0, 0.3f, 0); // green=swing1, direction=twistAxis rotates about swing1Axis
            Handles.DrawWireArc(position, swing1Axis, twistAxis, joint.swing1Limit.limit, size);
            Handles.DrawWireArc(position, swing1Axis, twistAxis, -joint.swing1Limit.limit, size);
            Handles.DrawLine(position, position + Quaternion.AngleAxis(joint.swing1Limit.limit, swing1Axis) * twistAxis * size);
            Handles.DrawLine(position, position + Quaternion.AngleAxis(-joint.swing1Limit.limit, swing1Axis) * twistAxis * size);

            Handles.color = new Color(0, 0, 0.5f); // blue=swing2, direction=twistAxis, rotates about swing2 axis
            Handles.DrawWireArc(position, swing2Axis, twistAxis, joint.swing2Limit.limit, size);
            Handles.DrawWireArc(position, swing2Axis, twistAxis, -joint.swing2Limit.limit, size);
            Handles.DrawLine(position, position + Quaternion.AngleAxis(joint.swing2Limit.limit, swing2Axis) * twistAxis * size);
            Handles.DrawLine(position, position + Quaternion.AngleAxis(-joint.swing2Limit.limit, swing2Axis) * twistAxis * size);
        }
    }
 public override void OnInspectorGUI()
 {
     targetScript = (EnhanceCharacterJoint)target;
     twistColor   = EditorGUILayout.ColorField("Twist Color", twistColor);
     swing1Color  = EditorGUILayout.ColorField("Swing 1 Color", swing1Color);
     swing2Color  = EditorGUILayout.ColorField("Swing 2 Color", swing2Color);
     EditorUtility.SetDirty(targetScript);
     Repaint();
 }
    public void OnSceneGUI()
    {
        targetScript = (EnhanceCharacterJoint)target;

        Color blackColor = Color.black;


        CharacterJoint joint = targetScript.GetComponent <CharacterJoint>();

        Vector3 jointCenter = joint.transform.TransformPoint(joint.anchor);
        Vector3 twistAxis   = joint.transform.TransformDirection(joint.axis).normalized;

        Vector3 forwardAxis = joint.transform.TransformDirection(Vector3.forward);

        //  90 to the twist axis
        Vector3 twist90 = Vector3.Cross(twistAxis, forwardAxis);

        //  high limit
        Handles.color = twistColor;
        Handles.DrawSolidArc(jointCenter, twistAxis, twist90, -joint.highTwistLimit.limit, 1);

        //  Low limit
        blackColor.a  = twistColor.a;
        Handles.color = Color.Lerp(blackColor, twistColor, 0.85f);
        Handles.DrawSolidArc(jointCenter, twistAxis, twist90, -joint.lowTwistLimit.limit, 1);

        //  Swing axis
        Vector3 swingAxis = joint.transform.TransformDirection(joint.swingAxis).normalized;



        Handles.color = swing1Color;
        Handles.DrawSolidArc(jointCenter, swingAxis, twistAxis, -joint.swing1Limit.limit, 1);
        Handles.DrawSolidArc(jointCenter, swingAxis, twistAxis, joint.swing1Limit.limit, 1);

        //  90 to the Swing axis and twist
        Vector3 swingOrtho = Vector3.Cross(swingAxis, twistAxis);


        Handles.color = swing2Color;
        Handles.DrawSolidArc(jointCenter, swingOrtho, twistAxis, -joint.swing2Limit.limit, 1);
        Handles.DrawSolidArc(jointCenter, swingOrtho, twistAxis, joint.swing2Limit.limit, 1);
    }