Ejemplo n.º 1
0
    // "LaunchProjectile()" is called by animation Event in 'Enemy 5 Fire Animation'
    public IEnumerator LaunchProjectile()
    {
        // check if the object is already active - this is because this function is called by animation event !
        if (gameObject.activeInHierarchy == false)
        {
            yield break;         // FIX CS return null;
        }
        canFire = false;         // the object is no more allowed to fire (this is a unique shot)

        bulletClone = weaponPool.Spawn();
        bulletClone.transform.position = new Vector3(myTr.position.x + 0.06f * myTr.right.x, myTr.position.y + 0.16f * myTr.up.y, myTr.position.z);

        enemyWeaponScript           = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;
        enemyWeaponScript.direction = new Vector2(myTr.right.x, myTr.up.y);

        audio.clip = bulletSound;
        audio.Play();

        yield return(null);

        myAnimator.SetBool("Firing_Bool", false);

        yield return(new WaitForSeconds(1.3f));

        firing           = false;
        myRb.isKinematic = false;
    }
Ejemplo n.º 2
0
    public override void Attack(EnemyScript ship, GameObject target)
    {
        float   timeTakenToTravel  = Vector3.Distance(target.transform.position, ship.shipTransform.position) / ship.GetComponent <EnemyWeaponScript>().GetBulletSpeed();
        Vector3 predictedTargetPos = target.transform.position + (target.rigidbody.velocity * timeTakenToTravel);

        ship.RotateTowards(predictedTargetPos);

        EnemyWeaponScript weaponScript = ship.GetComponent <EnemyWeaponScript>();

        float weaponRange = ship.GetMinimumWeaponRange();

        float shipDimension = 0;
        Ship  targetShip    = target.GetComponent <Ship>();

        if (targetShip != null)
        {
            shipDimension = targetShip.GetCalculatedSizeByPosition(targetShip.shipTransform.position);
        }

        float totalRange = weaponRange <= shipDimension ? weaponRange + shipDimension : weaponRange;

        Vector3 direction = Vector3.Normalize(target.rigidbody.position - ship.shipTransform.position);

        Ray ray = new Ray(ship.shipTransform.position, direction);
        //Debug.DrawLine(ship.shipTransform.position, ship.shipTransform.position + direction * weaponRange);

        RaycastHit hit;

        if (weaponScript != null && target.collider.Raycast(ray, out hit, totalRange))
        {
            ship.rigidbody.AddForce(-ship.shipTransform.right * ship.GetCurrentMomentum() * Time.deltaTime);
            weaponScript.MobRequestsFire();
        }
    }
Ejemplo n.º 3
0
    // Update is called once per frame
    void FixedUpdate()
    {
        bool shoot = true; //automatic

        if (shoot)
        {
            EnemyWeaponScript weapon = GetComponent <EnemyWeaponScript>();
            if (weapon != null)
            {
                weapon.Attack(false);
            }
        }

        movePlayerVector = 1;

        //Flipping the sprite
        if (enemyRigidBody2D.position.x <= -13 && !facingRight)
        {
            Flip();
            // enemyRigidBody2D.position = new Vector2(-12,0);
            movePlayerVector = 1;
        }
        else if (enemyRigidBody2D.position.x >= 13 && facingRight)
        {
            Flip();
            movePlayerVector = -1;
        }
        enemyRigidBody2D.velocity = new Vector2(movePlayerVector * speed, enemyRigidBody2D.velocity.y);
    }
Ejemplo n.º 4
0
    //[SerializeField]
    //bool clockwise;

    public override void Attack(EnemyScript ship, GameObject target)
    {
        float weaponRange = ship.GetMinimumWeaponRange();

        float shipDimension = 0;
        Ship  targetShip    = target.GetComponent <Ship>();

        if (targetShip != null)
        {
            shipDimension = targetShip.GetCalculatedSizeByPosition(targetShip.shipTransform.position);
        }

        Vector2 positionBehindTarget = (-target.transform.up * ((weaponRange / 2) + shipDimension)) + target.transform.position;

        float sqrDirectionToBehindTarget = Vector2.SqrMagnitude(positionBehindTarget - (Vector2)ship.shipTransform.position);
        float sqrDirectionToTarget       = Vector2.SqrMagnitude(target.transform.position - ship.shipTransform.position);

        if (sqrDirectionToBehindTarget > sqrDirectionToTarget)
        {
            Vector2 moveTowardsBack = GetPositionForAvoidance(ship, target, positionBehindTarget, weaponRange, 0);

            ship.RotateTowards(moveTowardsBack);
            ship.rigidbody.AddForce(ship.shipTransform.up * ship.GetCurrentMomentum() * Time.deltaTime);
        }
        else
        {
            ship.RotateTowards(target.transform.position);

            if (sqrDirectionToBehindTarget > 9) //9 is sqr(3)
            {
                Vector2 directionToPositionBehind = (positionBehindTarget - (Vector2)ship.shipTransform.position).normalized;
                ship.rigidbody.AddForce(directionToPositionBehind * ship.GetCurrentMomentum() * Time.deltaTime);
            }
            else
            {
                ship.rigidbody.AddForce(new Vector2(Random.Range(-1, 1), Random.Range(-1, 1)) * ship.GetCurrentMomentum() * Time.deltaTime);
            }

            EnemyWeaponScript weaponScript = ship.GetComponent <EnemyWeaponScript>();
            weaponScript.MobRequestsFire();
        }
    }
