nickmattinson / ZXYZ

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

Enemy Movement #78

Open MikeMMattinson opened 2 months ago

MikeMMattinson commented 2 months ago

Update enemy capability, movement and min/max engagement distance inside Enemy.cs and AIPathfinding.cs.

git fetch origin
git checkout 78-enemy-movement
MikeMMattinson commented 2 months ago

The following code recommended by ChatGPT 3.5, doesn't quite work...

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
    private bool isrotating = true;

    void Start()
    {
        //timer = waitTime;
        player = FindObjectOfType<Player>();
        FindActiveEnemies(); // Find all active Enemy objects at the start
    }

    void Update()
    {
        FindActiveEnemies();
        foreach (Enemy enemy in enemies)
        {
            float distanceToPlayer = Vector2.Distance(enemy.transform.position, player.transform.position);
            float minDistance = enemy.minEngagementDistance;
            float maxDistance = enemy.maxEngagementDistance;
            float enemySpeed = enemy.enemySpeed;
            float waitTime = enemy.waitTime;

            // Check if enemy is within the engagement distances
            if (distanceToPlayer >= minDistance && distanceToPlayer <= maxDistance)
            {
                Vector2 direction = player.transform.position - enemy.transform.position;
                direction.Normalize();
                float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

                // Move towards the player
                enemy.transform.position = Vector2.MoveTowards(enemy.transform.position, player.transform.position, enemySpeed * Time.deltaTime);

                // Rotate towards the player
                enemy.transform.rotation = Quaternion.Euler(Vector3.forward * angle);

                // Attack logic
                if (waitTime <= 0)
                {
                    enemy.Attack(player);
                    waitTime = enemy.waitTime; // Reset wait time after attacking
                }
                else
                {
                    waitTime -= Time.deltaTime;
                }

                // Update the waitTime for this enemy in the list
                //enemy.waitTime = waitTime;
            }
            else
            {
                // Enemy is outside engagement distances
                rb2dEnemy.velocity = Vector2.zero; // Stop moving
            }
        }
    }

    public void OnCollisionEnter(Collision collision){
        isrotating = ! collision.gameObject.CompareTag("Player");
        }
    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 <= enemy.maxEngagementDistance)
            {
                enemies.Add(enemy); // Add the enemy to the list if it's within range
            }
        }
    }

}
MikeMMattinson commented 2 months ago

image

MikeMMattinson commented 2 months ago

image

MikeMMattinson commented 2 months ago

image