Пример #1
0
    // Create the ground
    private void PopulateGround(List <Vector3> points)
    {
        GameObject ground = new GameObject();

        ground.transform.parent = transform;
        int          groundMaterialIndex = Random.Range(0, _groundMaterials.Length);
        MeshRenderer groundRendered      = ground.AddComponent <MeshRenderer>();

        groundRendered.material = _groundMaterials[groundMaterialIndex];
        ground.transform.name   = "Ground" + groundRendered.material.name;
        ground.tag = "Ground";
        MeshCollider groundCollider   = ground.AddComponent <MeshCollider>();
        MeshFilter   groundMeshFilter = ground.AddComponent <MeshFilter>();
        PlaneRange   range            = new PlaneRange(0, 1f, 0, 0, 0, 1f);

        if (_missingFloor)
        {
            // TODO: Change to only render floor that exists
            groundMeshFilter.mesh = MeshTools.CreateMeshFromVectors(points, range);
        }
        else
        {
            groundMeshFilter.mesh = MeshTools.CreateMeshFromVectors(points, range);
        }
        groundCollider.sharedMesh = groundMeshFilter.mesh;
    }
Пример #2
0
    /*
     * Add a ceiling to the room
     */
    public void AddCeiling()
    {
        GameObject ceiling = new GameObject();

        ceiling.transform.parent = transform;
        int          ceilingMaterialIndex = Random.Range(0, _ceilingMaterials.Length);
        MeshRenderer ceilingRendered      = ceiling.AddComponent <MeshRenderer>();

        ceilingRendered.material = _ceilingMaterials[ceilingMaterialIndex];
        ceiling.transform.name   = "Ceiling" + ceilingRendered.material.name;
        MeshCollider   ceilingCollider   = ceiling.AddComponent <MeshCollider>();
        MeshFilter     ceilingMeshFilter = ceiling.AddComponent <MeshFilter>();
        List <Vector3> ceilingPoints     = new List <Vector3>();
        LineRange      groundRangeX      = _ground.GetXRange();
        LineRange      groundRangeZ      = _ground.GetZRange();

        ceilingPoints.Add(new Vector3(groundRangeX.max * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.min * _wall.GetWallShrink()));
        ceilingPoints.Add(new Vector3(groundRangeX.min * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.min * _wall.GetWallShrink()));
        ceilingPoints.Add(new Vector3(groundRangeX.min * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.max * _wall.GetWallShrink()));
        ceilingPoints.Add(new Vector3(groundRangeX.max * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.max * _wall.GetWallShrink()));

        PlaneRange ceilingRange = new PlaneRange(
            0, 1,
            0, 0,
            0, 1
            );

        ceilingMeshFilter.mesh = MeshTools.CreateMeshFromVectors(ceilingPoints, ceilingRange);

        ceilingCollider.sharedMesh = ceilingMeshFilter.mesh;
    }
Пример #3
0
    /*
     * Creates a Mesh plane from the points
     * The plane range allows the texture mapping to be aplied.
     */
    public static Mesh CreateMeshFromVectors(List <Vector3> points, PlaneRange planeRange)
    {
        List <int>     tris = new List <int>();     // Every 3 ints represents a triangle in the ploygon
        List <Vector2> uvs  = new List <Vector2>(); // Vertex position in 0-1 UV space (The material)

        int   half     = points.Count / 2;
        float realHalf = points.Count / 2f;

        for (int i = 1; i < half; i++)
        {
            tris.Add(i);
            tris.Add(points.Count - i);
            tris.Add(i + 1);

            tris.Add(i);
            int value = i == 1 ? 0 : (points.Count - i) + 1;
            tris.Add(value);
            tris.Add(points.Count - i);
        }
        if (Mathf.Floor(realHalf) != Mathf.Ceil(realHalf))
        {
            Debug.Log("Odd number of points " + points.Count + "(" + realHalf + ")");
            tris.Add(half);
            tris.Add(half + 1);
            tris.Add(half - 1);
        }
        for (int i = 0; i < points.Count; i++)
        {
            float[] uvRange = new float[2];
            int     index   = 0;
            if (planeRange.XRange() > 0)
            {
                uvRange[index++] = (points[i].x - planeRange.minX) / planeRange.XRange();
            }
            if (index < 1 || (planeRange.ZRange() > 0))
            {
                uvRange[index++] = (points[i].z - planeRange.minX) / planeRange.ZRange();
            }
            if (index < 2)
            {
                uvRange[index++] = (points[i].y - planeRange.minY) / planeRange.YRange();
            }
            uvs.Add(new Vector2(uvRange[0], uvRange[1]));
        }

        Mesh mesh = new Mesh();

        mesh.vertices  = points.ToArray();
        mesh.uv        = uvs.ToArray();
        mesh.triangles = tris.ToArray();
        mesh.RecalculateNormals();
        return(mesh);
    }
