How to use IEnumerator? Pls help!
I want to make my enemy wait for 2 seconds when he hit the wall What i must to type in IEnumerator Waitfroseconds type? Everything i tried make him spin or just stay on the place forever pls help me
using UnityEngine;
using System.Collections;
public class EnemyPatrol : MonoBehaviour {
public float moveSpeed;
public bool moveRight;
public Transform wallCheck;
public float wallCheckRadius;
public LayerMask whatIsWall;
private bool hittingWall;
public Transform edgeCheck;
public float edgeCheckRadius;
private bool notAtEdge;
public float enemyWaitTime;
void Start ()
{
}
void FixedUpdate () {
hittingWall = Physics2D.OverlapCircle (wallCheck.position, wallCheckRadius, whatIsWall);
StartCoroutine (WaitTime());
notAtEdge = Physics2D.OverlapCircle (edgeCheck.position, edgeCheckRadius, whatIsWall);
if(hittingWall || !notAtEdge)
moveRight = !moveRight;
if (moveRight)
{
transform.localScale = new Vector3 (0.75f, 0.75f, 1f);
GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
} else {
transform.localScale = new Vector3 (-0.75f, 0.75f, 1f);
GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
}
}
IEnumerator WaitTime() {
yield return new WaitForSeconds (enemyWaitTime);
}
}
Answer by hexagonius · Mar 06, 2017 at 09:58 PM
the coroutine won't keep FixedUpdate from executing. you're starting it kinda parallel. if you want to wait for code being executed after a wait time, put the code into the coroutine after the wait for seconds. if you want to wait for the coroutine directly, that's only possible if started from another coroutine with yield return StartCoroutine
If truly I dont know how it works But here is the video of my enemy
https://www.youtube.com/watch?v=7wN5XAF4lPI
I want that enemy when he is detecting the edge and flip, he first wait on the place for 2 seconds and then he continue to go to another end of the platform
If i get your idea right I set my code like this for now I replace the FixedUpdate with just Update function and Set the movement on IEnumerator So this what happened https://www.youtube.com/watch?v=2Tc0hc$$anonymous$$Hx18
Here is the code with changes What do i done wrong?
using UnityEngine;
using System.Collections;
public class EnemyPatrol : $$anonymous$$onoBehaviour {
public float moveSpeed;
public bool moveRight;
public Transform wallCheck;
public float wallCheckRadius;
public Layer$$anonymous$$ask whatIsWall;
private bool hittingWall;
public Transform edgeCheck;
public float edgeCheckRadius;
private bool notAtEdge;
public float enemyWaitTime;
void Start ()
{
}
void Update () {
hittingWall = Physics2D.OverlapCircle (wallCheck.position, wallCheckRadius, whatIsWall);
notAtEdge = Physics2D.OverlapCircle (edgeCheck.position, edgeCheckRadius, whatIsWall);
if (hittingWall || !notAtEdge)
moveRight = !moveRight;
if (moveRight)
{
StartCoroutine (WaitTimeRight ());
//transform.localScale = new Vector3 (0.75f, 0.75f, 1f);
//GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
} else {
StartCoroutine (WaitTimeNotRight ());
//transform.localScale = new Vector3 (-0.75f, 0.75f, 1f);
//GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
}
}
IEnumerator WaitTimeRight() {
yield return new WaitForSeconds (enemyWaitTime);
transform.localScale = new Vector3 (0.75f, 0.75f, 1f);
GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
}
IEnumerator WaitTimeNotRight()
{
yield return new WaitForSeconds (enemyWaitTime);
transform.localScale = new Vector3 (-0.75f, 0.75f, 1f);
GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
}
}