Ejemplo n.º 1
0
    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);
            }
        }
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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);
            }
        }
    }