public void SetPath(List <Chunk_Script> newPath)
 {
     if (newPath != path)
     {
         path        = newPath;
         targetChunk = path[0];
         endChunk    = newPath[newPath.Count - 1];
     }
 }
    void FixedUpdate()
    {
        Ray        ray = new Ray(this.transform.position, -this.transform.up);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.CompareTag("Chunk"))
            {
                currentChunk = hit.collider.gameObject.GetComponent <Chunk_Script>();
            }
        }
    }
    private Chunk_Script GetLowestFCost(List <Chunk_Script> chunkList)
    {
        Chunk_Script lowestFCostChunk = chunkList[0];

        foreach (Chunk_Script cs in chunkList)
        {
            if (cs.fCost < lowestFCostChunk.fCost)
            {
                lowestFCostChunk = cs;
            }
        }

        return(lowestFCostChunk);
    }
    private List <Chunk_Script> GetNeighbourList(Chunk_Script currentChunk)
    {
        List <Chunk_Script> neightbourList = new List <Chunk_Script>();

        if (currentChunk.positionX - 1 >= -grid.width / 2)
        {
            neightbourList.Add(GetChunk(currentChunk.positionX - 1, currentChunk.positionZ));
            if (currentChunk.positionZ - 1 >= -grid.height / 2)
            {
                neightbourList.Add(GetChunk(currentChunk.positionX - 1, currentChunk.positionZ - 1));
            }
            if (currentChunk.positionZ + 1 < grid.height / 2)
            {
                neightbourList.Add(GetChunk(currentChunk.positionX - 1, currentChunk.positionZ + 1));
            }
        }

        if (currentChunk.positionX + 1 >= -grid.width / 2)
        {
            neightbourList.Add(GetChunk(currentChunk.positionX + 1, currentChunk.positionZ));
            if (currentChunk.positionZ - 1 >= -grid.height / 2)
            {
                neightbourList.Add(GetChunk(currentChunk.positionX + 1, currentChunk.positionZ - 1));
            }
            if (currentChunk.positionZ + 1 < grid.height / 2)
            {
                neightbourList.Add(GetChunk(currentChunk.positionX + 1, currentChunk.positionZ + 1));
            }
        }

        if (currentChunk.positionZ - 1 >= -grid.height / 2)
        {
            neightbourList.Add(GetChunk(currentChunk.positionX, currentChunk.positionZ - 1));
        }
        if (currentChunk.positionZ + 1 < grid.height / 2)
        {
            neightbourList.Add(GetChunk(currentChunk.positionX, currentChunk.positionZ + 1));
        }

        if (neightbourList.Count > 0)
        {
            return(neightbourList);
        }
        else
        {
            return(null);
        }
    }
    public Chunk_Script GetChunkUnder()
    {
        Chunk_Script under = null;

        RaycastHit hit;

        if (Physics.Raycast(transform.position, -transform.up, out hit, 5))
        {
            if (hit.collider.tag == "Chunk")
            {
                under = hit.collider.gameObject.GetComponent <Chunk_Script>();
            }
        }

        return(under);
    }
    public List <Chunk_Script> CalculatePath(Chunk_Script endChunk)
    {
        List <Chunk_Script> path = new List <Chunk_Script>();

        path.Add(endChunk);
        Chunk_Script currentChunk = endChunk;

        while (currentChunk.fromChunk != null)
        {
            path.Add(currentChunk.fromChunk);
            currentChunk = currentChunk.fromChunk;
        }

        path.Reverse();
        return(path);
    }
    public int CalculateDistanceCost(Chunk_Script a, Chunk_Script b)
    {
        int cost = 0;

        if (a == null || b == null)
        {
            Debug.Log("Null a or b");
        }

        int xDistance = Mathf.Abs(a.positionX - b.positionX);
        int zDistance = Mathf.Abs(a.positionZ - b.positionZ);
        int remaining = Mathf.Abs(xDistance - zDistance);

        cost = M_Diagonal_Cost * Mathf.Min(xDistance, zDistance) + M_Straight_Cost * remaining;

        return(cost);
    }
    // Update is called once per frame
    void Update()
    {
        if (currentHealth < maxHealth)
        {
            healthBar.SetActive(true);
        }



        if (currentHealth > maxHealth)
        {
            currentHealth = maxHealth;
        }



        if (targetChunk != null)
        {
            if (currentChunk != endChunk)
            {
                if (this.transform.position.x <= targetChunk.positionX + 0.1f && this.transform.position.x > targetChunk.positionX - 0.1f && this.transform.position.z <= targetChunk.positionZ + 0.1f && this.transform.position.z > targetChunk.positionZ - 0.1f)
                {
                    // Change target chunk to next chunk in path list
                    int currentIndex = path.IndexOf(targetChunk);
                    if (currentIndex + 1 < path.Count)
                    {
                        targetChunk = path[currentIndex + 1];
                    }
                }
                else if (this.transform.position.x <= targetChunk.positionX + 0.1f && this.transform.position.x > targetChunk.positionX - 0.1f)
                {
                    // Move towards z centre of target chunk
                    transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime);

                    Vector3    direction    = (targetChunk.transform.position - transform.position).normalized;
                    Quaternion lookRotation = Quaternion.LookRotation(direction);
                    transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime);
                }
                else if (this.transform.position.z <= targetChunk.positionZ + 0.1f && this.transform.position.z > targetChunk.positionZ - 0.1f)
                {
                    // Move towards x centre of target chunk
                    transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime);

                    Vector3    direction    = (targetChunk.transform.position - transform.position).normalized;
                    Quaternion lookRotation = Quaternion.LookRotation(direction);
                    transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime);
                }
                else
                {
                    // Move towards centre of target chunk
                    transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime);

                    Vector3    direction    = (targetChunk.transform.position - transform.position).normalized;
                    Quaternion lookRotation = Quaternion.LookRotation(direction);
                    transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime);
                }
            }
            else if (this.transform.position.x != endChunk.positionX || this.transform.position.z != endChunk.positionZ)
            {
                //Move towards endChunk centre
                transform.position = Vector3.MoveTowards(this.transform.position, targetChunk.transform.position, speed * Time.deltaTime);

                Vector3    direction    = (targetChunk.transform.position - transform.position).normalized;
                Quaternion lookRotation = Quaternion.LookRotation(direction);
                transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, speed * Time.deltaTime);
            }
            //Do Nothing - turn off calculations?
            else
            {
                targetChunk = null;
                if (animManager.anim.GetBool("Running") == true)
                {
                    animManager.Run(false);
                    GetComponent <AudioSource>().Stop();
                }
                if (actions > 0 && turnScript.currentTeam == 0)
                {
                    aiScript.DistanceTemplate();
                    turnScript.CheckVisibleEnemies();
                }
                else if (actions > 0 && turnScript.currentTeam == 1)
                {
                    aiScript.behaviourScript.TakeAction(aiScript.aiEntity.GetComponent <AI_Follower_Script>());
                }
                else if (GetActions() == 0)
                {
                    turnScript.currentTeam = team;
                    aiScript.aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(false);
                    aiScript.aiEntity = turnScript.GetNextUnit().gameObject;
                    if (turnScript.currentTeam == 0)
                    {
                        turnScript.CheckVisibleEnemies();
                        aiScript.DistanceTemplate();
                        turnScript.aiScript.cameraTrolley.transform.position = turnScript.aiScript.aiEntity.transform.position;
                        aiScript.aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true);
                    }
                    else
                    {
                        aiScript.behaviourScript.TakeAction(aiScript.aiEntity.GetComponent <AI_Follower_Script>());
                    }
                }
            }
        }
    }
