48 lines
1.8 KiB
C#
48 lines
1.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class ArtistController : MonoBehaviour {
|
|
public int range = 50;
|
|
public int projectileSpeed = 5;
|
|
public GameObject projectile;
|
|
|
|
private Queue<GameObject> enemyQueue;
|
|
void Start() {
|
|
InvokeRepeating(nameof(fireAttack), 0, 1);
|
|
}
|
|
|
|
public void setEnemyQueue(Queue<GameObject> enemyQueueIn) {
|
|
enemyQueue = enemyQueueIn;
|
|
}
|
|
|
|
// Look through all of the queue, and find the distance between each enemy and the artist.
|
|
// Keep track of the enemy with the lowest distance, and after you have looped through the entire queue,
|
|
// Initiate a new instance of the projectile game object, from the artists position, in the direction of the enemy.
|
|
private void fireAttack() {
|
|
if (enemyQueue.Count == 0) return; // If there are no enemies in the queue, return.
|
|
if (enemyQueue.Peek() == null) return; // If the first enemy in the queue is null, return.
|
|
|
|
float lowestDistance = range;
|
|
GameObject enemyTarget = null;
|
|
|
|
foreach (var enemy in enemyQueue) {
|
|
var distance = Vector3.Distance(enemy.transform.position, transform.position);
|
|
if (distance < lowestDistance) {
|
|
lowestDistance = distance;
|
|
enemyTarget = enemy;
|
|
}
|
|
}
|
|
|
|
if (enemyTarget == null) return; // If there are no enemies in range, return.
|
|
|
|
//Find the vector that points from the artist to the enemy.
|
|
var heading = enemyTarget.transform.position - transform.position;
|
|
//Find the angle between the artist and the enemy.
|
|
var angle = Mathf.Atan2(heading.y, heading.x) * Mathf.Rad2Deg;
|
|
//Create a quaternion (rotation) based on the angle.
|
|
var q = Quaternion.Euler(0,0,angle);
|
|
var projectileInstance = Instantiate(projectile, transform.position, q);
|
|
projectileInstance.GetComponent<StandardProjectileController>().setSpeed(projectileSpeed);
|
|
}
|
|
} |