Question by
BlankenshipM · Jun 17, 2017 at 06:14 PM ·
2dtranslateienumeratormovetowards
Super Basic 2D AI - NPC not completing MoveTowards
This is my code:
public class Minion : MonoBehaviour {
public float speed = 4f;
private float distance;
private int decide;
private int direction;
private float waittime;
private float targetposition;
// Use this for initialization
void Start () {
float step = speed * Time.deltaTime;
distance = (float) Random.Range (1,6);
decide = Random.Range (0,2);
print ("decide "+decide);
print ("distance " + distance);
StartCoroutine (Move (decide, direction));
}
// Update is called once per frame
void Update () {
}
IEnumerator Move (float decision, float dir){
//waittime = Random.Range (10, 12);
if (decide == 0) {
direction = Random.Range (0, 2);
if (direction == 0) {
transform.position = Vector2.MoveTowards (transform.position, new Vector2 (transform.position.x + distance, transform.position.y), speed * Time.deltaTime);
} else {
transform.position = Vector2.MoveTowards (transform.position, new Vector2 (transform.position.x - distance, transform.position.y), speed * Time.deltaTime);
}
} else {
yield return new WaitForSeconds (10);
}
}
Currently, I only start the Move coroutine in Start() for testing purposes. I expected my game object to move to the target position, but instead only moves like 0.01 or -0.01 in it's x position then stops. How do I fix my code such that the NPC goes all the way to the target position? When placed in Update(), the NPC begins to jitter left and right, but again, only by increments of 0.01.
Comment
Answer by BlankenshipM · Jun 20, 2017 at 01:57 AM
solved it haha thanks guys
public float speed = 4f;
private float distance;
private int decide;
private int direction;
private float waittime;
private bool moving = false;
private bool waiting = false;
private float targetposition;
Rigidbody2D rigidboy;
// Use this for initialization
void Start () {
distance = (float) Random.Range (1,3);
rigidboy = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void Update () {
print ("DECIDED " + decide);
if (!moving && !waiting) {
decide = Random.Range (0, 2);
}
if (decide == 0) {
if (!moving) {
print ("LETSGETMOVING!");
targetposition = transform.position.x + distance;
direction = Random.Range (0, 2);
moving = true;
//StartCoroutine (Move (decide, direction));
} else {
/*Mathf.Abs (targetposition - transform.position.x) >= 0.1*/
if (direction == 0) {
print ("MOVING RIGHT!");
if (Mathf.Abs (Vector2.Distance (transform.position, new Vector2 (targetposition, transform.position.y))) >= 0.01f) {
print("NOT THERE YET RIGHT!");
transform.position = Vector2.MoveTowards (transform.position, new Vector2 (targetposition, transform.position.y), speed * Time.deltaTime);
} else {
moving = false;
print ("GOT THERE RIGHT!");
}
} else {
print ("MOVING LEFT!");
if (Mathf.Abs (Vector2.Distance (transform.position, new Vector2 (-targetposition, transform.position.y))) >= 0.01f) {
print ("NOT THERE YET RIGHT!");
transform.position = Vector2.MoveTowards (transform.position, new Vector2 (-targetposition, transform.position.y), speed * Time.deltaTime);
} else {
moving = false;
print ("GOT THERE LEFT!");
}
}
}
} else {
if (!waiting) {
waiting = true;
print ("WAITING!");
StartCoroutine (Wait ());
}
}
}
IEnumerator Wait(){
yield return new WaitForSeconds (2);
waiting = false;
}