nickmattinson / ZXYZ

Top-Down 2D Dungeon Crawler
1 stars 0 forks source link

EnemyReferencesBroken #35

Closed nickmattinson closed 5 months ago

nickmattinson commented 5 months ago
git fetch origin
git checkout 35-enemyreferencesbroken
nickmattinson commented 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!");
                }
            }
        }
    }
}
`
nickmattinson commented 5 months ago
`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;
            }
        }
    }
}
`
nickmattinson commented 5 months ago
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;
    }
}
nickmattinson commented 5 months ago
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;
    }
}
nickmattinson commented 5 months ago
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}";
    }
}
MikeMMattinson commented 5 months ago

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
        }
    }
}
}
MikeMMattinson commented 5 months ago

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;
    }
}