// Constrói o caminho até o ponto de destino usando a matriz de parentesco public void DrawPath(Vector2Int goal) { TileManager.singleton.ClearPathInstances(); path.Clear(); // Posições Vector2Int previous = goal; Vector2Int cur = movements.parent[goal.x - movements.startRow, goal.y - movements.startCol]; // Direções VoxelData.MoveDirection previousDir; VoxelData.MoveDirection curDir; Vector2Int dir; // Calcula direção para posicionar seta dir = new Vector2Int(previous.x - cur.x, previous.y - cur.y); // Insere destino ao caminho path.Push(dir); // Instancia seta no mapa e define primeira direção curDir = VoxelData.GetDirectionIndex(dir); TileManager.singleton.InstantiatePathTile(previous, curDir, TileManager.PathEnum.Arrow); while (!(cur.x == -1 && cur.y == -1)) { // Atualiza posições previous = cur; cur = movements.parent[previous.x - movements.startRow, previous.y - movements.startCol]; // Critério de parada if (!(cur.x == -1 && cur.y == -1)) { // Calcula direção em formato de vetor e recebe o índice correspondente previousDir = curDir; dir = new Vector2Int(previous.x - cur.x, previous.y - cur.y); curDir = VoxelData.GetDirectionIndex(dir); // Avalia qual será o tile utilizado na posição "previous" if (previousDir == curDir) { TileManager.singleton.InstantiatePathTile(previous, previousDir, TileManager.PathEnum.Line); } else { VoxelData.MoveDirection tileDir = VoxelData.GetCurveDirection(previousDir, curDir); TileManager.singleton.InstantiatePathTile(previous, tileDir, TileManager.PathEnum.Curve); } // Armazena posição atual na pilha path.Push(dir); } } }