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