protected virtual void Shoot() { // TODO: можно добавить алгоритм выбора противника, который ближе всех к финальной точке EnemyActor enemyTarget = GetEnemyTarget(); if (enemyTarget == null) { return; } _skillModelTower.Shoot(_parametrsTower.damageOnShoot, transform.position, enemyTarget.transform); LastTimeShoot = Time.time; }
private void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.CompareTag(GlobalSettingsGame.TAG_ENEMY)) { EnemyActor enemy = collision.gameObject.GetComponentInChildren <EnemyActor>(); if (enemy != null) { enemy.ReciveDamage(_damage); } _poolObject.ReturnToPool(); //TODO: можно сделать воспроизведение звука нанесения урона } }
private void OnTriggerExit2D(Collider2D collision) { if (collision.CompareTag(GlobalSettingsGame.TAG_ENEMY)) { EnemyActor enemy = collision.GetComponent <EnemyActor>(); if (enemy != null) { _listEnemyInRange.Remove(enemy); } else { Debug.LogError($"TaskGame_TowerDefence ({collision}): установлен тег {GlobalSettingsGame.TAG_ENEMY} для объекта у которого отсутсвует EnemyActor"); } } }
/// <summary> /// Получить цель атаки /// </summary> /// <returns></returns> protected virtual EnemyActor GetEnemyTarget() { if (_listEnemyInRange.Count == 0) { return(null); } int indexEnemy = Random.Range(0, _listEnemyInRange.Count); EnemyActor enemyActor = _listEnemyInRange[indexEnemy]; if (enemyActor == null) { // enemyActor может быть null в случае, если противника убила другая башня _listEnemyInRange.RemoveAt(indexEnemy); return(GetEnemyTarget()); } return(enemyActor); }
/// <summary> /// Появления противников стадии /// </summary> /// <param name="waveStage"></param> /// <returns></returns> private IEnumerator StartShowEnemy(WaveStage waveStage) { int countEnemy = Random.Range(waveStage.minCountEnemyInStage, waveStage.maxCountEnemyInStage); for (int i = 0; i < countEnemy; i++) { GameObject enemyPref = PoolManager.GetObject(waveStage.indexEnemyPrefabInPoll, transform.position, Quaternion.identity); EnemyActor enemyActor = enemyPref.GetComponent <EnemyActor>(); bool statusAddEnemy = enemyActor.SetUpgradeLVL(waveStage.indexLavelPowerEnemy, _pathMovingCollider.ListPositionPathMoving.Head); if (statusAddEnemy) { countCreateEnemy++; } yield return(new WaitForSeconds(waveStage.delayShowOneEnemy)); if (isLastWave && (i == countEnemy - 1)) { isFinishSpawn = true; } } }