private void OnTriggerEnter2D(Collider2D collision)
        {
            var attackable = collision.GetComponentInParent <IAttackable>();
            var toTarget   = collision.transform.position - this.transform.position;
            var direction  = DirectionalHelper.NormalizeHorizonalDirection(toTarget);

            TryAttack(attackable, direction);
        }
        private bool TryAttack(Transform target)
        {
            var attackable = target.GetComponentInParent <IAttackable>();

            if (IsAttackable(attackable))
            {
                var direction = target.position - transform.position;
                direction = DirectionalHelper.NormalizeHorizonalDirection(direction);
                return(TryAttack(attackable, direction));
            }

            return(false);
        }
        public bool Withdraw()
        {
            if (State == KnifeState.InSheath || State == KnifeState.Returning)
            {
                return(false);
            }

            transform.parent = null;
            State            = KnifeState.Returning;

            _attackMove     = piercing ? chargedAttack : normalAttack;
            _defaultType    = piercing ? AttackType.ChargedRange : AttackType.Range;
            _baseAttackRate = normalAttackRate;
            Activate(AttackPackage.CreateNewPackage(), _attackMove);

            if (stuckOn != null)
            {
                Vector2 toStuckOn = (stuckOn as Component).transform.position - this.transform.position;
                toStuckOn = toStuckOn.normalized * PullingForce;
                if (stuckOn.TryPullOut(this.gameObject, ref toStuckOn))
                {
                    var direction = sheath.transform.position - this.transform.position;
                    direction    = DirectionalHelper.NormalizeHorizonalDirection(direction);
                    _defaultType = AttackType.StuckNDraw;
                    TryAttack(stuckAttack, direction);
                }

                stuckOn = null;
            }

            Returning();


            if (flyingVFX)
            {
                flyingVFX.SetParent(this.transform);
                flyingVFX.position = transform.position;
                flyingVFX.rotation = transform.rotation;
            }

            if (chargeFlyingEffect && piercing)
            {
                chargeFlyingEffect.StartDraw();
            }

            return(true);
        }
        private void HandleFlyingCollision(RaycastHit2D hit)
        {
            var stickable  = hit.collider.GetComponent <ICanStickKnife>();
            var attackable = hit.collider.GetComponentInParent <IAttackable>();

            if (!piercing && !Stuck && stickable != null && stickable.TryStick(this.gameObject))
            {
                Stuck = true;
                State = KnifeState.Stuck;
                transform.position = (Vector3)hit.point + transform.right * sinkingLength;
                transform.SetParent(hit.collider.transform);
                stuckOn = stickable;
            }

            if (IsAttackable(attackable))
            {
                var direction = hit.collider.transform.position - transform.position;
                direction = DirectionalHelper.NormalizeHorizonalDirection(direction);

                if (Stuck)
                {
                    _defaultType = AttackType.StuckNDraw;
                    _attackMove  = drawStuckAttack;
                }

                if (TryAttack(attackable, direction) && Stuck)
                {
                    stuckAttack = attackable;
                }
            }

            if (attackable == null && !Stuck)
            {
                Hover();
            }
        }