Question by
sk8terboy4 · Feb 23, 2017 at 02:04 AM ·
animatornavmeshnavmeshagent
NavMeshAgent nextPosition is not updating
I set the destination when the player clicks on the environment. NavMesh is baked. Here is the actual movement of agent.
using UnityEngine;
using UnityEngine.AI;
using System.Collections;
public class AnimateMovement : MonoBehaviour {
public Animator anim;
public Transform player;
public NavMeshAgent agent;
Vector2 smoothDeltaPosition = Vector2.zero;
Vector2 velocity = Vector2.zero;
public bool isMoving = true;
void Start()
{
//agent = GetComponent<NavMeshAgent>();
agent.updatePosition = false;
}
void Update()
{
Debug.Log(agent.nextPosition + " " + player.position);
Vector3 worldDeltaPosition = agent.nextPosition - player.position;
// Map 'worldDeltaPosition' to local space
float dx = Vector3.Dot(player.right, worldDeltaPosition);
float dy = Vector3.Dot(player.forward, worldDeltaPosition);
Vector2 deltaPosition = new Vector2(dx, dy);
// Low-pass filter the deltaMove
float smooth = Mathf.Min(1.0f, Time.deltaTime / 0.15f);
smoothDeltaPosition = Vector2.Lerp(smoothDeltaPosition, deltaPosition, smooth);
// Update velocity if delta time is safe
if (Time.deltaTime > 1e-5f)
velocity = smoothDeltaPosition / Time.deltaTime;
Debug.DrawLine(deltaPosition, smoothDeltaPosition, Color.blue);
isMoving = velocity.magnitude > 0.5f && agent.remainingDistance > agent.radius;
// Update animation parameters
anim.SetBool("Move", isMoving);
anim.SetFloat("velx", velocity.x);
anim.SetFloat("vely", velocity.y);
//Debug.Log(worldDeltaPosition);
}
void OnAnimatorMove()
{
// You'd have to set this value yourself, lots of ways to do that with the animator.
if (isMoving)
{
agent.velocity = anim.deltaPosition / Time.deltaTime;
agent.speed = anim.deltaPosition.magnitude / Time.deltaTime;
}
else
{
agent.velocity = Vector3.zero;
agent.speed = 0.00001f; // Setting it to 0 can cause agent to do weird stuff
}
// Update postion to agent position
//Debug.Log("Moving");
player.position = agent.nextPosition;
}
}
The boolean agent.nextPosition stays the same whenever I set the destination like here:
RaycastHit hit;
if (Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity))
{
if (hit.collider.gameObject.layer == groundLayer)
{
if (Input.GetMouseButtonUp(0))
{
currentNode.CurrentNode = false;
currentNode = nm.getNearestNode(hit.transform.position);
currentNode.CurrentNode = true;
//agent.nextPosition = currentNode.Position;
agent.SetDestination(currentNode.Position);
Debug.Log(agent.destination);
}
}
}
Here is the image. The red line shows the path is set, but the player is not moving.
error.png
(203.2 kB)
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612111739im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Having problems with making a Navmesh Agent stop and play an attack animation 0 Answers
Animator scripting not working as expected, 0 Answers
Nav Mesh Agent destination not lining up with actual target. 1 Answer
Is there a way to make a follow script without NavMesh? 1 Answer
SetDestination doesn't work after building (with images) answer please 0 Answers