private void ResetAllWeights() { foreach (Node node in m_Grid.EnumerateAllNodes()) { node.ResetWeight(); } }
public void UpdateField() { foreach (Node node in m_Grid.EnumerateAllNodes()) { node.ResetWeight(); } Queue <Vector2Int> queue = new Queue <Vector2Int>(); queue.Enqueue(m_Target); m_Grid.GetNode(m_Target).PathWeight = 0f; while (queue.Count > 0) { Vector2Int current = queue.Dequeue(); Node currentNode = m_Grid.GetNode(current); float weightToTarget = currentNode.PathWeight; foreach (Connection neighbour in GetNeighbours(current)) { Node neighbourNode = m_Grid.GetNode(neighbour.coordinate); if (weightToTarget + neighbour.weight < neighbourNode.PathWeight) { neighbourNode.NextNode = currentNode; neighbourNode.PathWeight = weightToTarget + neighbour.weight; queue.Enqueue(neighbour.coordinate); } } } RecalculateAvailableFields(); }
public void UpdateField() { foreach (Node node in m_Grid.EnumerateAllNodes()) { node.ResetWeight(); if (!node.IsOccupied) { node.OccupationAvailability = OccupationAvailability.CanOccupy; } else { node.OccupationAvailability = OccupationAvailability.CanNotOccupy; } } Node startNode = m_Grid.GetNode(m_Start); Node targetNode = m_Grid.GetNode(m_Target); startNode.OccupationAvailability = OccupationAvailability.CanNotOccupy; targetNode.OccupationAvailability = OccupationAvailability.CanNotOccupy; Queue <Vector2Int> queue = new Queue <Vector2Int>(); queue.Enqueue(m_Target); m_Grid.GetNode(m_Target).PathWeight = 0f; while (queue.Count > 0) { Vector2Int current = queue.Dequeue(); Node currentNode = m_Grid.GetNode(current); float weightToTarget = m_Grid.GetNode(current).PathWeight; foreach (Connection neighbour in GetNeighbours(current)) { Node neighbourNode = m_Grid.GetNode(neighbour.Coordinate); if (weightToTarget + neighbour.Weight < neighbourNode.PathWeight) { neighbourNode.NextNode = currentNode; neighbourNode.PathWeight = weightToTarget + neighbour.Weight; queue.Enqueue(neighbour.Coordinate); } } } Node wayNode = startNode.NextNode; while (wayNode != targetNode) { wayNode.OccupationAvailability = OccupationAvailability.Undefined; wayNode = wayNode.NextNode; } }
private void OnDrawGizmos() { if (m_Grid == null) { return; } Gizmos.color = Color.red; foreach (Node node in m_Grid.EnumerateAllNodes()) { if (node.NextNode == null) { continue; } if (node.IsOccupied) { Gizmos.color = Color.black; Gizmos.DrawCube(node.Position, new Vector3(m_NodeSize, m_NodeSize, m_NodeSize)); 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); } }
private void OnDrawGizmos() //debug method { if (m_Grid == null) { return; } foreach (Node node in m_Grid.EnumerateAllNodes()) { if (node.NextNode == null) { continue; } /* * if (node.IsOccupied) * { * Gizmos.color = Color.blue; * Gizmos.DrawSphere(node.Position, 0.2f*m_NodeSize); * continue; * } */ if (node.EnemyDatas.Count > 0) { Gizmos.color = Color.magenta; Vector3 center = node.Position; Gizmos.DrawCube(center, Vector3.one); } if (node.OccupationAvailability == OccupationAvailability.CanOccupy) { Gizmos.color = Color.green; } if (node.OccupationAvailability == OccupationAvailability.Undefined) { Gizmos.color = Color.yellow; } if (node.OccupationAvailability == OccupationAvailability.CanNotOccupy) { Gizmos.color = Color.red; } Vector3 start = node.Position; Vector3 end = node.NextNode.Position; Vector3 direction = end - start; start -= direction * 0.25f; end -= direction * 0.75f; Gizmos.DrawLine(start, end); Gizmos.DrawSphere(end, 0.1f * m_NodeSize); } }
public void UpdateField() { foreach (Node node in m_Grid.EnumerateAllNodes()) { node.Reset(); } Queue <Connection> queue = new Queue <Connection>(); queue.Enqueue(new Connection(m_Target, 0)); m_Grid.GetNode(m_Target).PathWeight = 0; while (queue.Count > 0) { Connection current = queue.Dequeue(); Node currentNode = m_Grid.GetNode(current.Coordinate); float weightToTarget = currentNode.PathWeight + current.Weight; foreach (Connection neighbour in GetNeighbours(current.Coordinate)) { Node neighbourNode = m_Grid.GetNode(neighbour.Coordinate); if (weightToTarget < neighbourNode.PathWeight) { neighbourNode.NextNode = currentNode; neighbourNode.PathWeight = weightToTarget; queue.Enqueue(neighbour); } } } Node startNode = m_Grid.GetNode(m_Start); Node targetNode = m_Grid.GetNode(m_Target); startNode.OccupationAvailability = OccupationAvailability.CanNotOccupy; Node nextNode = startNode.NextNode; while (nextNode != targetNode) { nextNode.OccupationAvailability = OccupationAvailability.Undefined; nextNode = nextNode.NextNode; } targetNode.OccupationAvailability = OccupationAvailability.CanNotOccupy; }
public void UpdateField() { foreach (Node node in m_Grid.EnumerateAllNodes()) { node.ResetWeight(); node.m_OccupationAvailability = OccupationAvailability.CanOccupy; } Queue <Vector2Int> queue = new Queue <Vector2Int>(); queue.Enqueue(m_Target); Node start = m_Grid.GetNode(m_Start); Node target = m_Grid.GetNode(m_Target); target.PathWeight = 0f; while (queue.Count > 0) { Vector2Int current = queue.Dequeue(); Node currentNode = m_Grid.GetNode(current); foreach (Connection neighbour in GetNeighbours(current)) { float weightToTarget = currentNode.PathWeight + neighbour.Weight; Node neighbourNode = m_Grid.GetNode(neighbour.Coordinate); if (weightToTarget < neighbourNode.PathWeight) { neighbourNode.NextNode = currentNode; neighbourNode.PathWeight = weightToTarget; queue.Enqueue(neighbour.Coordinate); } } } start.m_OccupationAvailability = OccupationAvailability.CanNotOccupy; target.m_OccupationAvailability = OccupationAvailability.CanNotOccupy; while (start != target && start != null) // rider ругается, но почему? { start = start.NextNode; start.m_OccupationAvailability = OccupationAvailability.Undefined; } }
public void UpdateField() { foreach (Node node in m_Grid.EnumerateAllNodes()) { node.ResetWeight(); node.OccupationAvailability = OccupationAvailability.CanOccupy; } Queue <Connection> queue = new Queue <Connection>(); queue.Enqueue(new Connection(m_Target, 0f)); m_Grid.GetNode(m_Target).PathWeight = 0f; while (queue.Count > 0) { Connection current = queue.Dequeue(); Node currentNode = m_Grid.GetNode(current.coordinate); foreach (Connection neighbour in GetNeighbours(current.coordinate)) { Node neighbourNode = m_Grid.GetNode(neighbour.coordinate); if (current.weight + neighbour.weight < neighbourNode.PathWeight - Mathf.Epsilon) { neighbourNode.NextNode = currentNode; neighbourNode.PathWeight = current.weight + neighbour.weight; queue.Enqueue(new Connection(neighbour.coordinate, neighbourNode.PathWeight)); } } } Node curNode = m_Grid.GetNode(m_Start); curNode.OccupationAvailability = OccupationAvailability.CanNotOccupy; curNode = curNode.NextNode; while (curNode.PositionOnGrid != m_Target) { curNode.OccupationAvailability = OccupationAvailability.Undefined; curNode = curNode.NextNode; } curNode.OccupationAvailability = OccupationAvailability.CanNotOccupy; }
private void OnDrawGizmos() { // Draw gizmo grid foreach (Node node in m_Grid.EnumerateAllNodes()) { if (node.EnemyDatas.Count == 0) { continue; } Gizmos.color = Color.white; Gizmos.DrawWireSphere(node.Position, 1.1f); } Debug.Log(m_Offset); Gizmos.color = Color.black; float height = m_GridHeight * m_NodeSize; float width = m_GridWidth * m_NodeSize; for (int i = 0; i <= m_GridWidth; i++) { Vector3 from = m_Offset + new Vector3(i * m_NodeSize, 0f, 0f); Vector3 to = m_Offset + new Vector3(i * m_NodeSize, 0f, height); Gizmos.DrawLine(from, to); } for (int i = 0; i <= m_GridHeight; i++) { Vector3 from = m_Offset + new Vector3(0f, 0f, i * m_NodeSize); Vector3 to = m_Offset + new Vector3(width, 0f, i * m_NodeSize); Gizmos.DrawLine(from, to); } //Gizmos.DrawSphere(m_Offset, 1f); Gizmos.DrawSphere(m_Grid.GetNode(0, 0).Position, 2f); if (m_Grid == null) { return; } foreach (var node in m_Grid.EnumerateAllNodes()) { if (node.NextNode == null) { continue; } if (node.IsOccupied) { Gizmos.color = Color.black; Gizmos.DrawSphere(node.Position, 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.01f); } }