- 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