Example #1
0
        private void OnDrawGizmos()
        {
            if (m_Grid == null)
            {
                return;
            }
            foreach (Node node in m_Grid.EnumerableAllNodes())
            {
                if (node.NextNode == null)
                {
                    continue;
                }

                if (node.IsOccupied)
                {
                    Gizmos.color = Color.black;
                    Gizmos.DrawSphere(node.Position, 0.5f);
                    continue;
                }
                Gizmos.color = Color.red;
                Vector3 start = node.Position;
                Vector3 end   = node.NextNode.Position;

                Vector3 dir = end - start;
                start -= dir * 0.25f;
                end   -= dir * 0.75f;

                Gizmos.DrawLine(start, end);
                Gizmos.DrawSphere(end, 0.1f);
            }
        }
        public void UpdateField()
        {
            foreach (Node node in m_Grid.EnumerableAllNodes())
            {
                node.ResetWeight();
                node.m_OccupationAvailability = OccupationAvailability.Undefined;
            }


            Queue <Vector2Int> queue = new Queue <Vector2Int>();

            queue.Enqueue(m_Target);
            m_Grid.GetNode(m_Target).PathWeight = 0f;

            Node currentNode;

            while (queue.Count > 0)
            {
                Vector2Int current = queue.Dequeue();
                currentNode = m_Grid.GetNode(current);

                foreach (Connection neighbour in GetNeighbours(current))
                {
                    Node neighbourNode = m_Grid.GetNode(neighbour.Coordinate);
                    if (currentNode.PathWeight + neighbour.Weight < neighbourNode.PathWeight)
                    {
                        neighbourNode.NextNode   = currentNode;
                        neighbourNode.PathWeight = currentNode.PathWeight + neighbour.Weight;
                        queue.Enqueue(neighbour.Coordinate);
                    }
                }
            }

            foreach (Node node in m_Grid.EnumerableAllNodes())
            {
                node.m_OccupationAvailability = OccupationAvailability.CanOccupy;
            }

            m_Grid.GetNode(m_Start).m_OccupationAvailability = OccupationAvailability.CanNotOccupy;
            currentNode = m_Grid.GetNode(m_Start).NextNode;
            while (currentNode != m_Grid.GetNode(m_Target))
            {
                currentNode.m_OccupationAvailability = OccupationAvailability.Undefined;
                currentNode = currentNode.NextNode;
            }
            m_Grid.GetNode(m_Target).m_OccupationAvailability = OccupationAvailability.CanNotOccupy;
        }