void Update() { RadialPosition radialPosition = RotationUtils.XYToRadialPos(this.transform.position); float step = MovementSpeed * Time.deltaTime; float angularStep = this.angularSpeed * Time.deltaTime; float circlingStep = this.circlingSpeed * Time.deltaTime; if (Vector3.Distance(Vector3.zero, transform.position) > Range) { radialPosition.AddRadius((-1) * step); radialPosition.AddAngle(angularStep); MoveTo(radialPosition); if (RotationUtils.InCounterClockwiseLimits(radialPosition.GetAngle(), zigZagAngleHigh, zigZagAngleLow) && zigZag) { angularSpeed = -1 * angularSpeed; } } else // If in range, do appropriate attack. { radialPosition.AddAngle(circlingStep); MoveTo(radialPosition); if (RotationUtils.InCounterClockwiseLimits(radialPosition.GetAngle(), zigZagAngleHigh, zigZagAngleLow) && zigZag) { circlingSpeed = -1 * circlingSpeed; } MoveTo(radialPosition); if (selfDestruct) { doDamageToBoss(); KillSelf(); } // Mele attack else if (Range <= Parameters.MAX_MELE_RANGE && !IsInvoking("doDamageToBoss")) { InvokeRepeating("doDamageToBoss", 0, this.attackFrequency); } // Ranged attack else if (Range > Parameters.MAX_MELE_RANGE && !IsInvoking("spawnProjectile")) { InvokeRepeating("spawnProjectile", 0, this.attackFrequency); } } }
/// <summary> /// Spawns a projectile. Projectiles are fast, invunerable and self destructs on impact with the hero. /// </summary> void spawnProjectile() { this.colorModifier.FadeToDelected(this.attackFrequency / 3f); RadialPosition thisRadialPos = RotationUtils.XYToRadialPos(transform.position); this.projectile.SetRadialSpawnPosition(thisRadialPos.GetAngle(), thisRadialPos.GetRadius()); this.enemySpawner.InstantiateEnemyPrefab(this.projectile); }
public bool isInAttackArea(float lowAngle, float highAngle, float nearRadius, float farRadius) { float spriteRadius = transform.Find("Sprite").GetComponent <SpriteRenderer>().bounds.size.x / 2; float distanceToBossActual = Mathf.Max(Vector3.Distance(Vector3.zero, transform.position), 0); float distanceToBossFar = distanceToBossActual + spriteRadius; float distanceToBossNear = distanceToBossActual - spriteRadius; RadialPosition radialPosition = RotationUtils.XYToRadialPos(this.transform.position); float enemyWidthAngle = Mathf.Rad2Deg * Mathf.Acos(1 - Mathf.Pow(spriteRadius / Mathf.Sqrt(2 * distanceToBossActual), 2)); float enemyHighAngle = radialPosition.GetAngle() + enemyWidthAngle; float enemyLowAngle = radialPosition.GetAngle() - enemyWidthAngle; bool inHighAngle = RotationUtils.InCounterClockwiseLimits(enemyHighAngle, lowAngle, highAngle); bool inLowAngle = RotationUtils.InCounterClockwiseLimits(enemyLowAngle, lowAngle, highAngle); bool bossLargerThanRadius = RotationUtils.InCounterClockwiseLimits(lowAngle, enemyLowAngle, enemyHighAngle) && RotationUtils.InCounterClockwiseLimits(highAngle, enemyLowAngle, enemyHighAngle); bool inRadius = distanceToBossNear <= farRadius && distanceToBossFar >= nearRadius; return((inLowAngle || inHighAngle || bossLargerThanRadius) && inRadius); }
public static Vector3 RadialPosToXY(RadialPosition radialPosition) { float angle = radialPosition.GetAngle(); angle = MakePositiveAngle(angle); float radius = radialPosition.GetRadius(); float x = Mathf.Cos(Mathf.Deg2Rad * angle) * radius; float y = Mathf.Sin(Mathf.Deg2Rad * angle) * radius; if (Mathf.Abs(x) < 0.001) { x = 0; } if (Mathf.Abs(y) < 0.001) { y = 0; } return(new Vector3(x, y)); }