Te explico lo que hago. Utilizo un sphere collider para definir si el jugador está dentro del alcance que quiero darle a ese npc. Luego me fijo si está a la vista del npc. Si está de frente. En mi caso hay sigilo, así que si va agachado por un costado o por detrás el npc no lo detecta. De lo contrario lo detecta igual pero un poco más cerca que si lo tuviese a la vista. Bueno, al momento del avance, utilizo esto:
Vector3 direccionataca_ = player_.transform.position - transform.position;
GetComponent<UnityEngine.AI.NavMeshAgent>().destination = player_.transform.position - (direccionataca_.normalized * 2.6f);
var rotacion_ = Quaternion.LookRotation ((player_.transform.position - (direccionataca_.normalized)) - transform.position);
transform.rotation = Quaternion.Slerp (transform.rotation, rotacion_, Time.deltaTime * velocidadrotacion_);
Vector3 range_ = player_.transform.position - transform.position;
if (range_.magnitude < 5f)
{
acá transcurre el ataque, animación, sonido, daño al player y así...
}
En esencia, necesitas que el npc una vez que detecte al player gire mirándolo, que es lo que hago con los rotation, y luego avance en esa dirección; ahí es donde actuan los position junto con el NavMeshAgent. Espero te sea de ayuda.