In my game the enemies are supposed to follow the player without rotation on the X or Z axis. Would the best way to approach this be with a NavMeshAgent or a script with Vector3.MoveTowards? I have tried before and this is what I have found. With the NavMeshAgent I get no error, but the enemy doesn't follow the player. When I tried using Vector3.MoveTowards, it didn't move the enemy. Here are both of my scripts: Spoiler: NavMeshAgent Script Code (CSharp): using UnityEngine; using System.Collections; public class EnemyCraftAI : MonoBehaviour { public Transform target; public float attackDistance = 20.0f; public float attackDelay = 0.75f; public float effectsDisplayTime = 0.2f; public Transform gunEnd; public float shootRange = 20f; public int attackDamage = 10; float attackTimer; float distance; NavMeshAgent agent; EnemyHealth health; Ray shootRay; RaycastHit shootHit; ParticleSystem gunParticles; LineRenderer gunLine; AudioSource gunAudio; Light gunLight; // Use this for initialization void Start () { agent = GetComponent <NavMeshAgent> (); health = GetComponent <EnemyHealth> (); gunParticles = gunEnd.GetComponent <ParticleSystem> (); gunLine = gunEnd.GetComponent <LineRenderer> (); gunAudio = gunEnd.GetComponent <AudioSource> (); gunLight = gunEnd.GetComponent <Light> (); } // Update is called once per frame void Update () { gunLine.useWorldSpace = true; if (health.currentHealth > 0) { if (Time.timeScale > 0) { if (target.GetComponent <PlayerHealth> ().currentHealth > 0) { distance = Vector3.Distance (transform.position, target.position); if (distance < attackDistance) { agent.Stop (); Attack(); } else { agent.SetDestination (target.position); attackTimer = 0; } } } } else { agent.enabled = false; DisableEffects(); } } void Attack() { attackTimer += Time.deltaTime; if (attackTimer >= attackDelay) Shoot(); if (attackTimer >= effectsDisplayTime) DisableEffects (); } void DisableEffects() { gunParticles.Stop (); gunLine.enabled = false; gunLight.enabled = false; } void Shoot() { attackTimer = 0; gunAudio.Play (); gunLight.enabled = true; gunParticles.Stop (); gunParticles.Play (); gunLine.enabled = true; gunLine.SetPosition (0, gunEnd.position); shootRay.origin = gunEnd.position; shootRay.direction = new Vector3(-gunEnd.forward.x, -gunEnd.forward.y - 0.1f, -gunEnd.forward.z); //-gunEnd.forward if (Physics.Raycast (shootRay, out shootHit, shootRange)) { PlayerHealth playerHealth = shootHit.collider.GetComponent <PlayerHealth> (); if (playerHealth != null) playerHealth.TakeDamage (attackDamage); gunLine.SetPosition (1, shootHit.point); } else { gunLine.SetPosition (1, shootRay.origin + shootRay.direction * shootRange); } } } Spoiler: Vector3.MoveTowards() Script Code (CSharp): using UnityEngine; using System.Collections; public class SecondaryEnemyCraftAI : MonoBehaviour { public Transform target; public float attackDistance = 20.0f; public float attackDelay = 0.75f; public float effectsDisplayTime = 0.2f; public Transform gunEnd; public float shootRange = 20f; public int attackDamage = 10; public float speed = 10; float attackTimer; float step; float distance; EnemyHealth health; Ray shootRay; RaycastHit shootHit; ParticleSystem gunParticles; LineRenderer gunLine; AudioSource gunAudio; Light gunLight; // Use this for initialization void Start () { health = GetComponent <EnemyHealth> (); gunParticles = gunEnd.GetComponent <ParticleSystem> (); gunLine = gunEnd.GetComponent <LineRenderer> (); gunAudio = gunEnd.GetComponent <AudioSource> (); gunLight = gunEnd.GetComponent <Light> (); } // Update is called once per frame void Update () { step = speed * Time.deltaTime; gunLine.useWorldSpace = true; if (health.currentHealth > 0) { if (Time.timeScale > 0) { if (target.GetComponent <PlayerHealth> ().currentHealth > 0) { distance = Vector3.Distance (transform.position, target.position); if (distance < attackDistance) { Attack(); } else { attackTimer = 0; Vector3.MoveTowards (transform.position, target.position, step); } } } } else { DisableEffects(); } } void Attack() { attackTimer += Time.deltaTime; if (attackTimer >= attackDelay) Shoot(); if (attackTimer >= effectsDisplayTime) DisableEffects (); } void DisableEffects() { gunParticles.Stop (); gunLine.enabled = false; gunLight.enabled = false; } void Shoot() { attackTimer = 0; gunAudio.Play (); gunLight.enabled = true; gunParticles.Stop (); gunParticles.Play (); gunLine.enabled = true; gunLine.SetPosition (0, gunEnd.position); shootRay.origin = gunEnd.position; shootRay.direction = new Vector3(-gunEnd.forward.x, -gunEnd.forward.y - 0.1f, -gunEnd.forward.z); //-gunEnd.forward if (Physics.Raycast (shootRay, out shootHit, shootRange)) { PlayerHealth playerHealth = shootHit.collider.GetComponent <PlayerHealth> (); if (playerHealth != null) playerHealth.TakeDamage (attackDamage); gunLine.SetPosition (1, shootHit.point); } else { gunLine.SetPosition (1, shootRay.origin + shootRay.direction * shootRange); } } } Answers for both would be appreciated!