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); } } }
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 void UpdateRotation(float newRot) { transform.parent.eulerAngles = new Vector3(0, 0, newRot); //Update rotation previous to checking limits //Find biggest of low limits and smallest of high limis to create the smallest allowed intervall float tmpLowLimit = RotationUtils.InCounterClockwiseLimits(lowFrameTwistLimit, lowHardTwistLimit, highHardTwistLimit) ? lowFrameTwistLimit : lowHardTwistLimit; float tmpHighLimit = RotationUtils.InCounterClockwiseLimits(highFrameTwistLimit, lowHardTwistLimit, highHardTwistLimit) ? highFrameTwistLimit : highHardTwistLimit; float rotation = transform.parent.localEulerAngles.z; if (RotationUtils.InCounterClockwiseLimits(rotation, tmpLowLimit, tmpHighLimit)) { //Angle in limit outHigh = false; outLow = false; } else { if (outHigh) //Rotation is still outside limits to one side { transform.parent.localEulerAngles = new Vector3(0, 0, tmpHighLimit); } else if (outLow) //Rotation is still outside limits to the other side { transform.parent.localEulerAngles = new Vector3(0, 0, tmpLowLimit); } // Check to which side rotation has exited the limits intervall. // If it is not yet in one of the halves of the outside of the twist limits, wait until it is. else if (RotationUtils.InCounterClockwiseLimits(rotation, RotationUtils.MiddleOfRotations(tmpHighLimit, tmpLowLimit), tmpLowLimit)) { outLow = true; transform.parent.localEulerAngles = new Vector3(0, 0, tmpLowLimit); } else if (RotationUtils.InCounterClockwiseLimits(rotation, tmpLowLimit, RotationUtils.MiddleOfRotations(tmpHighLimit, tmpLowLimit))) { outHigh = true; transform.parent.localEulerAngles = new Vector3(0, 0, tmpHighLimit); } } }