Esempio 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);
            }
        }
    }
Esempio n. 2
0
    /// <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);
    }
Esempio n. 3
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);
    }
Esempio n. 4
0
    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));
    }