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
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