void Pursue()
    {
        distanceFromPlayer = Vector3.Distance(transform.position, player.transform.position);

        if (enemyAlerted == true)
        {
            if (distanceFromPlayer <= safeDistanceFromPlayer)
            {
                Vector3 targetDir = player.transform.position - transform.position;

                float relativeHeading = Vector3.Angle(transform.forward, transform.TransformVector(player.transform.forward));
                float toTarget        = Vector3.Angle(transform.forward, transform.TransformVector(targetDir));

                if (toTarget > 90 && relativeHeading < 20 || player.GetComponent <PlayerMovement>().speed < 0.01f)
                {
                    Seek(player.transform.position);
                    return;
                }

                float lookAhead = targetDir.magnitude / (agent.speed + player.GetComponent <PlayerMovement>().speed);
                Seek(player.transform.position + player.transform.forward * lookAhead);
            }
            if (distanceFromPlayer > safeDistanceFromPlayer)
            {
                enemyAlerted = false;
                enemyState   = GlobalVariables.EnemyStates.Wander;
            }
        }
    }
    protected virtual void Start()
    {
        agent = GetComponent <NavMeshAgent>();

        player = GameObject.FindWithTag("Player");

        enemyState = GlobalVariables.EnemyStates.Wander;

        coolDown = false;

        enemyAlerted = false;

        isDead = false;

        enemyHealthSlider = GetComponentInChildren <Slider>();

        curEnemyHealth = maxEnemyHealth;

        enemyHealthSlider.value = CalculatingEnemyHealth();
    }
    void Wander()
    {
        distanceFromPlayer = Vector3.Distance(transform.position, player.transform.position);
        //Debug.Log(distanceFromPlayer);

        if (!enemyAlerted && distanceFromPlayer >= safeDistanceFromPlayer)
        {
            wanderTarget += new Vector3(Random.Range(-1.0f, 1.0f) * wanderJitter, 0, Random.Range(-1.0f, 1.0f) * wanderJitter);

            wanderTarget.Normalize();
            wanderTarget *= wanderRadius;

            Vector3 targetLocal = wanderTarget + new Vector3(0, 0, wanderDistance);
            Vector3 targetWorld = gameObject.transform.InverseTransformVector(targetLocal);
            targetWorld = Random.insideUnitSphere * wanderRadius;

            Seek(targetWorld);
        }
        else
        {
            enemyAlerted = true;
            enemyState   = GlobalVariables.EnemyStates.Pursue;
        }
    }