public float checkTrav(float posx, float posz) { return(terrainInfo.traversability[terrainInfo.get_i_index(posx), terrainInfo.get_j_index(posz)]); }
public void makeMap() { terrain_manager = terrain_manager_game_object.GetComponent <TerrainManager>(); print(terrain_manager); terrainInfo = terrain_manager.myInfo; print(terrainInfo); float[, ] traversability = terrainInfo.traversability; terrainInfo = terrain_manager.myInfo; float tileXSize = (terrainInfo.x_high - terrainInfo.x_low) / terrainInfo.x_N; float tileZSize = (terrainInfo.z_high - terrainInfo.z_low) / terrainInfo.z_N; float factor = 4.5f; float[, ] newTerrain = new float[(int)Mathf.Floor(tileXSize * tileXSize / factor), (int)Mathf.Floor(tileZSize * tileZSize / factor)]; stepx = (terrainInfo.x_high - terrainInfo.x_low) / newTerrain.GetLength(0); stepz = (terrainInfo.z_high - terrainInfo.z_low) / newTerrain.GetLength(1); for (int i = 0; i < newTerrain.GetLength(0); i++) { float posx = terrainInfo.x_low + stepx / 2 + stepx * i; for (int j = 0; j < newTerrain.GetLength(1); j++) { float posz = terrainInfo.z_low + stepz / 2 + stepz * j; newTerrain[i, j] = terrainInfo.traversability[terrainInfo.get_i_index(posx), terrainInfo.get_j_index(posz)]; } } int xLen = newTerrain.GetLength(0); int zLen = newTerrain.GetLength(1); nodeIdMatrix = new int[xLen, zLen]; mapGraph = new Graph(); int nodeId; float wallMargin = 2.0f; for (int i = 0; i < xLen; i++) { float posx = terrainInfo.x_low + stepx / 2 + stepx * i; for (int j = 0; j < zLen; j++) { float posz = terrainInfo.z_low + stepz / 2 + stepz * j; if (newTerrain[i, j] == 0.0f && 0.0f == checkTrav(posx, posz + wallMargin) && 0.0f == checkTrav(posx, posz - wallMargin) && 0.0f == checkTrav(posx + wallMargin, posz) && 0.0f == checkTrav(posx - wallMargin, posz)) { /*GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube); * Collider c = cube.GetComponent<Collider> (); * c.enabled = false; * cube.transform.localScale = new Vector3 (0.5f, 0.5f, 0.5f); * cube.transform.position = new Vector3 (posx, 0, posz);*/ nodeIdMatrix[i, j] = mapGraph.addNode(new Node(posx, posz)); mapGraph.getNode(nodeIdMatrix[i, j]).setIndex(i, j); } else { nodeIdMatrix[i, j] = -1; } } } float timeDraw = 1; LayerMask mask = LayerMask.GetMask("Wall"); RaycastHit hit; for (int i = 0; i < xLen; i++) { for (int j = 0; j < zLen; j++) { if (nodeIdMatrix[i, j] != -1) { nodeId = nodeIdMatrix[i, j]; if (nodeIdMatrix[i, j + 1] != -1) { Debug.DrawLine(mapGraph.getNode(nodeId).getPosition(), mapGraph.getNode(nodeIdMatrix[i, j + 1]).getPosition(), Color.cyan, timeDraw); mapGraph.addEdge(nodeId, nodeIdMatrix[i, j + 1]); } if (nodeIdMatrix[i, j - 1] != -1) { Debug.DrawLine(mapGraph.getNode(nodeId).getPosition(), mapGraph.getNode(nodeIdMatrix[i, j - 1]).getPosition(), Color.cyan, timeDraw); mapGraph.addEdge(nodeId, nodeIdMatrix[i, j - 1]); } if (nodeIdMatrix[i + 1, j] != -1) { Debug.DrawLine(mapGraph.getNode(nodeId).getPosition(), mapGraph.getNode(nodeIdMatrix[i + 1, j]).getPosition(), Color.cyan, timeDraw); mapGraph.addEdge(nodeId, nodeIdMatrix[i + 1, j]); } if (nodeIdMatrix[i - 1, j] != -1) { Debug.DrawLine(mapGraph.getNode(nodeId).getPosition(), mapGraph.getNode(nodeIdMatrix[i - 1, j]).getPosition(), Color.cyan, timeDraw); mapGraph.addEdge(nodeId, nodeIdMatrix[i - 1, j]); } Vector3 from = mapGraph.getNode(nodeId).getPosition(); /* * if(nodeIdMatrix[i-1,j-1] != -1 && !Physics.Raycast(from , mapGraph.getNode(nodeIdMatrix[i-1,j-1]).getPosition()-from, out hit,Vector3.Distance(mapGraph.getNode(nodeIdMatrix[i-1,j-1]).getPosition(),from) , mask)){ * Debug.DrawLine(from,mapGraph.getNode(nodeIdMatrix[i-1,j-1]).getPosition(),Color.cyan,timeDraw); * mapGraph.addEdge(nodeId,nodeIdMatrix[i-1,j-1]);} * * * if(nodeIdMatrix[i-1,j+1] != -1 && !Physics.Raycast(from , mapGraph.getNode(nodeIdMatrix[i-1,j+1]).getPosition()-from, out hit,Vector3.Distance(mapGraph.getNode(nodeIdMatrix[i-1,j+1]).getPosition(),from) , mask)){ * Debug.DrawLine(from,mapGraph.getNode(nodeIdMatrix[i-1,j+1]).getPosition(),Color.cyan,timeDraw); * mapGraph.addEdge(nodeId,nodeIdMatrix[i-1,j+1]);} * * * if(nodeIdMatrix[i+1,j-1] != -1 && !Physics.Raycast(from , mapGraph.getNode(nodeIdMatrix[i+1,j-1]).getPosition()-from, out hit,Vector3.Distance(mapGraph.getNode(nodeIdMatrix[i+1,j-1]).getPosition(),from) , mask)){ * Debug.DrawLine(from,mapGraph.getNode(nodeIdMatrix[i+1,j-1]).getPosition(),Color.cyan,timeDraw); * mapGraph.addEdge(nodeId,nodeIdMatrix[i+1,j-1]);} * * * if(nodeIdMatrix[i+1,j+1] != -1 && !Physics.Raycast(from , mapGraph.getNode(nodeIdMatrix[i+1,j+1]).getPosition()-from, out hit,Vector3.Distance(mapGraph.getNode(nodeIdMatrix[i+1,j+1]).getPosition(),from) , mask)){ * Debug.DrawLine(from,mapGraph.getNode(nodeIdMatrix[i+1,j+1]).getPosition(),Color.cyan,timeDraw); * mapGraph.addEdge(nodeId,nodeIdMatrix[i+1,j+1]);}*/ } } } }
public List <Vector3> getV3Path() { int indexI = get_i_index(rawTerrainInfo.get_x_pos(mDFSPath[0].Item1)); int indexJ = get_j_index(rawTerrainInfo.get_z_pos(mDFSPath[0].Item2)); List <Vector3> path = new List <Vector3>(); var neigbour = getNeigbour(indexI, indexJ); int mOffsetType = neigbour[0]; indexI += mOffset[mOffsetType, 0]; indexJ += mOffset[mOffsetType, 1]; path.Add(new Vector3(get_x_pos(indexI), 0f, get_z_pos(indexJ))); traversability[indexI, indexJ] = 1f; remainArea--; int whileCounter = 0; while (remainArea > 0 && whileCounter < 10000) { whileCounter++; neigbour = getNeigbour(indexI, indexJ); if (neigbour.Count == 1) { mOffsetType = neigbour[0]; indexI += mOffset[mOffsetType, 0]; indexJ += mOffset[mOffsetType, 1]; path.Add(new Vector3(get_x_pos(indexI), 0f, get_z_pos(indexJ))); traversability[indexI, indexJ] = 1f; remainArea--; } else if (neigbour.Count > 1) { bool ifAddPoint = false; foreach (var t in neigbour) { int pIndexI_P1 = rawTerrainInfo.get_i_index(get_x_pos(indexI)); int pIndexJ_P1 = rawTerrainInfo.get_j_index(get_z_pos(indexJ)); int pIndexI_P2 = rawTerrainInfo.get_i_index(get_x_pos(indexI + mOffset[t, 0])); int pIndexJ_P2 = rawTerrainInfo.get_j_index(get_z_pos(indexJ + mOffset[t, 1])); if (pIndexI_P1 == pIndexI_P2 && pIndexJ_P1 == pIndexJ_P2) { indexI += mOffset[t, 0]; indexJ += mOffset[t, 1]; mOffsetType = t; path.Add(new Vector3(get_x_pos(indexI), 0f, get_z_pos(indexJ))); traversability[indexI, indexJ] = 1f; remainArea--; ifAddPoint = true; break; } } if (!ifAddPoint && neigbour.Exists(x => x == mOffsetType)) { indexI += mOffset[mOffsetType, 0]; indexJ += mOffset[mOffsetType, 1]; path.Add(new Vector3(get_x_pos(indexI), 0f, get_z_pos(indexJ))); traversability[indexI, indexJ] = 1f; remainArea--; ifAddPoint = true; } } else { break; } } path = splitPath(path); for (int i = 0; i < path.Count; i++) { float ori_center_x = rawTerrainInfo.get_x_pos(rawTerrainInfo.get_i_index(path[i].x)); float ori_center_z = rawTerrainInfo.get_z_pos(rawTerrainInfo.get_j_index(path[i].z)); Vector3 centerV3 = new Vector3(ori_center_x, 0f, ori_center_z); path[i] += (centerV3 - path[i]) * 0.5f; } return(path); }