public waterEnemyState setEnemyState(waterEnemyState newState) { switch (newState) { case waterEnemyState.idle: //rb2d.gravityScale = 0f; rb2d.velocity = Vector2.zero; break; case waterEnemyState.patrol: startPosition = rb2d.position; direction = patrolDirection(); rb2d.velocity = direction * patrolSpeed; break; case waterEnemyState.pursue: idleTimer = 10f; break; case waterEnemyState.goHome: break; case waterEnemyState.waterSurface: if (enemyToPuffin.y > 0) { Vector2 noY = new Vector2(rb2d.velocity.x, 0f); rb2d.velocity = noY; } break; } return(newState); }
// Update is called once per frame void Update() { idleTimer = (idleTimer > 0 && (Vector2)transform.position != startPosition)? idleTimer - Time.deltaTime : 0f; enemyToPuffin = (puffin.transform.position - transform.position); flipSprite(); if (enemyToPuffin.sqrMagnitude < pursuitRange * pursuitRange && enemyInWater && GameManager.instance.score > 0) { state = setEnemyState(waterEnemyState.pursue); idleTimer = 10f; //print ("pursue"); //print (enemyToPuffin.sqrMagnitude); } if (idleTimer == 0f && ((Vector2)transform.position - startPosition).sqrMagnitude > 5f) { //state = setEnemyState (waterEnemyState.goHome); } /*if (enemyInWater) * { * state = setEnemyState (airEnemyState.idle); * * }*/ switch (state) { case waterEnemyState.idle: rb2d.velocity = Vector2.zero; if (idleTimer == 0 && ((Vector2)transform.position - startPosition).sqrMagnitude > 5f * 5f) { state = setEnemyState(waterEnemyState.goHome); } break; case waterEnemyState.patrol: rb2d.velocity = direction * patrolSpeed; if (((Vector2)transform.position - startPosition).sqrMagnitude > 10f * 10f && changeDir == false) // If Enemy travels farther than maximum range, calculate new direction { //direction = -direction; direction = patrolDirection(); //print ("Switch"); changeDir = true; //startPosition = rb2d.position; } if (enemyInAir) { state = setEnemyState(waterEnemyState.goHome); //direction.y = 1; } if (((Vector2)transform.position - startPosition).sqrMagnitude < 10f * 10f) { changeDir = false; } break; case waterEnemyState.pursue: // right now it is normalized. Try to think of another way to get direction, this is expensive? direction = enemyToPuffin.normalized; rb2d.velocity = direction * pursuitSpeed; idleTimer = 5f; if (enemyToPuffin.sqrMagnitude > pursuitRange * pursuitRange || GameManager.instance.score == 0) { state = setEnemyState(waterEnemyState.idle); } if (enemyInAir) { state = setEnemyState(waterEnemyState.waterSurface); } break; case waterEnemyState.goHome: direction = (startPosition - (Vector2)transform.position).normalized; rb2d.velocity = direction * pursuitSpeed; if (((Vector2)transform.position - startPosition).sqrMagnitude < 1f) //((Vector2)transform.position - startPosition).sqrMagnitude <5f) //(Vector2)transform.position == startPosition { state = setEnemyState(waterEnemyState.patrol); } break; case waterEnemyState.waterSurface: if (enemyToPuffin.sqrMagnitude < pursuitRange * pursuitRange && enemyToPuffin.y < 0 && GameManager.instance.score > 0) { state = setEnemyState(waterEnemyState.pursue); } else if (idleTimer == 0f) { state = setEnemyState(waterEnemyState.goHome); } break; } }