//public void StartFindReachableArea(Vector3 _startPos, float _range)
    //{
    //    StartCoroutine(FindReachableArea(_startPos, _range));
    //}

    IEnumerator FindPath(Vector3 startPos, Vector3 endPos)
    {
        Vector3[] nodePositions = new Vector3[0];
        bool      pathFound     = false;

        Node startNode = m_Grid.NodeFromWorldPoint(startPos);
        Node endNode   = m_Grid.NodeFromWorldPoint(endPos);

        if (startNode.m_Passable && endNode.m_Passable)
        {
            Heap <Node>    frontier = new Heap <Node>(m_Grid.NumberOfNodes);
            HashSet <Node> explored = new HashSet <Node>();
            frontier.AddItem(startNode);

            while (frontier.Count > 0)
            {
                Node node = frontier.FetchFirst();
                explored.Add(node);

                if (node == endNode)
                {
                    pathFound = true;
                    break;
                }

                foreach (Node neighbour in m_Grid.GetNeighbours(node))
                {
                    if (!neighbour.m_Passable || explored.Contains(neighbour))
                    {
                        continue;
                    }

                    int movementCost = node.m_GCost + GetDistance(node, neighbour) + neighbour.m_MovementPenaly;

                    if (movementCost < neighbour.m_GCost || !frontier.ContainsItem(neighbour))
                    {
                        neighbour.m_GCost  = movementCost;
                        neighbour.m_HCost  = GetDistance(neighbour, endNode);
                        neighbour.m_Parent = node;

                        if (!frontier.ContainsItem(neighbour))
                        {
                            frontier.AddItem(neighbour);
                            frontier.UpdateItem(neighbour);
                        }
                    }
                }
            }
        }

        yield return(null);

        if (pathFound)
        {
            nodePositions = RetracePath(startNode, endNode);
        }
        m_PathRequestHandler.FinishedSearchingForPath(nodePositions, pathFound);
    }