- Home /
Question by
siember · Apr 30, 2020 at 05:19 PM ·
2dbooleantop down shooter
Coroutine isn't updating a variable
I'm trying to create a Boss that moves to a target area, attacks the player for a couple of seconds and then stop attacking and move to another target and do it again.
I used coroutines to do this and used a bool to stop the movement but for some reason the coroutine "StopAttack" isn't updating it.
This is the code that controls the Boss
public bool bossTrigger = false;
public bool target1Reached = false;
public bool target2Reached = false;
public bool target3Reached = false;
public bool target4Reached = false;
private bool isMoving = true;
public float moveSpeed;
public float rotationSpeed;
public float attackTime;
public GameObject target1;
public GameObject target2;
public GameObject target3;
public GameObject target4;
public Transform player;
public Rigidbody2D rb;
void Update()
{
if (bossTrigger && isMoving)
{
Movement();
Debug.Log("Boss is in movement phase");
}
else
{
Debug.Log("Boss is not in movement phase");
}
Debug.Log($"{isMoving}");
}
void Movement()
{
if (!target2Reached && !target1Reached && !target3Reached && !target4Reached)
{
rb.MovePosition(Vector3.MoveTowards(transform.position, target1.transform.position, moveSpeed *
Time.deltaTime));
}
else if (target1Reached)
{
StartCoroutine("Attack");
rb.MovePosition(Vector3.MoveTowards(transform.position, target2.transform.position, moveSpeed *
Time.deltaTime));
}
else if (target2Reached)
{
StartCoroutine("Attack");
rb.MovePosition(Vector3.MoveTowards(transform.position, target3.transform.position, moveSpeed *
Time.deltaTime));
}
else if (target3Reached)
{
StartCoroutine("Attack");
rb.MovePosition(Vector3.MoveTowards(transform.position, target4.transform.position, moveSpeed *
Time.deltaTime));
}
else if (target4Reached)
{
StartCoroutine("Attack");
rb.MovePosition(Vector3.MoveTowards(transform.position, target1.transform.position, moveSpeed *
Time.deltaTime));
}
}
IEnumerator Attack()
{
yield return new WaitForEndOfFrame();
isMoving = false;
transform.LookAt(player, Vector3.forward);
print("Boss is now in Attack State");
StartCoroutine(StopAttack());
StartCoroutine(Attack());
}
IEnumerator StopAttack()
{
yield return new WaitForSeconds(attackTime);
StopCoroutine(Attack());
isMoving = true;
print("Attack Coroutine has stopped");
// StopCoroutine(StopAttack());
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("BossTarget1"))
{
target1Reached = true;
target2Reached = false;
target3Reached = false;
target4Reached = false;
}
else if (other.CompareTag("BossTarget2"))
{
target2Reached = true;
target1Reached = false;
target3Reached = false;
target4Reached = false;
}
else if (other.CompareTag("BossTarget3"))
{
target3Reached = true;
target1Reached = false;
target2Reached = false;
target4Reached = false;
}
else if (other.CompareTag("BossTarget4"))
{
target4Reached = true;
target1Reached = false;
target2Reached = false;
target3Reached = false;
}
}
Comment
Your answer
Follow this Question
Related Questions
How to move player using UI buttons, when using Input.mousePosition to shooting? (Android) 0 Answers
How to create AI movement for avoiding procedurally generated objects? 1 Answer
Cant change transform.position of gameobject 1 Answer
Unity2D Space shooter rotation resetting when analogue stick input has ended 1 Answer