/// <summary>
    /// Renders a hidden door that matches the texture of the wall around it
    /// </summary>
    /// <param name="dc">Dc.</param>
    /// <param name="textureIndex">Texture index.</param>
    static void RenderHiddenDoor(DoorControl dc, int textureIndex)
    {
        //move the secret door to the bottom so I can match the uvs properly. I think
        dc.transform.position = new Vector3(dc.transform.position.x, 0f, dc.transform.position.z);

        textureIndex = GameWorldController.instance.currentTileMap().texture_map[textureIndex];
        //Draw a cube with no slopes.
        int NumberOfVisibleFaces = 6;

        //Allocate enough verticea and UVs for the faces
        Vector3[] verts = new Vector3[6 * 4];
        Vector2[] uvs   = new Vector2[6 * 4];
        int       tileX = dc.objInt().tileX;
        int       tileY = dc.objInt().tileY;

        if (tileX == TileMap.ObjectStorageTile)
        {
            return;
        }
        //int iDC_Floorheight=GameWorldController.instance.currentTileMap().Tiles[tileX,tileY].floorHeight;
        float Top         = GameWorldController.instance.currentTileMap().Tiles[tileX, tileY].floorHeight + 7;             // 7f; //- iDC_Floorheight;
        float Bottom      = GameWorldController.instance.currentTileMap().Tiles[tileX, tileY].floorHeight;                 //=-16f;//- iDC_Floorheight; //GameWorldController.instance.currentTileMap().Tiles[tileX,tileY].floorHeight;
        float floorHeight = (float)(Top * 0.15f);
        float baseHeight  = (float)(Bottom * 0.15f);
        float dimX        = 1;
        float dimY        = 1;


        float doorwidth      = 0.8f;
        float doorframewidth = 1.2f;
        float doorSideWidth  = (doorframewidth - doorwidth) / 2f;
        //float doorheight = 7f * 0.15f;
        //Uv ratios across the x axis of the door
        float uvXPos1 = 0f;
        float uvXPos2 = uvXPos1 + doorSideWidth / 1.2f;
        float uvXPos3 = uvXPos2 + doorwidth / 1.2f;
        //float uvXPos4 = 1f; // or 1.2f/1.2f

        //Now create the mesh
        GameObject Tile = new GameObject(dc.name + "_Model");

        Tile.layer = LayerMask.NameToLayer("MapMesh");

        Tile.transform.parent        = dc.transform;
        Tile.transform.localPosition = Vector3.zero;

        Tile.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
        MeshFilter   mf = Tile.AddComponent <MeshFilter>();
        MeshRenderer mr = Tile.AddComponent <MeshRenderer>();
        //MeshCollider mc = Tile.AddComponent<MeshCollider>();
        //mc.sharedMesh=null;
        Mesh mesh = new Mesh();

        mesh.subMeshCount = NumberOfVisibleFaces;                      //Should be no of visible faces

        Material[] MatsToUse = new Material[NumberOfVisibleFaces];
        //Now allocate the visible faces to triangles.
        int   FaceCounter = 0;                    //Tracks which number face we are now on.
        float PolySize    = Top - Bottom;
        float uv0         = (float)(Bottom * 0.125f);
        float uv1         = (PolySize / 8.0f) + (uv0);

        for (int i = 0; i < 6; i++)
        {
            switch (i)
            {
            case vTOP:
            {
                //Set the verts
                MatsToUse[FaceCounter] = GameWorldController.instance.MaterialMasterList[textureIndex];

                verts[0 + (4 * FaceCounter)] = new Vector3(0.0f, -0.02f, floorHeight);
                verts[1 + (4 * FaceCounter)] = new Vector3(0.0f, 0.02f, floorHeight);
                verts[2 + (4 * FaceCounter)] = new Vector3(-doorwidth, 0.02f, floorHeight);
                verts[3 + (4 * FaceCounter)] = new Vector3(-doorwidth, -0.02f, floorHeight);

                //Allocate UVs
                uvs[0 + (4 * FaceCounter)] = new Vector2(0.0f, 1.0f * dimY);
                uvs[1 + (4 * FaceCounter)] = new Vector2(0.0f, 0.0f);
                uvs[2 + (4 * FaceCounter)] = new Vector2(1.0f * dimX, 0.0f);
                uvs[3 + (4 * FaceCounter)] = new Vector2(1.0f * dimX, 1.0f * dimY);

                break;
            }

            case vNORTH:
            {
                //north wall vertices
                MatsToUse[FaceCounter]       = GameWorldController.instance.MaterialMasterList[textureIndex];
                verts[0 + (4 * FaceCounter)] = new Vector3(-doorwidth, 0.02f, baseHeight);
                verts[1 + (4 * FaceCounter)] = new Vector3(-doorwidth, 0.02f, floorHeight);
                verts[2 + (4 * FaceCounter)] = new Vector3(0f, 0.02f, floorHeight);
                verts[3 + (4 * FaceCounter)] = new Vector3(0f, 0.02f, baseHeight);

                uvs[0 + (4 * FaceCounter)] = new Vector2(uvXPos2, uv0);
                uvs[1 + (4 * FaceCounter)] = new Vector2(uvXPos2, uv1);
                uvs[2 + (4 * FaceCounter)] = new Vector2(uvXPos3, uv1);
                uvs[3 + (4 * FaceCounter)] = new Vector2(uvXPos3, uv0);


                break;
            }

            case vWEST:
            {
                //west wall vertices
                MatsToUse[FaceCounter]       = GameWorldController.instance.MaterialMasterList[textureIndex];
                verts[0 + (4 * FaceCounter)] = new Vector3(0f, +0.02f, baseHeight);
                verts[1 + (4 * FaceCounter)] = new Vector3(0f, +0.02f, floorHeight);
                verts[2 + (4 * FaceCounter)] = new Vector3(0f, -0.02f, floorHeight);
                verts[3 + (4 * FaceCounter)] = new Vector3(0f, -0.02f, baseHeight);
                uvs[0 + (4 * FaceCounter)]   = new Vector2(uvXPos2, uv0);
                uvs[1 + (4 * FaceCounter)]   = new Vector2(uvXPos2, uv1);
                uvs[2 + (4 * FaceCounter)]   = new Vector2(uvXPos3, uv1);
                uvs[3 + (4 * FaceCounter)]   = new Vector2(uvXPos3, uv0);

                break;
            }

            case vEAST:
            {
                //east wall vertices
                MatsToUse[FaceCounter]       = GameWorldController.instance.MaterialMasterList[textureIndex];
                verts[0 + (4 * FaceCounter)] = new Vector3(-doorwidth, -0.02f, baseHeight);
                verts[1 + (4 * FaceCounter)] = new Vector3(-doorwidth, -0.02f, floorHeight);
                verts[2 + (4 * FaceCounter)] = new Vector3(-doorwidth, +0.02f * dimY, floorHeight);
                verts[3 + (4 * FaceCounter)] = new Vector3(-doorwidth, +0.02f * dimY, baseHeight);
                uvs[0 + (4 * FaceCounter)]   = new Vector2(uvXPos2, uv0);
                uvs[1 + (4 * FaceCounter)]   = new Vector2(uvXPos2, uv1);
                uvs[2 + (4 * FaceCounter)]   = new Vector2(uvXPos3, uv1);
                uvs[3 + (4 * FaceCounter)]   = new Vector2(uvXPos3, uv0);

                break;
            }

            case vSOUTH:
            {
                MatsToUse[FaceCounter] = GameWorldController.instance.MaterialMasterList[textureIndex];
                //south wall vertices
                verts[0 + (4 * FaceCounter)] = new Vector3(0f, -0.02f, baseHeight);
                verts[1 + (4 * FaceCounter)] = new Vector3(0f, -0.02f, floorHeight);
                verts[2 + (4 * FaceCounter)] = new Vector3(-doorwidth, -0.02f, floorHeight);
                verts[3 + (4 * FaceCounter)] = new Vector3(-doorwidth, -0.02f, baseHeight);
                uvs[0 + (4 * FaceCounter)]   = new Vector2(uvXPos2, uv0);
                uvs[1 + (4 * FaceCounter)]   = new Vector2(uvXPos2, uv1);
                uvs[2 + (4 * FaceCounter)]   = new Vector2(uvXPos3, uv1);
                uvs[3 + (4 * FaceCounter)]   = new Vector2(uvXPos3, uv0);

                break;
            }

            case vBOTTOM:
            {
                //bottom wall vertices
                MatsToUse[FaceCounter]       = GameWorldController.instance.MaterialMasterList[textureIndex];
                verts[0 + (4 * FaceCounter)] = new Vector3(0f, 1.2f * dimY, baseHeight);
                verts[1 + (4 * FaceCounter)] = new Vector3(0f, 0f, baseHeight);
                verts[2 + (4 * FaceCounter)] = new Vector3(-1.2f * dimX, 0f, baseHeight);
                verts[3 + (4 * FaceCounter)] = new Vector3(-1.2f * dimX, 1.2f * dimY, baseHeight);
                //Change default UVs
                uvs[0 + (4 * FaceCounter)] = new Vector2(0.0f, 0.0f);
                uvs[1 + (4 * FaceCounter)] = new Vector2(0.0f, 1.0f * dimY);
                uvs[2 + (4 * FaceCounter)] = new Vector2(dimX, 1.0f * dimY);
                uvs[3 + (4 * FaceCounter)] = new Vector2(dimX, 0.0f);
                break;
            }
            }
            FaceCounter++;
        }

        //Apply the uvs and create my tris
        mesh.vertices = verts;
        mesh.uv       = uvs;
        FaceCounter   = 0;
        int [] tris = new int[6];
        for (int i = 0; i < 6; i++)
        {
            tris[0] = 0 + (4 * FaceCounter);
            tris[1] = 1 + (4 * FaceCounter);
            tris[2] = 2 + (4 * FaceCounter);
            tris[3] = 0 + (4 * FaceCounter);
            tris[4] = 2 + (4 * FaceCounter);
            tris[5] = 3 + (4 * FaceCounter);
            mesh.SetTriangles(tris, FaceCounter);
            FaceCounter++;
        }

        mr.materials = MatsToUse;                       //mats;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        mf.mesh = mesh;
        //mc.sharedMesh=mesh;

        //MeshCollider nmc =dc.gameObject.AddComponent<MeshCollider>();
        //nmc.isTrigger=false;
        //nmc.sharedMesh=mesh;
        float ResolutionZ = 128.0f;
        float ceil        = GameWorldController.instance.currentTileMap().CEILING_HEIGHT;
        int   newZpos     = GameWorldController.instance.currentTileMap().Tiles[dc.objInt().tileX, dc.objInt().tileY].floorHeight * 4;
        float BrushZ      = 15f;
        float offZ        = ((newZpos / ResolutionZ) * (ceil)) * BrushZ;

        offZ = offZ / 100.0f;
        BoxCollider bx = dc.GetComponent <BoxCollider>();

        bx.center = new Vector3(-0.4f, 0, 0.525f + offZ);
        bx.size   = new Vector3(0.8f, 0.04f, 1.05f);
    }
Exemplo n.º 2
0
 // Use this for initialization
 void Start()
 {
     status = controlPanel.GetComponent <DoorControl>().pressed;
     Anim   = GetComponent <Animator>();
 }