Пример #4
0
    /*
     * Create the walls
     * Walls are slightly smaller than a bounding box of the chaparone area
     * We will in the area outside the chaparone area, but inside walls
     * with debris, furniture, ect
     */
    public void AddWalls()
    {
        GameObject[]     walls        = new GameObject[4];
        List <Vector3>[] wallPoints   = new List <Vector3> [4];
        PlaneRange[]     wallRanges   = new PlaneRange[4];
        LineRange        groundRangeX = _ground.GetXRange();
        LineRange        groundRangeZ = _ground.GetZRange();

        _wallEmpty[0] = new List <LineRange>();
        _wallEmpty[0].Add(new LineRange(_adjustment + groundRangeX.min * _shrinkWall, _adjustment + groundRangeX.max * _shrinkWall));
        wallPoints[0] = new List <Vector3>();
        wallPoints[0].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.min * _shrinkWall));
        wallPoints[0].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall));
        wallPoints[0].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall));
        wallPoints[0].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.min * _shrinkWall));
        wallRanges[0] = new PlaneRange(
            0, 1,
            0, 1,
            0, 0
            );

        _wallEmpty[1] = new List <LineRange>();
        _wallEmpty[1].Add(new LineRange(_adjustment + groundRangeZ.min * _shrinkWall, _adjustment + groundRangeZ.max * _shrinkWall));
        _wallEmpty[1] = new List <LineRange>();
        _wallEmpty[1].Add(new LineRange(_adjustment + groundRangeZ.min * _shrinkWall, _adjustment + groundRangeZ.max * _shrinkWall));
        wallPoints[1] = new List <Vector3>();
        wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.min * _shrinkWall));
        wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall));
        wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall));
        wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.max * _shrinkWall));
        wallRanges[1] = new PlaneRange(
            0, 0,
            0, 1,
            0, 1
            );
        _wallEmpty[2] = new List <LineRange>();
        _wallEmpty[2].Add(new LineRange(_adjustment + groundRangeX.min * _shrinkWall, _adjustment + groundRangeX.max * _shrinkWall));
        wallPoints[2] = new List <Vector3>();
        wallPoints[2].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.max * _shrinkWall));
        wallPoints[2].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall));
        wallPoints[2].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall));
        wallPoints[2].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.max * _shrinkWall));
        wallRanges[2] = new PlaneRange(
            0, 1,
            0, 1,
            0, 0
            );
        _wallEmpty[3] = new List <LineRange>();
        _wallEmpty[3].Add(new LineRange(_adjustment + groundRangeZ.min * _shrinkWall, _adjustment + groundRangeZ.max * _shrinkWall));
        wallPoints[3] = new List <Vector3>();
        wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.max * _shrinkWall));
        wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall));
        wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall));
        wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.min * _shrinkWall));
        int wallMaterialIndex = Random.Range(0, _wallMaterials.Length);

        wallRanges[3] = new PlaneRange(
            0, 0,
            0, 1,
            0, 1
            );
        for (int wallIndex = 0; wallIndex < 4; wallIndex++)
        {
            GameObject wall = new GameObject();
            wall.transform.parent = transform;
            MeshRenderer wallRendered = wall.AddComponent <MeshRenderer>();
            wallRendered.material = _wallMaterials[wallMaterialIndex];
            wall.transform.name   = "Wall" + wallIndex + wallRendered.material.name;
            wall.tag = "Wall";
            MeshCollider wallCollider   = wall.AddComponent <MeshCollider>();
            MeshFilter   wallMeshFilter = wall.AddComponent <MeshFilter>();
            wallMeshFilter.mesh     = MeshTools.CreateMeshFromVectors(wallPoints[wallIndex], wallRanges[wallIndex]);
            wallCollider.sharedMesh = wallMeshFilter.mesh;
            _walls.Add(wall);
            CalculateAccessibleWall(wallIndex);
        }
    }