private void TryHit()
        {
            Collider[] colliders = Physics.OverlapSphere(this.transform.position, this.projectile.damageRadius);

            foreach (Collider collider in colliders)
            {
                EnemyBehavior enemy = collider.GetComponent <EnemyBehavior>();
                if (null != enemy)
                {
                    Debug.Log("Damaging enemy.");
                    enemy.DamageMe(this.projectile.damage);
                    Destroy(this.gameObject);
                }
            }
        }
예제 #2
0
        private void FireAtTargets(EnemyBehavior[] enemies)
        {
            this.fireCooldown -= Time.deltaTime;

            EnemyBehavior[] enemiesInRange = enemies
                                             .Where(enemy => Vector3.Distance(this.muzzleTransform.position, enemy.transform.position).IsBetweenInclusive(3.5f, this.maxRange))
                                             .OrderBy(enemy => Vector3.Distance(this.muzzleTransform.position, enemy.transform.position))
                                             .ToArray();

            if (false == enemiesInRange.Any())
            {
                return;
            }

            // current target is closest enemy in range (3.5, 6.5)
            EnemyBehavior currentTarget = enemiesInRange.FirstOrDefault();

            // look at current target
            Vector3    lookDirection = currentTarget.transform.position - this.turretTransform.position;
            Quaternion lookRotation  = Quaternion.LookRotation(lookDirection * -1);

            this.turretTransform.rotation = Quaternion.Euler(
                lookRotation.eulerAngles.x,
                lookRotation.eulerAngles.y,
                this.turretTransform.localRotation.eulerAngles.z);

            // fire at current target
            if (this.fireCooldown <= 0 && this.currentEnergy >= this.towerProjectile.costToFire)
            {
                GameObject shellGameObject = (GameObject)Instantiate(
                    this.shellPrefab,
                    this.muzzleTransform.position,
                    this.muzzleTransform.rotation);

                Projectile firedProjectile = shellGameObject.GetComponent <ShellBehavior>().projectile;
                firedProjectile.targetPosition = currentTarget.transform.position;

                this.currentEnergy -= this.towerProjectile.costToFire;
                this.fireCooldown   = this.towerProjectile.rateOfFire;
            }
        }