void OnCollisionEnter2D(Collision2D coll) { if (coll.gameObject.tag == "Projectile") { Destroy(coll.gameObject); health -= 1; if (health < stage3Health && _AIStage == AIStage.Stage2) { _AIStage = AIStage.Stage3; fireRate = stage3FireRate; _AIPos = AIPos.TL; _stage3Target = _stage3TL; } else if (health < stage2Health && _AIStage == AIStage.Stage1) { _AIStage = AIStage.Stage2; _delay = 1.0f; } } }
void AIAttackPattern() { if (_AIStage == AIStage.Stage1) { _delay += stage1FireRate; Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { if (!(x == 0 && y == 0)) { Instantiate(projectile, projectilePosition, Quaternion.identity).GetComponent <PlaceHolderProjectileScript>().setVelocity(x, y); } } } } else if (_AIStage == AIStage.Stage2) { _delay += stage2FireRate; Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); float angle = 5.0f * _stage2ProjectileCount; if (_stage2ProjectileCount % 2 == 0) { for (int n = 0; n < 8; n++) { float altAngle = n * 45.0f; float nSpeed = projectile2Speed * Mathf.Cos(Mathf.Deg2Rad * altAngle); float mSpeed = projectile2Speed * Mathf.Sin(Mathf.Deg2Rad * altAngle); Instantiate(projectile, projectilePosition, Quaternion.identity).GetComponent <PlaceHolderProjectileScript>().setVelocity(nSpeed, mSpeed); } } else { for (int n = 0; n < 8; n++) { float altAngle = 22.5f + n * 45.0f; float nSpeed = projectile2Speed * Mathf.Cos(Mathf.Deg2Rad * altAngle); float mSpeed = projectile2Speed * Mathf.Sin(Mathf.Deg2Rad * altAngle); Instantiate(projectile, projectilePosition, Quaternion.identity).GetComponent <PlaceHolderProjectileScript>().setVelocity(nSpeed, mSpeed); } } for (int x = -3; x <= 3; x++) { if (!(x == 0)) { float projAngle = x < 0 ? angle : -angle; float xSpeed = (x * projectile2Speed) * Mathf.Cos(Mathf.Deg2Rad * angle); float ySpeed = x > 0 ? -(x * projectile2Speed) * Mathf.Sin(Mathf.Deg2Rad * angle) : (x * projectile2Speed) * Mathf.Sin(Mathf.Deg2Rad * angle); if (x < 0) { Instantiate(projectile2, projectilePosition, Quaternion.identity).GetComponent <FirstBossProjectile2>().setup(xSpeed, ySpeed, projAngle, projectile2Speed, false); } else { Instantiate(projectile2, projectilePosition, Quaternion.identity).GetComponent <FirstBossProjectile2>().setup(xSpeed, ySpeed, projAngle, projectile2Speed, true); } } } _stage2ProjectileCount++; if (_stage2ProjectileCount >= _stage2ProjectileCountMax) { _stage2ProjectileCount = 0; } } else if (_AIStage == AIStage.Stage3) { if (_AIPos != AIPos.TIRED) { _delay += stage3FireRate; for (int i = 0; i < 4; i++) { float angle = i * 90.0f; float xSpeed = projectile3Speed * Mathf.Cos(Mathf.Deg2Rad * angle); float ySpeed = projectile3Speed * Mathf.Sin(Mathf.Deg2Rad * angle); Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); Instantiate(projectile, projectilePosition, Quaternion.identity).GetComponent <PlaceHolderProjectileScript>().setVelocity(xSpeed, ySpeed); } if (stage3BuildUp >= stage3CoolDown) { _AIPos = AIPos.TIRED; _stage3Target = _originalPosition; } else { stage3BuildUp += Time.deltaTime; } } } }
void AIPattern() { if (_AIStage == AIStage.Stage1) { if (!stage1Music.isPlaying) { stage2Music.Stop(); stage3Music.Stop(); stage1Music.loop = true; stage1Music.Play(); } _counter += Time.deltaTime * stage1Speed; float x = Mathf.Cos(_counter) * stage1Width; float y = Mathf.Sin(_counter) * stage1Height; transform.position = new Vector3(x + stage1XOffset, y + stage1YOffset, 0); } else if (_AIStage == AIStage.Stage2) { if (!stage2Music.isPlaying) { stage1Music.Stop(); stage3Music.Stop(); stage2Music.loop = true; stage2Music.Play(); } if (transform.position != _originalPosition) { transform.position = Vector3.MoveTowards(transform.position, _originalPosition, speed * Time.deltaTime); } } else if (_AIStage == AIStage.Stage3) { if (!stage3Music.isPlaying) { stage1Music.Stop(); stage2Music.Stop(); stage3Music.loop = true; stage3Music.Play(); } if (transform.position != _stage3Target) { transform.position = Vector3.MoveTowards(transform.position, _stage3Target, speed * Time.deltaTime); } else { switch (_AIPos) { case AIPos.TL: _AIPos = AIPos.BL; _stage3Target = _stage3BL; for (int i = 0; i < 6; i++) { float angle = i * -15.0f; float xSpeed = projectile3Speed * Mathf.Cos(Mathf.Deg2Rad * angle); float ySpeed = projectile3Speed * Mathf.Sin(Mathf.Deg2Rad * angle); Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); Instantiate(projectile3, projectilePosition, Quaternion.identity).GetComponent <FirstBossProjectile3>().setup(xSpeed, ySpeed, angle, projectile3Speed, false); } break; case AIPos.BL: _AIPos = AIPos.BR; _stage3Target = _stage3BR; for (int i = 0; i < 6; i++) { float angle = i * 15.0f; float xSpeed = projectile3Speed * Mathf.Cos(Mathf.Deg2Rad * angle); float ySpeed = projectile3Speed * Mathf.Sin(Mathf.Deg2Rad * angle); Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); Instantiate(projectile3, projectilePosition, Quaternion.identity).GetComponent <FirstBossProjectile3>().setup(xSpeed, ySpeed, angle, projectile3Speed, false); } break; case AIPos.BR: _AIPos = AIPos.TR; _stage3Target = _stage3TR; for (int i = 0; i < 6; i++) { float angle = i * 15.0f + 90.0f; float xSpeed = projectile3Speed * Mathf.Cos(Mathf.Deg2Rad * angle); float ySpeed = projectile3Speed * Mathf.Sin(Mathf.Deg2Rad * angle); Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); Instantiate(projectile3, projectilePosition, Quaternion.identity).GetComponent <FirstBossProjectile3>().setup(xSpeed, ySpeed, angle, projectile3Speed, false); } break; case AIPos.TR: _AIPos = AIPos.TL; _stage3Target = _stage3TL; for (int i = 0; i < 6; i++) { float angle = i * -15.0f + 270.0f; float xSpeed = projectile3Speed * Mathf.Cos(Mathf.Deg2Rad * angle); float ySpeed = projectile3Speed * Mathf.Sin(Mathf.Deg2Rad * angle); Vector3 projectilePosition = new Vector3(transform.position.x, transform.position.y, -1f); Instantiate(projectile3, projectilePosition, Quaternion.identity).GetComponent <FirstBossProjectile3>().setup(xSpeed, ySpeed, angle, projectile3Speed, false); } break; case AIPos.TIRED: if (stage3BuildUp < 0) { _AIPos = AIPos.TL; _stage3Target = _stage3TL; } else { stage3BuildUp -= Time.deltaTime; } break; } } } }