Ejemplo n.º 5
0
    public void LaunchProjectile()
    {
        //REGULAR METHOD : INSTANTIATE bullet (unoptimised)
        //bulletClone = Instantiate(bullet, bulletPos, Quaternion.identity);

        // Pooling Method : grab a bullet from "ObjectPooler"'s gameObjects list

        // Prepare the bullet position
        bulletPos = myTr.TransformPoint(-0.1f, 0.0f, 0.0f);
        // Prepare the bullet direction
        bulletDir   = new Vector3(-1.0f, 0.0f, 0.0f);
        bulletClone = weaponPool.Spawn();         // Spawn from pool
        bulletClone.transform.position = bulletPos;
        enemyWeaponScript           = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;
        enemyWeaponScript.direction = (Vector2)bulletDir;

        // Prepare the bullet position
        bulletPos = myTr.TransformPoint(-0.1f, 0.0f, 0.0f);
        // Prepare the bullet direction
        bulletDir   = new Vector3(-1.0f, 0.3f, 0.0f);
        bulletClone = weaponPool.Spawn();
        bulletClone.transform.position = bulletPos;
        enemyWeaponScript           = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;
        enemyWeaponScript.direction = (Vector2)bulletDir;

        // Prepare the bullet position
        bulletPos = myTr.TransformPoint(-0.1f, 0.0f, 0.0f);
        // Prepare the bullet direction
        bulletDir   = new Vector3(-1.0f, -0.3f, 0.0f);
        bulletClone = weaponPool.Spawn();
        bulletClone.transform.position = bulletPos;
        enemyWeaponScript           = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;
        enemyWeaponScript.direction = (Vector2)bulletDir;


        audio.clip = bulletSound;
        audio.Play();
    }
Ejemplo n.º 6
0
    public IEnumerator LaunchProjectile()
    {
        firing = true;                       // Let the script be aware that enemy is already firing

        if (shootDelayTimer > shootDelayMax) //shoot
        {
            if (mySpriteRdr.sprite == spriteVertical)
            {
                // Align the bullet direction to the object UP direction
                bulletDir = myTr.up;

                // Prepare the bullet position
                bulletPos = myTr.TransformPoint(0.0f, 0.2f, 0.0f);

                //Debug.Log("Enemy 4 (turret) - myTr.up : " + myTr.up, gameObject);

                //REGULAR METHOD : INSTANTIATE bullet (unoptimised)
                //bulletClone = Instantiate(bullet, bulletPos, Quaternion.identity);

                // Pooling Method : grab a bullet from "ObjectPooler"'s gameObjects list
                bulletClone = weaponPool.Spawn();
                bulletClone.transform.position = bulletPos;

                enemyWeaponScript = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;

                enemyWeaponScript.direction = (Vector2)bulletDir;

                mySpriteRdr.sprite = spriteVerticalFire;
            }

            else if (mySpriteRdr.sprite == spriteHorizontal)
            {
                // Align the bullet direction to the object right direction - taking into account the sprite horizontal direction.
                bulletDir = myTr.right * -mySpriteTr.localScale.x;

                // Prepare the bullet position
                bulletPos = myTr.TransformPoint(-0.1f * mySpriteTr.localScale.x, 0.11f, 0.0f);

                //REGULAR METHOD : INSTANTIATE bullet (unoptimised)
                //bulletClone = Instantiate(bullet, bulletPos, Quaternion.identity);

                // Pooling Method : grab a bullet from "ObjectPooler"'s gameObjects list
                bulletClone = weaponPool.Spawn();
                bulletClone.transform.position = bulletPos;

                enemyWeaponScript = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;

                enemyWeaponScript.direction = (Vector2)bulletDir;

                mySpriteRdr.sprite = spriteHorizontalFire;
            }

            else if (mySpriteRdr.sprite == spriteDiagonal)
            {
                bulletDir = myTr.right * -mySpriteTr.localScale.x + myTr.up;

                bulletPos = myTr.TransformPoint(-0.07f * mySpriteTr.localScale.x, 0.17f, 0.0f);

                //REGULAR METHOD : INSTANTIATE bullet (unoptimised)
                //bulletClone = Instantiate(bullet, bulletPos, Quaternion.identity);

                // Pooling Method : grab a bullet from "ObjectPooler"'s gameObjects list
                bulletClone = weaponPool.Spawn();
                bulletClone.transform.position = bulletPos;

                enemyWeaponScript = bulletClone.GetComponent <EnemyWeaponScript>() as EnemyWeaponScript;

                enemyWeaponScript.direction = (Vector2)bulletDir;

                mySpriteRdr.sprite = spriteDiagonalFire;
            }

            audio.clip = bulletSound;
            audio.Play();

            yield return(new WaitForSeconds(0.1f));

            shootDelayTimer = 0.0f;     // Reset the shoot delay count
            firing          = false;    // Enemy has finished firing
        }
    }