// "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; }
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(); } }
// 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); }
//[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(); } }
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(); }
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 } }