153 lines
4.5 KiB
C#
153 lines
4.5 KiB
C#
using System.Collections;
|
|
using AsteroidGame.Entities.Structures.Scripts;
|
|
using UnityEngine;
|
|
|
|
namespace AsteroidGame.Entities.Structures.Tower
|
|
{
|
|
public class Turret : StructureBase
|
|
{
|
|
[Header("WeaponParameters")] [SerializeField]
|
|
float weaponRange = 40f;
|
|
|
|
[SerializeField] int damage = 1;
|
|
[SerializeField] float fireRate = 1;
|
|
[SerializeField] float projectileSpeed = 5;
|
|
[SerializeField] TargetStrategy targetStrategy = TargetStrategy.LowestHealth;
|
|
|
|
[Header("Stats")]
|
|
[SerializeField] float score = 0f;
|
|
|
|
[Header("RigConnections")]
|
|
[SerializeField] Transform _turretHead;
|
|
[SerializeField] Transform _barrel;
|
|
|
|
#region Privates
|
|
|
|
[SerializeField]
|
|
enum TargetStrategy
|
|
{
|
|
ClosestEnemy,
|
|
LowestHealth
|
|
};
|
|
|
|
private GameObject targetEnemy;
|
|
[SerializeField] private Transform[] buildingParts;
|
|
|
|
#endregion
|
|
|
|
#region Publics
|
|
|
|
public float MaxDistance { get; set; }
|
|
|
|
public int Damage
|
|
{
|
|
get => damage;
|
|
set => damage = value;
|
|
}
|
|
|
|
public int FireRate { get; set; }
|
|
|
|
#endregion
|
|
|
|
private void Awake()
|
|
{
|
|
//buildingParts = GetComponentsInChildren<Transform>();
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
// enemyHandler = FindObjectOfType<EnemyHandler>();
|
|
// scoreHandler = FindObjectOfType<ScoreHandler>();
|
|
UpdateWeaponParameters(fireRate, projectileSpeed);
|
|
foreach (var buildingPart in buildingParts)
|
|
{
|
|
buildingPart.gameObject.SetActive(false);
|
|
}
|
|
|
|
StartCoroutine(Build());
|
|
}
|
|
|
|
IEnumerator Build()
|
|
{
|
|
foreach (var buildingPart in buildingParts)
|
|
{
|
|
buildingPart.gameObject.SetActive(true);
|
|
yield return new WaitForSeconds(buildTimer);
|
|
}
|
|
|
|
}
|
|
|
|
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
|
|
void Update()
|
|
{
|
|
// ShootProjectile(false);
|
|
// FindAndShootEnemy();
|
|
}
|
|
|
|
// private void FindAndShootEnemy()
|
|
// {
|
|
// float bestValue = Mathf.Infinity;
|
|
// bool targetFound = false;
|
|
// List<GameObject> enemies = enemyHandler.ReturnAllEnemies();
|
|
//
|
|
// foreach (GameObject enemy in enemies)
|
|
// {
|
|
// float distanceToTarget = Vector3.Magnitude(enemy.transform.position - transform.position);
|
|
//
|
|
// bool withinRange = distanceToTarget < weaponRange;
|
|
// if (withinRange)
|
|
// {
|
|
// if (targetStrategy == TargetStrategy.ClosestEnemy)
|
|
// {
|
|
// bool isClosest = distanceToTarget < bestValue;
|
|
// if (isClosest)
|
|
// {
|
|
// targetFound = true;
|
|
// bestValue = distanceToTarget;
|
|
// targetEnemy = enemy;
|
|
// }
|
|
// }
|
|
// if (targetStrategy == TargetStrategy.LowestHealth)
|
|
// {
|
|
// float enemyHealth = enemy.GetComponent<EnemyHealth>().Health;
|
|
//
|
|
// bool isLowestHealth = enemyHealth < bestValue;
|
|
// if (isLowestHealth)
|
|
// {
|
|
// targetFound = true;
|
|
// bestValue = enemyHealth;
|
|
// targetEnemy = enemy;
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// if (targetFound)
|
|
// {
|
|
// weapon.transform.LookAt(targetEnemy.transform.position);
|
|
// ShootProjectile(true);
|
|
// }
|
|
// }
|
|
|
|
void ShootProjectile(bool _state)
|
|
{
|
|
// var emissionModule = _projectile.emission;
|
|
// emissionModule.enabled = _state;
|
|
}
|
|
|
|
public void UpdateScore(float _score)
|
|
{
|
|
score += _score;
|
|
}
|
|
}
|
|
}
|