public void OnRecoilHit(vHitBox.HitInfo hitInfo)
    {
        if (!hitProperties.useRecoil || !applyDamage)
        {
            return;
        }

        if (InRecoilRange(hitInfo.hitPoint))
        {
            // Check your animation state on the substate machine HitRecoil, this method will trigger the Recoil_ID 0 to trigger the animation HitWall
            SendMessage("TriggerRecoil", 0, SendMessageOptions.DontRequireReceiver);
            // trigger recoil sound
            CurrentMeleeAttack().PlayRecoilSound();
            // instantiate recoil particle
            var hitrotation = Quaternion.LookRotation(new Vector3(transform.position.x, hitInfo.hitPoint.y, transform.position.z) - hitInfo.hitPoint);
            CurrentMeleeAttack().InstantiateParticle(hitInfo.hitPoint, hitrotation);
        }
    }
    public void OnDamageHit(vHitBox.HitInfo hitInfo)
    {
        var damage     = new Damage(CurrentMeleeAttack(currentHitboxFrom).damage);
        var fullDamage = (int)(CurrentMeleeAttack(currentHitboxFrom).damage.value *currentDamageMultiplier);

        damage.hitPosition = hitInfo.hitPoint;
        damage.sender      = transform;
        damage.attackName  = attackName;
        switch (hitInfo.hitBarPoint)
        {
        case HitBarPoints.Top:
            damage.value = (int)((CurrentMeleeAttack(currentHitboxFrom).damagePercentage.Top *(fullDamage)) / 100);
            hitInfo.hitCollider.SendMessage("TakeDamage", damage, SendMessageOptions.DontRequireReceiver);


            break;

        case HitBarPoints.Center:
            damage.value = (int)((CurrentMeleeAttack(currentHitboxFrom).damagePercentage.Center *(fullDamage)) / 100);
            hitInfo.hitCollider.SendMessage("TakeDamage", damage, SendMessageOptions.DontRequireReceiver);
            break;
        }
    }