void BodyMemberToogle(string bodyPart, ref vBodyMember bodyMember, string name)
        {
            if (bodyMember != null)
            {
                Color color = GUI.color;
                GUI.color = seletedBone == bodyPart ? new Color(1, 1, 0, 0.6f) : color;
                if (GUILayout.Button(name, EditorStyles.miniButton, GUILayout.ExpandWidth(true)))
                {
                    if (seletedBone == bodyPart)
                    {
                        seletedBone = "null";
                    }
                    else
                    {
                        seletedBone = bodyPart;
                    }
                    seletedHitboxIndex = -1;
                    Repaint();
                }
                GUI.color = color;

                foreach (vHitBox hitBox in bodyMember.attackObject.hitBoxes)
                {
                    if (hitBox != null)
                    {
                        hitBox.gameObject.tag   = "Ignore Ragdoll";
                        hitBox.gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");
                    }
                }
            }
        }
        void CheckSingleHitBox(Transform transform, vHumanBones bodyPart, bool debug = false)
        {
            if (transform)
            {
                vMeleeAttackObject attackObject = transform.GetComponent <vMeleeAttackObject>();
                if (attackObject == null)
                {
                    attackObject = transform.gameObject.AddComponent <vMeleeAttackObject>();
                }

                var _hitBoxes     = transform.GetComponentsInChildren <vHitBox>();
                var validHitBoxes = _hitBoxes.vToList().FindAll(hitBox => hitBox.transform.parent == attackObject.transform);

                attackObject.hitBoxes = validHitBoxes;

                if (manager && manager.Members != null)
                {
                    var bodyMembers = manager.Members.FindAll(member => member.bodyPart == bodyPart.ToString());
                    if (bodyMembers.Count > 0)
                    {
                        bodyMembers[0].isHuman      = true;
                        bodyMembers[0].attackObject = attackObject;
                        bodyMembers[0].bodyPart     = bodyPart.ToString();
                        bodyMembers[0].transform    = transform;
                        if (bodyMembers.Count > 1)
                        {
                            for (int i = 1; i < bodyMembers.Count; i++)
                            {
                                manager.Members.Remove(bodyMembers[i]);
                            }
                        }
                        CheckHitBoxes(bodyMembers[0], true);
                        EditorUtility.SetDirty(manager);
                    }
                    else
                    {
                        vBodyMember bodyMember = new vBodyMember();
                        bodyMember.isHuman      = true;
                        bodyMember.attackObject = attackObject;
                        bodyMember.bodyPart     = bodyPart.ToString();
                        bodyMember.transform    = transform;
                        manager.Members.Add(bodyMember);
                        CheckHitBoxes(bodyMember, true);
                        EditorUtility.SetDirty(manager);
                    }
                }
            }
            serializedObject.ApplyModifiedProperties();
        }
 void AddExtraBodyPart()
 {
     GUILayout.BeginVertical(inAddBodyMember ? "highlightBox" : "box");
     if (!inAddBodyMember && GUILayout.Button("Add Extra Body Member", EditorStyles.miniButton, GUILayout.ExpandWidth(true)))
     {
         extraBodyMember = new vBodyMember();
         inAddBodyMember = true;
         isHuman         = true;
     }
     if (inAddBodyMember)
     {
         DrawAddExtraBodyMember();
     }
     GUILayout.EndVertical();
 }
 void DrawBodyMember(ref vBodyMember bodyMember, string name, bool canRemove = false)
 {
     GUILayout.BeginVertical();
     GUILayout.BeginHorizontal();
     //GUILayout.Box("Selected " + name, GUILayout.ExpandWidth(true));
     if (canRemove && GUILayout.Button("X"))
     {
         var hitColliders = bodyMember.attackObject.hitBoxes;
         for (int i = 0; i < hitColliders.Count; i++)
         {
             DestroyImmediate(hitColliders[i].gameObject);
         }
         DestroyImmediate(bodyMember.attackObject);
         manager.Members.Remove(bodyMember);
     }
     GUILayout.EndHorizontal();
     bodyMember.attackObject = EditorGUILayout.ObjectField("Attack Object", bodyMember.attackObject, typeof(vMeleeAttackObject), true) as vMeleeAttackObject;
     bodyMember.attackObject.damageModifier = EditorGUILayout.IntField(new GUIContent("Damage Modifier +", "Use This to Change the Default damage"), bodyMember.attackObject.damageModifier);
     GUILayout.Box("Hit Boxes", GUILayout.ExpandWidth(true));
     DrawHitBoxesList(bodyMember.attackObject);
     GUILayout.EndVertical();
 }
        void CheckHitBoxes(vBodyMember bodyMember, bool isDefault = false)
        {
            if (AssetDatabase.Contains(manager.gameObject))
            {
                return;
            }
            var hitBoxes = bodyMember.transform.GetComponentsInChildren <vHitBox>();
            var _result  = hitBoxes.vToList().FindAll(hitBox => hitBox.transform.parent == bodyMember.transform);

            if (_result.Count > 0)
            {
                bodyMember.attackObject.hitBoxes = _result;
            }
            else
            {
                var hitBox = new GameObject("hitBox", typeof(vHitBox), typeof(BoxCollider));
                var scale  = Vector3.one * 0.15f;
                if (isDefault)
                {
                    var lookDir  = bodyMember.transform.GetChild(0).position - bodyMember.transform.position;
                    var rotation = Quaternion.LookRotation(lookDir);
                    scale.z = Vector3.Distance(bodyMember.transform.position, bodyMember.transform.GetChild(0).position);
                    var point = bodyMember.transform.position + (lookDir.normalized) * (scale.z * 0.7f);
                    hitBox.transform.position   = point;
                    hitBox.transform.rotation   = rotation;
                    hitBox.transform.localScale = scale;
                    hitBox.transform.parent     = bodyMember.transform;
                }
                else
                {
                    hitBox.transform.localScale       = scale;
                    hitBox.transform.parent           = bodyMember.transform;
                    hitBox.transform.localPosition    = Vector3.zero;
                    hitBox.transform.localEulerAngles = Vector3.zero;
                }
            }
        }
        void DrawAddExtraBodyMember()
        {
            if (extraBodyMember != null)
            {
                isHuman = Convert.ToBoolean(EditorGUILayout.Popup("Member Type", Convert.ToInt32(isHuman), new string[] { "Generic", "Human" }));
                extraBodyMember.isHuman = isHuman;
                if (isHuman)
                {
                    vHumanBones humanBone = 0;
                    try
                    {
                        humanBone = (vHumanBones)Enum.Parse(typeof(vHumanBones), extraBodyMember.bodyPart);
                    }
                    catch { }
                    humanBone = (vHumanBones)EditorGUILayout.EnumPopup("Body Part", humanBone);
                    extraBodyMember.bodyPart = humanBone.ToString();
                    var humanBodyBone = (HumanBodyBones)Enum.Parse(typeof(HumanBodyBones), extraBodyMember.bodyPart);
                    extraBodyMember.transform = manager.GetComponent <Animator>().GetBoneTransform(humanBodyBone);
                }
                else
                {
                    extraBodyMember.bodyPart = EditorGUILayout.TextField("BodyPart Name", extraBodyMember.bodyPart);
                }

                extraBodyMember.transform = EditorGUILayout.ObjectField("Body Member", extraBodyMember.transform, typeof(Transform), true) as Transform;

                var valid = true;
                if (extraBodyMember.transform != null && manager.Members.Find(member => member.transform == extraBodyMember.transform) != null)
                {
                    EditorGUILayout.HelpBox("This Body Member already exists, select another", MessageType.Error);
                    valid = false;
                }

                if (manager.Members.Find(member => member.bodyPart == extraBodyMember.bodyPart) != null)
                {
                    EditorGUILayout.HelpBox("This Body Part already exists, select another", MessageType.Error);
                    valid = false;
                }
                GUILayout.BeginHorizontal();
                if (valid)
                {
                    if (GUILayout.Button("Create", EditorStyles.miniButton, GUILayout.ExpandWidth(true)))
                    {
                        vBodyMember member = new vBodyMember();
                        member.attackObject = extraBodyMember.transform.gameObject.AddComponent <vMeleeAttackObject>();
                        member.transform    = extraBodyMember.transform;
                        member.bodyPart     = extraBodyMember.bodyPart;
                        var type      = typeof(BoxCollider);
                        var hitObject = new GameObject("hitBox", typeof(vHitBox), type);
                        hitObject.transform.localScale       = Vector3.one * 0.2f;
                        hitObject.transform.parent           = member.transform;
                        hitObject.transform.localPosition    = Vector3.zero;
                        hitObject.transform.localEulerAngles = Vector3.zero;
                        var hitBox = hitObject.GetComponent <vHitBox>();
                        hitBox.damagePercentage      = 100;
                        hitBox.triggerType           = vHitBoxType.Damage | vHitBoxType.Recoil;
                        member.attackObject.hitBoxes = new List <vHitBox>();
                        member.attackObject.hitBoxes.Add(hitBox);
                        inCreateHitBox = false;
                        manager.Members.Add(member);
                        extraBodyMember = null;
                        inAddBodyMember = false;
                    }
                }
                if (GUILayout.Button("Cancel", EditorStyles.miniButton, GUILayout.ExpandWidth(true)))
                {
                    extraBodyMember = null;
                    inAddBodyMember = false;
                }
                GUILayout.EndHorizontal();
            }
        }