public void HitByZRoot(ZRoot zr, Rigidbody rb)
    {
        if (!isEnable)
        {
            return;
        }

        Vector3 dir = rb.transform.position - transform.position;

        switch (interactDefinition)
        {
        case InteractType.Pull:
            PullForce(dir.normalized, dir.magnitude * forceMultiplier);
            break;

        case InteractType.Usable:
            UseObject();
            break;

        case InteractType.Grapple:
            GrappleForce(-dir.normalized, dir.magnitude * forceMultiplier, zr);
            break;

        default:
            break;
        }
    }
    public void checkAimRelease()
    {
        if (!isAiming)
        {
            return;
        }

        switch (currentAmmo.type)
        {
        case GauntletType.Zroot:
            ZRoot zRoot = currentAmmo.ammoObject.GetComponent <ZRoot> ();
            if (!zRoot.isShot() && !levController.isJumping)
            {
                setLockAim(false);
            }
            break;
        }
    }
    public void shoot()
    {
        if (!isAiming || !levController.isGrounded || levController.isJumping || currentAmmo == null)
        {
            return;
        }

        levController.FacingDirectionInstant = levController.facingDirection;
        Vector3 aimDirection = Quaternion.AngleAxis(aimAngle, levController.transform.forward) * levController.transform.right;

        switch (currentAmmo.type)
        {
        case GauntletType.Zroot:
            ZRoot zRoot = currentAmmo.ammoObject.GetComponent <ZRoot> ();
            if (!zRoot.isShot())
            {
                zRoot.shootZRoot(gauntletNozzle.position, aimDirection);
                levController.levAnimator.SetTrigger("isShooting");
                setLockAim(true);
            }
            break;
        }
    }
 virtual public void GrappleForce(Vector3 direction, float forcePower, ZRoot targetZR)
 {
     targetZR.GrappleForce(direction, forcePower);
 }