- Home /
smooth movement through waypoints
Hi I have been trying to create a horse racing AI. The horses move between waypoints along a path. The issue is that when the horses are seen through a moving camera, the tend to stop at each waypoint for an instant because the speed is reset at each update and the horses are thus left behind a little each time in comparison to camera view.I am using Vector3.MoveTowards function to move the horse between waypoints.
Could anyone help please.
heres the dropbox link to the demo. u can see the problem for yourself.
https://www.dropbox.com/s/gmm4d9na163vofy/demo%20horse_Data.zip?dl=0
Answer by Socapex · Jun 21, 2015 at 12:37 PM
I am not sure I understand, but I guess you could detect when your close to the waypoint, and set the next one before you've actually arrived? maybe? :)
heres the code
using UnityEngine; using System.Collections;
public class PathFollowing : $$anonymous$$onoBehaviour {
public Transform lane;
public Transform[] path;
//public Transform end;
public float speed=2.0f;
public float reachDist=1.0f;
public int currentPoint=0;
private bool stop=false;
private Animator anim;
private float time=0.0f;
private float distance;
private float distanceTravelled;
private Vector3 lastPosition;
//private Rigidbody horse;
// Use this for initialization
void Start () {
transform.position = lane.position;
anim=GetComponent<Animator>();
}
// Update is called once per frame
void Update (){
//distanceTravelled += Vector3.Distance (transform.position, lastPosition);
//lastPosition = transform.position;
//Debug.Log(distanceTravelled);
// if (!stop) {
time+=Time.deltaTime;
Debug.Log(time);
Run ();
} else {
Stop();
}
//Vector3 dir = path [currentPoint].position - transform.position;
}
void Run (){
float rotSpeed = 20.0f;
anim.SetBool ("runAnim",true);
float dist = Vector3.Distance (path [currentPoint].position, transform.position);
//horse.velocity=transform.forward*150.0f;
transform.position = Vector3.$$anonymous$$oveTowards(transform.position,path[currentPoint].position, Time.deltaTime * speed);
//Quaternion targetRot = Quaternion.LookRotation (path [currentPoint].position - transform.position);
transform.rotation= Quaternion.Slerp (transform.rotation, path[currentPoint].localRotation,rotSpeed*Time.deltaTime);
if (dist<=reachDist) {
currentPoint++;
}
if (currentPoint >= path.Length) {
currentPoint=0;
stop = true;
//Stop();
}
}
void Stop(){
anim.SetBool ("runAnim", false);
}
void OnDrawGizmos(){
Gizmos.color = Color.red;
if (path.Length > 0) {
for (int i=0; i<path.Length; i++) {
if (path [i] != null) {
Gizmos.DrawWireSphere(path [i].position, reachDist);
if(i>0){
Gizmos.DrawLine(path[i-1].position,path[i].position);
distance+= Vector3.Distance(path[i-1].position,path[i].position);
}
}
}
}
}
}
heres the link to the demo showing the problem
https://www.dropbox.com/s/gmm4d9na163vofy/demo%20horse_Data.zip?dl=0
Your answer
Follow this Question
Related Questions
Smooth Camera/Object Movement 1 Answer
[Solved]NetWork not smooth 1 Answer
How do I make Rigidbody2D movement smoother? 0 Answers
How to incorporate Time.deltaTime into existing script 1 Answer