using Pathfinding; using System.Collections.Generic; using UnityEngine; public class DroneAI : MonoBehaviour { private List<GameObject> navMarkers = new List<GameObject>(); private GameObject moveTarget; public float approachStopDistance; public float movementSpeed; public float rotationSpeed; public float playerSightLimit; public bool moveInReverse; private bool canSeePlayer = false; private GameObject playerObject; private AIPath pathing; private AIDestinationSetter destSetter; private void Awake() { foreach (GameObject marker in GameObject.FindGameObjectsWithTag("Nav Marker")) navMarkers.Add(marker); moveTarget = FindClosestObject(navMarkers); playerObject = GameObject.FindGameObjectWithTag("Player"); pathing = GetComponent<AIPath>(); destSetter = GetComponent<AIDestinationSetter>(); pathing.enabled = false; destSetter.enabled = false; } private void FixedUpdate() { if (canSeePlayer) { if (moveTarget != playerObject) moveTarget = playerObject; if (Vector2.Distance(transform.position, moveTarget.transform.position) >= approachStopDistance) { MoveToMarker(); } if (Vector2.Distance(transform.position, moveTarget.transform.position) > playerSightLimit) { canSeePlayer = false; moveTarget = FindClosestObject(navMarkers); } } else { MoveToMarker(); if (Vector2.Distance(transform.position, moveTarget.transform.position) <= approachStopDistance) { GetNextMarker(); } } } public void MoveToMarker() { transform.LookAt(moveTarget.transform, transform.up); transform.position += transform.forward * movementSpeed; } public void GetNextMarker() { if (moveTarget.CompareTag("Trace")) { moveTarget.GetComponent<TraceInfo>().DisableTrace(); moveTarget = FindClosestObject(navMarkers); return; } Marker currentMarker = moveTarget.GetComponent<Marker>(); if (!moveInReverse) moveTarget = currentMarker.nextConnector; else moveTarget = currentMarker.previousConnector; } public GameObject FindClosestObject(List<GameObject> objects) { float[] distances = new float[objects.Count]; for (int i = 0; i < objects.Count; i++) { distances[i] = Vector3.Distance(transform.position, objects[i].transform.position); } int closestIndex = 0; float smallestValue = float.MaxValue; for (int i = 0; i < distances.Length; i++) { if (distances[i] < smallestValue) { smallestValue = distances[i]; closestIndex = i; } } return objects[closestIndex]; } public void SetCustomTarget(GameObject target) { moveTarget = target; } public void SetCanSeePlayer(bool state) { canSeePlayer = state; } }