Open MikeMMattinson opened 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
}
}
}
}
Update enemy capability, movement and min/max engagement distance inside Enemy.cs and AIPathfinding.cs.