- Home /
 
 
               Question by 
               OshakieGittens61 · Dec 27, 2016 at 05:04 AM · 
                navmeshenemy aijittering  
              
 
              Jittery movement of nav meshagent
Hey so I'm making a game which consist of enemy AI in which my player has to avoid. I had obtained this AI script(along with animation package from UNITY itself which works find. However when I try to increase the scale of the enemy of 1 to 2 in all three axis it creates jittery movements. How can solve this problem? 
 https://docs.unity3d.com/Manual/nav-CouplingAnimationAndNavigation.html
 using UnityEngine;
 
 [RequireComponent (typeof (NavMeshAgent))]
 [RequireComponent (typeof (Animator))]
 public class LocomotionSimpleAgent : MonoBehaviour {
     Animator anim;
     NavMeshAgent agent;
     Vector2 smoothDeltaPosition = Vector2.zero;
     Vector2 velocity = Vector2.zero;
 
     void Start () {
         anim = GetComponent<Animator> ();
         agent = GetComponent<NavMeshAgent> ();
         agent.updatePosition = false;
     }
     
     void Update () {
         Vector3 worldDeltaPosition = agent.nextPosition - transform.position;
 
         // Map 'worldDeltaPosition' to local space
         float dx = Vector3.Dot (transform.right, worldDeltaPosition);
         float dy = Vector3.Dot (transform.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;
 
         bool shouldMove = velocity.magnitude > 0.5f && agent.remainingDistance > agent.radius;
 
         // Update animation parameters
         anim.SetBool("move", shouldMove);
         anim.SetFloat ("velx", velocity.x);
         anim.SetFloat ("vely", velocity.y);
 
         LookAt lookAt = GetComponent<LookAt> ();
         if (lookAt)
             lookAt.lookAtTargetPosition = agent.steeringTarget + transform.forward;
 
 //        // Pull character towards agent
 //        if (worldDeltaPosition.magnitude > agent.radius)
 //            transform.position = agent.nextPosition - 0.9f*worldDeltaPosition;
 
 //        // Pull agent towards character
 //        if (worldDeltaPosition.magnitude > agent.radius)
 //            agent.nextPosition = transform.position + 0.9f*worldDeltaPosition;
     }
 
     void OnAnimatorMove () {
         // Update postion to agent position
 //        transform.position = agent.nextPosition;
 
         // Update position based on animation movement using navigation surface height
         Vector3 position = anim.rootPosition;
         position.y = agent.nextPosition.y;
         transform.position = position;
     }
 
    
 }
 
               // LookAt.cs using UnityEngine; using System.Collections;
 [RequireComponent (typeof (Animator))]
 public class LookAt : MonoBehaviour {
     public Transform head = null;
     public Vector3 lookAtTargetPosition;
     public float lookAtCoolTime = 0.2f;
     public float lookAtHeatTime = 0.2f;
     public bool looking = true;
 
     private Vector3 lookAtPosition;
     private Animator anim;
     private float lookAtWeight = 0.0f;
 
     void Start ()
     {
         if (!head)
         {
             Debug.LogError("No head transform - LookAt disabled");
             enabled = false;
             return;
         }
         anim = GetComponent<Animator> ();
         lookAtTargetPosition = head.position + transform.forward;
         lookAtPosition = lookAtTargetPosition;
     }
 
     void OnAnimatorIK ()
     {
         lookAtTargetPosition.y = head.position.y;
         float lookAtTargetWeight = looking ? 1.0f : 0.0f;
 
         Vector3 curDir = lookAtPosition - head.position;
         Vector3 futDir = lookAtTargetPosition - head.position;
 
         curDir = Vector3.RotateTowards(curDir, futDir, 6.28f*Time.deltaTime, float.PositiveInfinity);
         lookAtPosition = head.position + curDir;
 
         float blendTime = lookAtTargetWeight > lookAtWeight ? lookAtHeatTime : lookAtCoolTime;
         lookAtWeight = Mathf.MoveTowards (lookAtWeight, lookAtTargetWeight, Time.deltaTime/blendTime);
         anim.SetLookAtWeight (lookAtWeight, 0.2f, 0.5f, 0.7f, 0.5f);
         anim.SetLookAtPosition (lookAtPosition);
     }
 }
 
              
               Comment
              
 
               
              Your answer