- Home /
Question by
chosendeath · Aug 19, 2016 at 09:42 AM ·
navmeshnavmeshagentlocomotionlocomotion system
NavMeshAgent Moves Weirdly Sideways
Hi, I'm currently using a NavMeshAgent and manually moving the transform. However the movement seems to move MUCH faster when moving sideways instead of forward and backward for some reason. I've included my LocomotionAgent class which manages the NavMeshAgent, also a screenshot of my NavMeshAgent component.
Any suggestions? Thanks in advance!
using UnityEngine;
using System.Collections;
/// <summary>
/// LocomotionAgent connects to the nav mesh agent and translates nav mesh behavior to animations and such.
/// </summary>
public class LocomotionAgent : MonoBehaviour
{
#region Components
private NavMeshAgent _navMeshAgent;
private Animator _anim;
#endregion
#region Data
public float TurnRate = 15f;
public float FacingThreshold = 15f;
public bool _isMoving;
#endregion
#region Nav Mesh Wrapped Properties
public Vector3 Destination
{
get { return _navMeshAgent.destination; }
set
{
_navMeshAgent.destination = value;
_navMeshAgent.Stop();
}
}
public float RemainingDistance
{
get { return _navMeshAgent.remainingDistance; }
}
public float StoppingDistance
{
get { return _navMeshAgent.stoppingDistance; }
}
#endregion
#region Init
void Awake()
{
_anim = GetComponent<Animator>();
_navMeshAgent = GetComponent<NavMeshAgent>();
_navMeshAgent.updatePosition = false;
_navMeshAgent.updateRotation = false;
}
#endregion
void Update()
{
bool shouldMove = _navMeshAgent.remainingDistance > _navMeshAgent.stoppingDistance;
bool oldMoving = _isMoving;
// we dont do anything unless we nav mesh wants us to get somewhere
if(shouldMove)
{
// if we are not yet orientated we must turn towards the target
Vector3 targetDirection = _navMeshAgent.nextPosition - transform.position;
targetDirection.y = 0f;
if(targetDirection.sqrMagnitude < 1e-5f)
{
targetDirection = _navMeshAgent.destination - transform.position;
targetDirection.y = 0f;
}
float angleDiff = Vector3.Angle(transform.forward, targetDirection);
Vector3 updatedDirection = Vector3.RotateTowards(transform.forward, targetDirection, Time.deltaTime * TurnRate, 0f);
transform.rotation = Quaternion.LookRotation(updatedDirection);
if(!oldMoving && angleDiff <= FacingThreshold)
{
_isMoving = true;
}
}
else if(oldMoving)
{
_isMoving = false;
}
if(!oldMoving && _isMoving)
{
_navMeshAgent.Resume();
}
else if(!_isMoving && oldMoving)
{
_navMeshAgent.Stop();
}
_anim.SetBool("IsWalking", _isMoving);
if(_isMoving)
{
transform.position = _navMeshAgent.nextPosition;
}
}
public void StopLocomotion()
{
_navMeshAgent.destination = transform.position;
_navMeshAgent.Stop();
_isMoving = false;
}
}
screenshot-2016-08-18-235651.png
(107.8 kB)
Comment
Your answer
Follow this Question
Related Questions
Trouble with Navmesh Agent and Navmesh Obstacle 0 Answers
GameObject with NavMeshAgent resets rotation when game starts 2 Answers
How to have a script temporarily take control of a NavMeshAgent? 1 Answer
Artificial intelligence - Find way through changing path 2 Answers
Root Motion and Navmesh Agent 0 Answers