using Pathfinding; using System.Collections.Generic; using UnityEngine; public class DroneAIMod : MonoBehaviour { private List<GameObject> navMarkers = new List<GameObject>(); private GameObject moveTarget; public bool moveInReverse; private bool canSeePlayer = false; private GameObject playerObject; private AIPath pathing; private AIDestinationSetter destSetter; public float playerSightLimit; private bool gotNewMarker; public AudioSource alarmSound; 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>(); destSetter.target = moveTarget.transform; } private void FixedUpdate() { //if you can see the player if (canSeePlayer) { //if the move target isnt the player, set it to the player if (moveTarget != playerObject) { moveTarget = playerObject; destSetter.target = moveTarget.transform; } //if the distance to the player is greater than the sight limit, get a new target if (Vector2.Distance(transform.position, moveTarget.transform.position) > playerSightLimit) { canSeePlayer = false; GetClosestMarker(); } } else { if (moveTarget == playerObject && Vector2.Distance(transform.position, moveTarget.transform.position) > playerSightLimit) { canSeePlayer = false; GetClosestMarker(); } if (alarmSound.isPlaying && (!moveTarget.CompareTag("Sound Marker") && !moveTarget.CompareTag("Trace"))) alarmSound.Stop(); //if the target isnt active (trace), get a new target if (moveTarget.gameObject.activeSelf == false || moveTarget.gameObject == null) GetClosestMarker(); //if the distance the to the current target is longer than the endreachdistance, we have a marker to go to if (pathing.remainingDistance > pathing.endReachedDistance) gotNewMarker = false; //if reached the end of the path and need a new marker, get a new marker if (pathing.reachedEndOfPath && gotNewMarker == false) { GetNextMarker(); gotNewMarker = true; } } if ((moveTarget.CompareTag("Sound Marker") || moveTarget.CompareTag("Trace")) && !alarmSound.isPlaying) alarmSound.Play(); } public void GetNextMarker() { if (moveTarget == playerObject) return; if (moveTarget.CompareTag("Trace")) { moveTarget.GetComponent<TraceInfo>().DisableTrace(); GetClosestMarker(); return; } if (moveTarget.CompareTag("Sound Marker")) { moveTarget.SetActive(false); GetClosestMarker(); return; } Marker currentMarker = moveTarget.GetComponent<Marker>(); if (!moveInReverse) { moveTarget = currentMarker.nextConnector; destSetter.target = moveTarget.transform; } else { moveTarget = currentMarker.previousConnector; destSetter.target = moveTarget.transform; } } 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; destSetter.target = moveTarget.transform; } public void SetCanSeePlayer(bool state) { canSeePlayer = state; } public void GetClosestMarker() { moveTarget = FindClosestObject(navMarkers); destSetter.target = moveTarget.transform; } public GameObject GetMoveTarget() { return moveTarget; } public GameObject GetPlayerObject() { return playerObject; } }