Exemplo n.º 1
0
    /*public void GenerateTiles()
     * {
     *      Transform tileObject;
     *      int tileObjectIndex = 0;
     *
     *      for(int i = 0; i < planet.m_Tiles.Count; i++)
     *      {
     *              Mesh terrainMesh = new Mesh();
     *              int verticesCount = planet.m_Tiles[i].m_Polygons.Count * 3;
     *              Vector3[] vertices = new Vector3[verticesCount];
     *              int[][] indices = new int[m_MaterialsCount][];
     *              for(int j = 0; j < m_MaterialsCount; j++) indices[j] = new int[verticesCount];      //zoptymalizować!
     *
     *              for(int j = 0; j < planet.m_Tiles[i].m_Polygons.Count; j++)
     *              {
     *                      indices[planet.m_Tiles[i].m_Polygons[j].m_MaterialIndex][j * 3 + 0] = j * 3 + 0;
     *                      indices[planet.m_Tiles[i].m_Polygons[j].m_MaterialIndex][j * 3 + 1] = j * 3 + 1;
     *                      indices[planet.m_Tiles[i].m_Polygons[j].m_MaterialIndex][j * 3 + 2] = j * 3 + 2;
     *                      vertices[j * 3 + 0] = planet.m_Tiles[i].m_Vertices[planet.m_Tiles[i].m_Polygons[j].m_Vertices[0]];
     *                      vertices[j * 3 + 1] = planet.m_Tiles[i].m_Vertices[planet.m_Tiles[i].m_Polygons[j].m_Vertices[1]];
     *                      vertices[j * 3 + 2] = planet.m_Tiles[i].m_Vertices[planet.m_Tiles[i].m_Polygons[j].m_Vertices[2]];
     *              }
     *
     *              terrainMesh.vertices = vertices;
     *              terrainMesh.subMeshCount = m_MaterialsCount;
     *              for(int j = 0; j < m_MaterialsCount; j++)
     *              {
     *                      terrainMesh.SetTriangles(indices[j], j);
     *              }
     *              //terrainMesh.SetTriangles(indices, 0);
     *              terrainMesh.RecalculateNormals();
     *
     *              tileObject = Instantiate(m_TilePrefab, transform, false);
     *              tileObject.name = "Tile" + (tileObjectIndex++).ToString();
     *              tileObject.GetComponent<MeshFilter>().mesh = terrainMesh;
     *              tileObject.GetComponent<MeshCollider>().sharedMesh = terrainMesh;
     *      }
     * }*/

    public void CreateGameObject()
    {
        Sphere planet = new Sphere(0);

        planet.CreateIcosphere(m_PlanetToTilesSubdivides, m_TileToPolygonsSubdivides);

        GameObject planetObject = new GameObject();

        planetObject.name = planetName;

        var mat = AssetDatabase.GetBuiltinExtraResource <Material>("Default-Diffuse.mat");

        for (int i = 0; i < planet.m_Tiles.Count; i++)
        {
            Mesh      terrainMesh   = new Mesh();
            int       verticesCount = planet.m_Tiles[i].m_Polygons.Count * 3;
            Vector3[] vertices      = new Vector3[verticesCount];
            int[]     indices       = new int[verticesCount];

            for (int j = 0; j < planet.m_Tiles[i].m_Polygons.Count; j++)
            {
                indices[j * 3 + 0]  = j * 3 + 0;
                indices[j * 3 + 1]  = j * 3 + 1;
                indices[j * 3 + 2]  = j * 3 + 2;
                vertices[j * 3 + 0] = planet.m_Tiles[i].m_Vertices[planet.m_Tiles[i].m_Polygons[j].m_Vertices[0]];
                vertices[j * 3 + 1] = planet.m_Tiles[i].m_Vertices[planet.m_Tiles[i].m_Polygons[j].m_Vertices[1]];
                vertices[j * 3 + 2] = planet.m_Tiles[i].m_Vertices[planet.m_Tiles[i].m_Polygons[j].m_Vertices[2]];
            }

            terrainMesh.vertices = vertices;
            terrainMesh.SetTriangles(indices, 0);
            terrainMesh.RecalculateNormals();

            GameObject tileObject = new GameObject();
            tileObject.transform.SetParent(planetObject.transform);
            tileObject.name = "Tile" + i.ToString();
            tileObject.AddComponent <MeshFilter>();
            tileObject.AddComponent <MeshRenderer>();
            tileObject.AddComponent <MeshCollider>();
            tileObject.GetComponent <MeshFilter>().mesh         = terrainMesh;
            tileObject.GetComponent <MeshRenderer>().material   = mat;
            tileObject.GetComponent <MeshCollider>().sharedMesh = terrainMesh;
        }
        planetObject.transform.localScale = new Vector3(m_Scale, m_Scale, m_Scale);
        Debug.Log("Done");
        Debug.Log("Distance: " + Vector3.Distance(planet.m_Tiles[0].m_Vertices[0], planet.m_Tiles[0].m_Vertices[1]).ToString());
    }