private void Update()
    {
        #region AttackCooldown

        if (currentAttackCooldown > 0)
        {
            currentAttackCooldown -= Time.deltaTime;
        }

        #endregion

        #region CreatureDetection

        Collider[] result = Physics.OverlapSphere(transform.position, detectCreatureRange);
        attackables.Clear();
        Player player = null;

        foreach (var item in result)
        {
            if (player == null)
            {
                player = item.GetComponentInParent <Player>();
                if (player != null)
                {
                    attackables.Add(player);
                    continue;
                }
            }

            CreatureAI creature = item.GetComponent <CreatureAI>();
            if (creature != null)
            {
                attackables.Add(creature);
            }
        }

        IAttackableByEnemy closest = null;
        float closestDistance      = float.MaxValue;

        foreach (var item in attackables)
        {
            float distance = Vector3.Distance(transform.position, item.transform.position);
            if (distance < closestDistance)
            {
                closest         = item;
                closestDistance = distance;
            }
        }

        if (closest != null)
        {
            StartCoroutine(Attack(closest));
        }
        #endregion
    }
    public void EndAttack()
    {
        if (tempAttackTarget == null)
        {
            return;
        }

        navMeshAgent.updateRotation = true;
        navMeshAgent.speed          = defaultSpeed;
        navMeshAgent.angularSpeed   = defaultAngularSpeed;
        navMeshAgent.acceleration   = defaultAcceleration;
        navMeshAgent.isStopped      = false;
        currentDestination          = FindClosestDestination();
        patrolCoroutine             = StartCoroutine(Patrol());
        currentAttackCooldown       = attackCooldown;
        tempAttackTarget            = null;
    }
    private IEnumerator Attack(IAttackableByEnemy target)
    {
        if (currentAttackCooldown > 0)
        {
            yield break;
        }

        currentAttackCooldown = float.MaxValue;

        StopCoroutine(patrolCoroutine);
        navMeshAgent.speed        = defaultSpeed * 2f;
        navMeshAgent.angularSpeed = 360;

        bool reached = false;

        while (!reached)
        {
            foreach (var item in Physics.OverlapSphere(target.transform.position, 1.9f))
            {
                if (item == myCollider)
                {
                    reached = true;
                    break;
                }
            }

            navMeshAgent.SetDestination(target.transform.position);
            yield return(null);
        }

        navMeshAgent.updateRotation = false;
        StartCoroutine(LockOnRotation(target.transform));

        navMeshAgent.ResetPath();
        navMeshAgent.isStopped = true;

        animator.SetTrigger(EnemyCreatureAnimations.AttackTrigger);
        tempAttackTarget = target;
    }