public void Rebuild(Transform root)
    {
        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);
            }
        }

        EditorUtility.SetDirty(this);
    }
    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);
    }