125 lines
3.9 KiB
C#
125 lines
3.9 KiB
C#
using System;
|
|
using AsteroidGame.Entities.Enemies.Scripts;
|
|
using UnityEngine;
|
|
|
|
namespace AsteroidGame.Entities
|
|
{
|
|
public class Turret : StructureBase
|
|
{
|
|
[Header("WeaponParameters")] [SerializeField]
|
|
private float _weaponRange = 40f;
|
|
|
|
[SerializeField] private int _damage = 1;
|
|
[SerializeField] private float _fireRate = 1;
|
|
[SerializeField] private float _projectileSpeed = 5;
|
|
[SerializeField] private TargetStrategy _targetStrategy = TargetStrategy.LowestHealth;
|
|
|
|
[Header("Stats")]
|
|
[SerializeField] private float _kills = 0f;
|
|
[SerializeField] private float _damageDealt = 0f;
|
|
|
|
[Header("RigConnections")]
|
|
[SerializeField] private Transform _turretHead;
|
|
[SerializeField] private Transform _barrel;
|
|
|
|
[Header("Target")]
|
|
[SerializeField] private SEnemyBaseRuntimeSet _activeEnemies;
|
|
[SerializeField] private EnemyBase _targetEnemy;
|
|
|
|
[SerializeField] private enum TargetStrategy
|
|
{
|
|
ClosestEnemy,
|
|
LowestHealth
|
|
};
|
|
|
|
#region Publics
|
|
|
|
public float MaxDistance { get; set; }
|
|
|
|
public int Damage
|
|
{
|
|
get => _damage;
|
|
set => _damage = value;
|
|
}
|
|
|
|
public int FireRate { get; set; }
|
|
|
|
#endregion
|
|
|
|
private void Start()
|
|
{
|
|
// enemyHandler = FindObjectOfType<EnemyHandler>();
|
|
// scoreHandler = FindObjectOfType<ScoreHandler>();
|
|
UpdateWeaponParameters(_fireRate, _projectileSpeed);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
FindEnemyTarget();
|
|
}
|
|
|
|
private void UpdateWeaponParameters(float fireRate, float projectileSpeed)
|
|
{
|
|
// var main = _projectile.main;
|
|
// main.startSpeed = _projectileSpeed;
|
|
//
|
|
// var emission = _projectile.emission;
|
|
// emission.rateOverTime = _fireRate;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
|
|
private void FindEnemyTarget()
|
|
{
|
|
float currentBestValue = Mathf.Infinity;
|
|
var targetFound = false;
|
|
|
|
foreach (EnemyBase enemy in _activeEnemies._list)
|
|
{
|
|
float distanceToTarget = Vector3.Magnitude(enemy.GetCenterPosition() - GetCenterPosition());
|
|
|
|
bool withinRange = distanceToTarget < _weaponRange;
|
|
if (withinRange)
|
|
{
|
|
switch (_targetStrategy)
|
|
{
|
|
case TargetStrategy.ClosestEnemy:
|
|
{
|
|
bool isClosest = distanceToTarget < currentBestValue;
|
|
if (isClosest)
|
|
{
|
|
targetFound = true;
|
|
currentBestValue = distanceToTarget;
|
|
_targetEnemy = enemy;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case TargetStrategy.LowestHealth:
|
|
{
|
|
float enemyHealth = enemy.GetHealth();
|
|
|
|
bool isLowestHealth = enemyHealth < currentBestValue;
|
|
if (isLowestHealth)
|
|
{
|
|
targetFound = true;
|
|
currentBestValue = enemyHealth;
|
|
_targetEnemy = enemy;
|
|
}
|
|
|
|
break;
|
|
}
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (targetFound)
|
|
{
|
|
_turretHead.transform.LookAt(_targetEnemy.GetCenterPosition());
|
|
// ShootProjectile(true);
|
|
}
|
|
}
|
|
}
|
|
} |