Exemple #9
0
 public void SetChunkUnder(Chunk_Script chunk)
 {
     chunkUnder = chunk;
 }
    public Vector3 Shoot(GameObject target, GameObject shooter)
    {
        AI_Follower_Script shooterUnit = shooter.GetComponent <AI_Follower_Script>();

        Vector3 newPos = new Vector3(0, 0, 0);

        shooterUnit.aiScript.unitCamera.GetComponent <AudioSource>().Play();

        for (float i = 0; i < 2; i += 0.3f)
        {
            StartCoroutine(DelayedSpawn(i, shooterUnit));
        }

        Vector3 up1 = new Vector3(0, 0.5f);

        RaycastHit[] hits;

        float distance = Vector3.Distance(shooter.transform.position, target.transform.position);
        bool  shot     = false;

        if (distance < shooterUnit.maxRange)
        {
            hits = Physics.RaycastAll(shooter.transform.position + up1, (target.transform.position - shooter.transform.position), distance);
            Vector3 lookDirection = target.transform.position;
            lookDirection.y = 0;
            shooter.transform.LookAt(lookDirection);
            foreach (RaycastHit h in hits)
            {
                if (h.collider.tag == "Tall Cover")
                {
                    if (Vector3.Distance(shooter.transform.position, h.transform.position) <= 2 && target != h.collider.gameObject)
                    {
                        RaycastHit hit;
                        shooter.transform.position += shooter.transform.right;
                        Chunk_Script avoidChunk = shooter.GetComponent <AI_Follower_Script>().GetChunkUnder();
                        if (avoidChunk.impassable == false)
                        {
                            if (Physics.Raycast(shooter.transform.position + up1, shooter.transform.forward, out hit, 1.5f))
                            {
                                if (hit.collider.tag == ("Tall Cover"))
                                {
                                    Debug.Log("Attempted and hit cover still");
                                }
                                else
                                {
                                    ShootRound(target, shooter, shooter.transform.position);
                                    newPos = shooter.transform.position;
                                    Debug.Log("Attempted and didn't hit cover");
                                    shooter.transform.position += -shooter.transform.right;
                                    break;
                                }
                            }
                            else
                            {
                                ShootRound(target, shooter, shooter.transform.position);
                                newPos = shooter.transform.position;
                                Debug.Log("Attempted and didn't hit cover");
                                shooter.transform.position += -shooter.transform.right;
                                break;
                            }
                        }

                        shooter.transform.position += -shooter.transform.right;
                        shooter.transform.position += -shooter.transform.right;
                        avoidChunk = shooter.GetComponent <AI_Follower_Script>().GetChunkUnder();
                        if (avoidChunk.impassable == false)
                        {
                            if (Physics.Raycast(shooter.transform.position + up1, shooter.transform.forward, out hit, 1.5f))
                            {
                                if (hit.collider.tag == ("Tall Cover"))
                                {
                                    Debug.Log("Attempted and hit cover still");
                                    Debug.Log("Hit Tall Cover");
                                    shot = false;
                                    shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                                    StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                                    break;
                                }
                                else
                                {
                                    ShootRound(target, shooter, shooter.transform.position);
                                    newPos = shooter.transform.position;
                                    Debug.Log("Attempted and didn't hit cover");
                                    shooter.transform.position += shooter.transform.right;
                                    break;
                                }
                            }
                            else
                            {
                                ShootRound(target, shooter, shooter.transform.position);
                                newPos = shooter.transform.position;
                                Debug.Log("Attempted and didn't hit cover");
                                shooter.transform.position += shooter.transform.right;
                                break;
                            }
                        }
                    }
                    else
                    {
                        Debug.Log("Hit Tall Cover");
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        shot   = false;
                        newPos = shooterUnit.transform.position;
                        break;
                    }
                }
                else if (h.collider.tag == "Low Cover")
                {
                    if (Vector3.Distance(target.transform.position, h.transform.position) <= 0.5)
                    {
                        Debug.Log("Hit Low Cover");
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        shot   = false;
                        newPos = shooterUnit.transform.position;
                        break;
                    }
                    else if (Vector3.Distance(target.transform.position, h.transform.position) <= 1.5)
                    {
                        if (target.tag == "Good Guy" || target.tag == "Bad Guy")
                        {
                            Debug.Log("Hit Low Cover");
                            shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                            StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                            shot   = false;
                            newPos = shooterUnit.transform.position;
                            break;
                        }
                        else if (distance - Vector3.Distance(shooter.transform.position, h.transform.position) <= 0.5 && target.tag == "Low Cover")
                        {
                            Debug.Log("Hit Low Cover");
                            shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                            StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                            shot   = false;
                            newPos = shooterUnit.transform.position;
                            break;
                        }
                        else
                        {
                            Debug.Log("Went Over Low Cover");
                        }
                    }
                    else if (target.transform == h.collider.gameObject.transform)
                    {
                        Debug.Log("Hit Low Cover");
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        shot   = false;
                        newPos = shooterUnit.transform.position;
                        break;
                    }
                    else
                    {
                        Debug.Log("Went Over Low Cover");
                    }
                }
                else if (h.collider.tag == "Good Guy")
                {
                    if (shooter.tag == "Bad Guy")
                    {
                        if (target == h.collider.gameObject)
                        {
                            shot        = true;
                            damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>();
                        }
                    }
                }
                else if (h.collider.tag == "Bad Guy")
                {
                    if (shooter.tag == "Good Guy")
                    {
                        if (target == h.collider.gameObject)
                        {
                            shot        = true;
                            damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>();
                        }
                    }
                }
            }
        }
        if (shot == true)
        {
            shooterUnit.DealDamage(damagedUnit);
            Debug.Log("Hit Unit");
            newPos = shooterUnit.transform.position;
        }

        return(newPos);
    }
    // Update is called once per frame
    void Update()
    {
        if (turnScript.currentTeam == 0)
        {
            if (Input.GetMouseButtonDown(1))
            {
                if (selectedObject != null)
                {
                    if (selectedObject.GetComponent <MeshRenderer>() != null)
                    {
                        selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag);
                    }
                    selectedObject = null;
                }

                Ray        ray = mainCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;

                if (Physics.Raycast(ray, out hit))
                {
                    if (aiEntity.GetComponent <AI_Follower_Script>().GetActions() > 0)
                    {
                        if (hit.collider.CompareTag("Chunk"))
                        {
                            SetGrid();
                            endChunk = hit.collider.gameObject.GetComponent <Chunk_Script>();

                            if (!endChunk.impassable && !endChunk.lowCover)
                            {
                                path = FindPath(endChunk.gameObject);
                                if (path != null)
                                {
                                    path = CalculatePath(endChunk);
                                    MoveUnit(path);
                                    cameraTrolley.transform.position = endChunk.transform.position;
                                    aiEntity.GetComponent <AI_Follower_Script>().TakeAction(1);
                                    if (aiEntity.GetComponent <AI_Follower_Script>().animManager.anim.GetBool("Running") == false)
                                    {
                                        aiEntity.GetComponent <AI_Follower_Script>().animManager.Run(true);
                                        aiEntity.GetComponent <AudioSource>().Play();
                                    }
                                    if (selectedObject != null)
                                    {
                                        selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag);
                                    }
                                    foreach (Chunk_Script cs in GetNeighbourList(endChunk))
                                    {
                                        if (cs.lowCover)
                                        {
                                            aiEntity.GetComponent <AI_Follower_Script>().animManager.Crouch(true);
                                            aiEntity.GetComponent <AI_Follower_Script>().crouching = true;
                                            break;
                                        }
                                        else
                                        {
                                            aiEntity.GetComponent <AI_Follower_Script>().crouching = false;
                                            aiEntity.GetComponent <AI_Follower_Script>().animManager.Crouch(false);
                                        }
                                    }
                                    renderer.enabled = false;
                                }
                            }
                        }
                        else if (hit.collider.CompareTag("Tall Cover") || hit.collider.CompareTag("Low Cover"))
                        {
                            float distance = Vector3.Distance(hit.collider.gameObject.transform.position, aiEntity.transform.position);
                            if (distance < aiEntity.GetComponent <AI_Follower_Script>().maxRange)
                            {
                                cameraTrolley.transform.position = hit.collider.gameObject.transform.position;
                                if (selectedObject == null)
                                {
                                    selectedObject = hit.collider.gameObject;
                                    selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial("Selected");
                                }
                                else
                                {
                                    selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag);
                                    selectedObject = hit.collider.gameObject;
                                    selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial("Selected");
                                }
                                Vector3[] positions = new Vector3[] {
                                    aiEntity.transform.position,
                                    selectedObject.transform.position
                                };
                                renderer.SetPositions(positions);
                                renderer.enabled = true;
                                shooter.ShowButton(true);
                            }
                        }
                        else if (hit.collider.CompareTag("Good Guy"))
                        {
                            if (aiEntity.GetComponent <AI_Follower_Script>().turnScript.currentTeam == 1)
                            {
                                float distance = Vector3.Distance(hit.collider.gameObject.transform.position, aiEntity.transform.position);
                                if (distance < aiEntity.GetComponent <AI_Follower_Script>().maxRange)
                                {
                                    cameraTrolley.transform.position = hit.collider.gameObject.transform.position;
                                    if (selectedObject == null)
                                    {
                                        selectedObject = hit.collider.gameObject;
                                    }
                                    else
                                    {
                                        selectedObject = hit.collider.gameObject;
                                    }
                                    Vector3[] positions = new Vector3[] {
                                        aiEntity.transform.position,
                                        selectedObject.transform.position
                                    };
                                    renderer.SetPositions(positions);
                                    renderer.enabled = true;
                                    shooter.ShowButton(true);
                                }
                            }
                        }
                        else if (hit.collider.CompareTag("Bad Guy"))
                        {
                            if (aiEntity.GetComponent <AI_Follower_Script>().turnScript.currentTeam == 0)
                            {
                                float distance = Vector3.Distance(hit.collider.gameObject.transform.position, aiEntity.transform.position);
                                if (distance < aiEntity.GetComponent <AI_Follower_Script>().maxRange)
                                {
                                    cameraTrolley.transform.position = hit.collider.gameObject.transform.position;
                                    if (selectedObject == null)
                                    {
                                        selectedObject = hit.collider.gameObject;
                                    }
                                    else
                                    {
                                        selectedObject = hit.collider.gameObject;
                                    }
                                    Vector3[] positions = new Vector3[] {
                                        aiEntity.transform.position,
                                        selectedObject.transform.position
                                    };
                                    renderer.SetPositions(positions);
                                    renderer.enabled = true;
                                    shooter.ShowButton(true);
                                }
                            }
                        }
                        else
                        {
                            selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag);
                            renderer.enabled = false;
                        }
                    }
                }
            }

            if (Input.GetMouseButtonDown(0))
            {
                Ray        ray = mainCamera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider.CompareTag("Good Guy"))
                    {
                        if (turnScript.currentTeam == 0 && aiEntity.GetComponent <AI_Follower_Script>().GetActions() != 1)
                        {
                            aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(false);
                            aiEntity = hit.collider.gameObject;
                            turnScript.CheckVisibleEnemies();
                            cameraTrolley.transform.position = aiEntity.transform.position;
                            DistanceTemplate();
                            aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true);
                        }
                        else
                        {
                            cameraTrolley.transform.position = aiEntity.transform.position;
                            aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true);
                        }
                    }
                    else if (hit.collider.CompareTag("Bad Guy"))
                    {
                        if (turnScript.currentTeam == 1 && aiEntity.GetComponent <AI_Follower_Script>().GetActions() != 1)
                        {
                            aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(false);
                            aiEntity = hit.collider.gameObject;
                            turnScript.CheckVisibleEnemies();
                            cameraTrolley.transform.position = aiEntity.transform.position;
                            DistanceTemplate();
                            aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true);
                        }
                        else
                        {
                            cameraTrolley.transform.position = aiEntity.transform.position;
                            aiEntity.GetComponent <AI_Follower_Script>().weaponRange.SetActive(true);
                        }
                    }
                    else
                    {
                        if (selectedObject != null && (selectedObject.tag != "Bad Guy" && selectedObject.tag != "Good Guy"))
                        {
                            selectedObject.GetComponent <MeshRenderer>().material = materialContainer.FindMaterial(selectedObject.tag);
                        }
                        renderer.enabled = false;
                    }
                }
            }
        }
    }
    private List <Chunk_Script> FindTemplate()
    {
        Vector3    raycastPoint = new Vector3(0, 0.2f, 0);
        Ray        ray          = new Ray(aiEntity.transform.position + raycastPoint, -aiEntity.transform.up);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.CompareTag("Chunk"))
            {
                startChunk = hit.collider.gameObject.GetComponent <Chunk_Script>();
            }
        }

        foreach (Chunk_Script cs in visibleTemplate)
        {
            cs.gameObject.GetComponentInChildren <MeshRenderer>().enabled = false;
        }

        openPath        = new List <Chunk_Script>();
        closedPath      = new List <Chunk_Script>();
        visibleTemplate = new List <Chunk_Script>();

        openPath.Add(startChunk);

        startChunk.gCost = 0;
        startChunk.CalcFCost();

        while (openPath.Count > 0)
        {
            Chunk_Script currentChunk = GetLowestFCost(openPath);

            openPath.Remove(currentChunk);
            closedPath.Add(currentChunk);

            foreach (Chunk_Script neighbour in GetNeighbourList(currentChunk))
            {
                if (closedPath.Contains(neighbour))
                {
                    continue;
                }

                if (neighbour != null)
                {
                    int tentativeGCost = currentChunk.gCost + CalculateDistanceCost(currentChunk, neighbour);
                    if (tentativeGCost < neighbour.gCost && tentativeGCost <= aiEntity.GetComponent <AI_Follower_Script>().maxDistance)
                    {
                        if (!neighbour.impassable)
                        {
                            neighbour.fromChunk = currentChunk;
                            neighbour.gCost     = tentativeGCost;
                            neighbour.CalcFCost();

                            if (!openPath.Contains(neighbour))
                            {
                                openPath.Add(neighbour);
                                visibleTemplate.Add(neighbour);
                                neighbour.GetComponentInChildren <MeshRenderer>().enabled = true;
                            }
                        }
                    }
                }
            }
        }

        return(null);
    }
    public List <Chunk_Script> FindPathAI(GameObject endChunk, GameObject unit)
    {
        Vector3    raycastPoint = new Vector3(0, 0.2f, 0);
        Ray        ray          = new Ray(unit.transform.position + raycastPoint, -unit.transform.up);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider.CompareTag("Chunk"))
            {
                startChunk = hit.collider.gameObject.GetComponent <Chunk_Script>();
            }
        }

        openPath   = new List <Chunk_Script>();
        closedPath = new List <Chunk_Script>();

        openPath.Add(startChunk);

        startChunk.gCost = 0;
        startChunk.hCost = CalculateDistanceCost(startChunk, endChunk.GetComponent <Chunk_Script>());
        startChunk.CalcFCost();

        while (openPath.Count > 0)
        {
            Chunk_Script currentChunk = GetLowestFCost(openPath);
            if (currentChunk == endChunk.GetComponent <Chunk_Script>())
            {
                return(closedPath);
            }
            //else if(currentChunk.gCost >= unit.GetComponent<AI_Follower_Script>().maxDistance)
            //{
            //    closedPath.RemoveAt(closedPath.Count - 1);
            //    return closedPath;
            //}

            openPath.Remove(currentChunk);
            closedPath.Add(currentChunk);

            foreach (Chunk_Script neighbour in GetNeighbourList(currentChunk))
            {
                if (closedPath.Contains(neighbour))
                {
                    continue;
                }

                if (neighbour != null)
                {
                    int tentativeGCost = currentChunk.gCost + CalculateDistanceCost(currentChunk, neighbour);
                    if (tentativeGCost <= neighbour.gCost)
                    {
                        if (!neighbour.impassable)
                        {
                            neighbour.fromChunk = currentChunk;
                            neighbour.gCost     = tentativeGCost;
                            neighbour.hCost     = CalculateDistanceCost(neighbour, endChunk.GetComponent <Chunk_Script>());
                            neighbour.CalcFCost();

                            if (!openPath.Contains(neighbour))
                            {
                                openPath.Add(neighbour);
                            }
                        }
                    }
                }
            }
        }

        return(null);
    }