void OnGUI()
    {
        EditorGUILayout.BeginVertical();

        root    = (Transform)EditorGUILayout.ObjectField("Ragdoll Root", root, typeof(Transform), true);
        folder  = EditorGUILayout.ObjectField("Destination Folder", folder, typeof(Object), false);
        ragdoll = (RagdollAsset)EditorGUILayout.ObjectField("Ragdoll to Update (Optional)", ragdoll, typeof(RagdollAsset), false);

        GUILayoutHelpers.HorzLine();

        GUI.enabled = (root != null) && ((ragdoll != null) || (folder != null));

        if (GUILayout.Button((ragdoll != null) ? "Update Ragdoll Asset" : "Create Ragdoll Asset"))
        {
            if (ragdoll != null)
            {
                ragdoll.Rebuild(root);
            }
            else
            {
                if (RagdollAsset.Create(root, Utils.SafeGetNewAssetPathFromPath(AssetDatabase.GetAssetPath(folder) + "/NewRagdoll")) == null)
                {
                    EditorUtility.DisplayDialog("Error", "No ragdoll components were found from the specified root.", "OK");
                }
            }
        }

        GUI.enabled = true;

        EditorGUILayout.EndVertical();
    }
    public static RagdollAsset Create(Transform root, string path)
    {
        List <Element> elements = new List <Element>();

        var bodies = root.GetComponentsInChildren <Rigidbody>(true);

        foreach (var rb in bodies)
        {
            var collider = rb.GetComponent <Collider>();
            if (collider != null)
            {
                var joint = rb.GetComponent <CharacterJoint>();

                var elem = new Element();
                elem.path      = Utils.GetChildPath(root, rb.transform);
                elem.collider  = ColliderDescription.New(collider);
                elem.rigidBody = RigidbodyDescription.New(rb);
                if (joint != null)
                {
                    elem.joint = CharacterJointDescription.New(joint, root);
                }

                elements.Add(elem);
            }
        }

        RagdollAsset asset = null;

        if (elements.Count > 0)
        {
            asset          = Utils.CreateAsset <RagdollAsset>(path);
            asset.elements = elements;
        }

        return(asset);
    }