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; }