Esempio n. 1
0
 public float checkTrav(float posx, float posz)
 {
     return(terrainInfo.traversability[terrainInfo.get_i_index(posx), terrainInfo.get_j_index(posz)]);
 }
Esempio n. 2
0
    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]);}*/
                }
            }
        }
    }
Esempio n. 3
0
    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);
    }