UnityGameProjectsCode / InTheDarkGame / Level / Drone / DroneAIMod.cs
DroneAIMod.cs
Raw
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;
    }
}