- Home /
NavMesh agent won't rotate around Y axis
Hi everyone!
My AI for an ArcherNPC makes it lookAt the other NPC (his enemy), and shoot once he has lineOfSight.
The problem is when Archer and Target are on different heights: it never shoots uphill or downhill (even on steep slopes). It is clear that the Archer tries to LookAt, but he glitches back, aiming to the infinity (parallel to the Y axis).
The Coroutine I use for my archers is this:
IEnumerator UseRangedWeapon()
{
if (target)
{
if (targetDistance > maxWeaponRange)
{
agent.SetDestination (target.transform.position);
agent.stoppingDistance = Random.Range (minWeaponRange, maxWeaponRange);
animator.SetBool ("RangedAttacking", false);
animator.SetBool ("Running", true);
}
if (minWeaponRange <= targetDistance
&& targetDistance < maxWeaponRange)
{
isAttacking = true;
// agent.Stop ();
agent.ResetPath ();
GetComponent<Animator>().SetBool ("Running", false);
GetComponent<Animator>().SetBool ("RangedAttacking", true);
transform.LookAt (target.transform);
// added because shooting animation imported was turned 90o left
transform.Rotate (0, 90, 0, Space.Self);
// If has LineOfSight on target
if (!Physics.Linecast (transform.position, target.transform.position, 1 << 0)
&& !Physics.Linecast (transform.position, target.transform.position, 1 << teamLayer))
{
Transform arrowTransform = GetComponentInChildren<RangedWeapon> ().weaponTransform;
GameObject newProjectile = Instantiate (projectile, arrowTransform.position - transform.right, transform.rotation * Quaternion.Euler (0, 270, 0)) as GameObject;
// changed the force Vector3 to transform.RIGHT because the animation imported was turned 90o left
newProjectile.GetComponent<Rigidbody> ().AddForce (-transform.right * power, ForceMode.VelocityChange);
}
}
if (targetDistance < minWeaponRange)
{
// float direction = Random.Range (45, 135);
// transform.rotation = transform.rotation * Quaternion.Euler (0, 90, 0);
transform.rotation = Quaternion.LookRotation (transform.position - target.transform.position);
Vector3 stepAway = transform.forward * minWeaponRange;
GetComponent<npcAI> ().npcAnimator.SetBool ("Running", true);
agent.stoppingDistance = 2;
agent.SetDestination (stepAway);
}
}
float reloadTime = Random.Range (minReloadTime, maxReloadTime);
yield return new WaitForSeconds (reloadTime);
isAttacking = false;
GetComponent<Animator>().SetBool ("RangedAttacking", false);
StartCoroutine (UseRangedWeapon ());
}
I've already figured out the NavMeshAgent is the one bugging it all, because whenever I delete the agent.Stop() and agent.Resetpath() lines, it works; but the don't stop moving once Target is within range.
Tried to use update.Position = false, in order to stop moving, but when they needed to run away or get closer to the Target, they simply teleported to the destination (because the agent was still working on a path, but wasn't moving it).
Actually, what would relly solve my problem would be a way to make the NavMeshAgent to rotate the NPCs around the Y axis while going uphill or downhill.
Any solutions? Anyone?
Your answer
![](https://koobas.hobune.stream/wayback/20220612092154im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Simulating Mouse Input for AI 0 Answers
How to rotate an object depending on the rotation of an other Object 3 Answers
Rotating enemy object to face the player when moving 2 Answers
NavMesh Agent Obstacle Avoidance Ignore 1 Answer
Zombie AI Help 2 Answers