Closed nickmattinson closed 5 months ago
`using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
[SerializeField] List<Transform> enemySpawnPoints;
[SerializeField] StateManager stateManager;
[SerializeField] List<GameObject> enemyType;
protected int numberOfSpawns;
private Player player;
public List<Enemy> listOfEnemies;
void Start()
{
player = FindObjectOfType<Player>();
stateManager = FindObjectOfType<StateManager>();
if (stateManager.gameEnded != true)
{
numberOfSpawns = enemySpawnPoints.Count;
for (int i = 0; i < numberOfSpawns; i++)
{
//retrieving spawn point
Transform spawnPoint = enemySpawnPoints[i];
// Randomly select an enemy prefab
GameObject currentEnemyPrefab = enemyType[Random.Range(0, enemyType.Count)];
// Create enemy instance
GameObject enemyInstance = Instantiate(currentEnemyPrefab, spawnPoint.position, spawnPoint.rotation);
// Set player reference for the enemy
Enemy enemyComponent = enemyInstance.GetComponent<Enemy>();
listOfEnemies[i] = enemyComponent;
listOfEnemies[i].enemyID = i + 1;
if (enemyComponent != null)
{
enemyComponent.SetPlayerReference(player);
}
else
{
Debug.LogWarning("Enemy component not found on instantiated enemy!");
}
}
}
}
}
`
`using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AIPathfinding : MonoBehaviour
{
public Player player; // Reference to the player prefab
[SerializeField] float speed;
[SerializeField] float distanceBetween;
[SerializeField] float minimumDistance;
private float distance;
[SerializeField] Rigidbody2D rb2dEnemy;
[SerializeField] float waitTime;
private float timer = 0f;
private Enemy enemy;
public int iD;
EnemySpawner es;
void Start()
{
timer = waitTime;
player = FindObjectOfType<Player>();
enemy = GameObject.FindGameObjectWithTag("Enemy").GetComponent<Enemy>();
es = FindObjectOfType<EnemySpawner>();
}
void Update()
{
distance = Vector2.Distance(transform.position, player.transform.position);
Vector2 direction = player.transform.position - transform.position;
direction.Normalize();
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
if (distance <= distanceBetween && distance >= minimumDistance)
{
transform.position = Vector2.MoveTowards(this.transform.position, player.transform.position, speed * Time.deltaTime);
transform.rotation = Quaternion.Euler(Vector3.forward * angle);
}
else
{
rb2dEnemy.velocity = Vector2.zero;
//transform.rotation = Quaternion.Euler(Vector3.zero);
}
if (distance <= distanceBetween)
{
if (timer <= 0)
{
enemy.attackPlayer(transform.position, enemy.attack, enemy.enemyID);
timer = waitTime;
}
else
{
timer -= Time.deltaTime;
}
}
}
}
`
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : Entity
{
public int enemyID {get; set;} // this is instantiated in EnemySpawner
private Player player;
public LineRenderer lineRenderer;
private float lineDuration = 0.1f;
//[SerializeField] List<Transform> enemySpawnPoints;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
if (player == null)
{
Debug.LogError("Player object not found!");
}
Debug.Log(this);
}
public void attackPlayer(Vector3 enemyPosition, int attackValue, int iD)
{
Debug.Log("ID = " + iD);
Debug.Log("This enemy has this attack: " + attackValue);
player.TakeDamage(attackValue);
drawLineToPlayer(enemyPosition);
}
public void drawLineToPlayer(Vector3 enemyPosition)
{
// Set the positions for the LineRenderer (start and end points)
lineRenderer.SetPosition(0, enemyPosition); // Start position: enemy's position
lineRenderer.SetPosition(1, player.transform.position); // End position: player's position
// Enable the LineRenderer to make the line visible
lineRenderer.enabled = true;
// Start coroutine to disable LineRenderer after duration
StartCoroutine(DisableLineRendererAfterDelay());
}
// Coroutine to disable LineRenderer after specified duration
private IEnumerator DisableLineRendererAfterDelay()
{
yield return new WaitForSeconds(lineDuration);
lineRenderer.enabled = false;
}
public void SetPlayerReference(Player player)
{
this.player = player;
}
protected override void Die()
{
player.score += 1;
Destroy(gameObject);
// Implement enemy-specific death behavior here
}
public override string ToString()
{
string temp = $"{base.ToString()}";
temp += $", Enemy: {name}";
temp += $", Spawnpoint: {"TBD"}";
return temp;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
[System.Serializable]
public class Entity : MonoBehaviour
{
[SerializeField] protected int level;
[SerializeField] public int health;
[SerializeField] public int attack {get; set;}
[SerializeField] public int defense;
public GameObject damageNumberPrefab;
public void TakeDamage(int damage)
{
if (damage > defense)
{
//Debug.Log("damage: " + damage + " and defense: " + defense);
int actualDamage = damage - defense;
health -= (actualDamage);
// Instantiate damage number prefab at enemy's position
GameObject damageNumberObj = Instantiate(damageNumberPrefab, transform.position, Quaternion.identity);
if (damageNumberPrefab != null)
{
// Set the damage value on the damage number
DamageNumber damageNumber = damageNumberObj.GetComponent<DamageNumber>();
damageNumber.SetDamage(actualDamage);
if (health <= 0)
{
Die();
}
}
else
{
Debug.Log("did not create damage number object.");
}
}
}
protected virtual void Die()
{
// Override this method in derived classes
Debug.Log("Entity died!");
}
public override string ToString()
{
string temp = $", Level: {level}";
temp += $", Health: {health}";
temp += $", Defense: {defense}";
temp += $", Attack: {attack}";
temp += $", Position: {transform.position}";
return temp;
}
}
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class Player : Entity
{
public StateManager stateManager;
public int score;
void Start()
{
Vector2 vector2d = new Vector2();
vector2d.x = 0f;
vector2d.y = 90f;
stateManager = FindObjectOfType<StateManager>();
this.transform.position = vector2d;
Debug.Log(this);
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
// Convert mouse position to world space in 2D
Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Perform a raycast in 2D from the mouse position
RaycastHit2D hit = Physics2D.Raycast(mousePosition, Vector2.zero);
if (hit.collider != null)
{
Enemy enemy = hit.collider.GetComponent<Enemy>();
if (enemy != null)
{
// Deal damage to the enemy
//Debug.Log("Player's attack is " + attack);
enemy.TakeDamage(this.attack);
}
}
}
}
public void ActivatePowerUp(string powerUp){
if(powerUp == "AttackUp"){
this.attack += 3;
}
if(powerUp == "HealthUp"){
// check no more than 100
this.health += 20;
if(this.health > 100) {
this.health = 100;
}
}
if(powerUp == "DefenseUp"){
// check no more than 100
this.defense += 2;
}
}
protected override void Die()
{
Debug.Log("Player died!");
stateManager.loadGameOver();
}
public override string ToString()
{
return $"Player: {name}, Level: {level}, Health: {health}, Defense: {defense}, Attack: {attack}";
}
}
AIPathFindings.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AIPathfinding : MonoBehaviour
{
public Player player; // Reference to the player prefab
[SerializeField] float speed;
[SerializeField] float distanceBetween;
[SerializeField] float minimumDistance;
private float distance;
[SerializeField] Rigidbody2D rb2dEnemy;
[SerializeField] float waitTime;
private float timer = 0f;
private List<Enemy> enemies = new List<Enemy>(); // List to store active Enemy objects
void Start()
{
timer = waitTime;
player = FindObjectOfType<Player>();
FindActiveEnemies(); // Find all active Enemy objects at the start
}
void Update()
{
distance = Vector2.Distance(transform.position, player.transform.position);
Vector2 direction = player.transform.position - transform.position;
direction.Normalize();
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
if (distance <= distanceBetween && distance >= minimumDistance)
{
transform.position = Vector2.MoveTowards(this.transform.position, player.transform.position, speed * Time.deltaTime);
transform.rotation = Quaternion.Euler(Vector3.forward * angle);
}
else
{
rb2dEnemy.velocity = Vector2.zero;
}
// Check each enemy in the list
FindActiveEnemies();
foreach (Enemy enemy in enemies)
{
if (distance <= distanceBetween)
{
if (timer <= 0)
{
enemy.attackOther(player);
timer = waitTime;
}
else
{
timer -= Time.deltaTime;
}
}
}
}
void FindActiveEnemies()
{
// Find all Enemy objects in the scene
Enemy[] allEnemies = FindObjectsOfType<Enemy>();
// Clear the current list of enemies
enemies.Clear();
// Loop through each enemy to check if it's within range of the player
foreach (Enemy enemy in allEnemies)
{
float distanceToPlayer = Vector2.Distance(enemy.transform.position, player.transform.position);
if (distanceToPlayer <= distanceBetween)
{
enemies.Add(enemy); // Add the enemy to the list if it's within range
}
}
}
}
Enemy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : Entity
{
private Player player;
public LineRenderer lineRenderer;
private float lineDuration = 0.1f;
//[SerializeField] List<Transform> enemySpawnPoints;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
if (player == null)
{
Debug.LogError("Player object not found!");
}
Debug.Log(this);
}
public void attackOther(Entity other)
{
//Debug.Log(enemyPosition);
Debug.Log($"{name} at {transform.position} attacks {other.name} at {other.transform.position} with Attack: {attack}");
other.TakeDamage(attack);
//drawLineToPlayer(enemyPosition);
}
public void drawLineToPlayer(Vector3 enemyPosition)
{
// Set the positions for the LineRenderer (start and end points)
lineRenderer.SetPosition(0, enemyPosition); // Start position: enemy's position
lineRenderer.SetPosition(1, player.transform.position); // End position: player's position
// Enable the LineRenderer to make the line visible
lineRenderer.enabled = true;
// Start coroutine to disable LineRenderer after duration
StartCoroutine(DisableLineRendererAfterDelay());
}
// Coroutine to disable LineRenderer after specified duration
private IEnumerator DisableLineRendererAfterDelay()
{
yield return new WaitForSeconds(lineDuration);
lineRenderer.enabled = false;
}
public void SetPlayerReference(Player player)
{
this.player = player;
}
protected override void Die()
{
player.score += 1;
Destroy(gameObject);
// Implement enemy-specific death behavior here
}
public override string ToString()
{
string temp = $"{base.ToString()}";
temp += $", Enemy: {name}";
temp += $", Spawnpoint: {"TBD"}";
return temp;
}
}