Files
TowerDefence/My project/Assets/Scripts/Tower.cs
Caleb Sandford deQuincey 334021d04e Started project
2025-11-14 17:30:41 +00:00

114 lines
3.1 KiB
C#

using UnityEngine;
using System.Collections.Generic;
public class Tower : MonoBehaviour
{
public enum TowerTargetPriority {First, Close, Strong}
[Header("Info")]
public float range;
private List<Enemy> curEnemiesInRange = new List<Enemy>();
private Enemy curEnemy;
public TowerTargetPriority targetPriority;
public bool rotateTowardsTarget;
[Header("Attacking")]
public float attackRate;
private float lastAttackTime;
public GameObject projectilePrefab;
public Transform projectileSpawnPoint;
public int projectileDamage;
public float projectileSpeed;
void Update()
{
if(Time.time - lastAttackTime > attackRate)
{
lastAttackTime = Time.time;
curEnemy = GetEnemy();
if(curEnemy != null)
{
Attack();
}
}
}
Enemy GetEnemy()
{
curEnemiesInRange.RemoveAll(x => x == null);
if(curEnemiesInRange.Count == 0)
{
return null;
}
if(curEnemiesInRange.Count == 1)
{
return curEnemiesInRange[0];
}
switch (targetPriority)
{
case TowerTargetPriority.First:
{
return curEnemiesInRange[0];
}
case TowerTargetPriority.Close:
{
Enemy closet = null;
float dist = 99;
for (int x = 0; x < curEnemiesInRange.Count; x++)
{
float d = (transform.position - curEnemiesInRange[x].transform.position).sqrMagnitude;
if(d < dist)
{
closet = curEnemiesInRange[x];
dist = d;
}
}
return closet;
}
case TowerTargetPriority.Strong:
{
Enemy strongest = null;
int strongestHealth = 0;
foreach (Enemy enemy in curEnemiesInRange)
{
if(enemy.health > strongestHealth)
{
strongest = enemy;
strongestHealth = enemy.health;
}
}
return strongest;
}
}
return null;
}
void Attack()
{
if(rotateTowardsTarget)
{
transform.LookAt(curEnemy.transform);
transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);
}
GameObject proj = Instantiate(projectilePrefab, projectileSpawnPoint.position, Quaternion.identity);
proj.GetComponent<Projectile>().Initialize(curEnemy, projectileDamage, projectileSpeed);
}
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Enemy"))
{
curEnemiesInRange.Add(other.GetComponent<Enemy>());
}
}
private void OnTriggerExit(Collider other)
{
if(other.CompareTag("Enemy"))
{
curEnemiesInRange.Remove(other.GetComponent<Enemy>());
}
}
}