MeshTemplate GenerateLowerPart(float _x, float _y, float _z, float _lowetToUpper)
    {
        List <Vector3> lowerRing = new List <Vector3>(4);
        List <Vector3> upperRing = new List <Vector3>(4);

        lowerRing.Add(new Vector3(_x / 2, 0f, -_z / 2));
        lowerRing.Add(new Vector3(_x / 2, 0f, _z / 2));
        lowerRing.Add(new Vector3(-_x / 2, 0f, _z / 2));
        lowerRing.Add(new Vector3(-_x / 2, 0f, -_z / 2));

        float Y = _y * _lowetToUpper;

        upperRing.Add(new Vector3(_x / 2, Y, -_z / 2));
        upperRing.Add(new Vector3(_x / 2, Y, _z / 2));
        upperRing.Add(new Vector3(-_x / 2, Y, _z / 2));
        upperRing.Add(new Vector3(-_x / 2, Y, -_z / 2));

        MeshTemplate Band = MeshTemplatePrimitives.Band(lowerRing, upperRing);

        MeshTemplate lowerPlane = MeshTemplatePrimitives.Quad(new Vector3(-_x / 2, 0f, -_z / 2), new Vector3(_x, 0f, 0f), new Vector3(0f, 0f, _z));

        lowerPlane.FlipFaces();

        MeshTemplate UpperPlane = MeshTemplatePrimitives.Quad(new Vector3(-_x / 2, Y, -_z / 2), new Vector3(_x, 0f, 0f), new Vector3(0f, 0f, _z));

        Band.Add(lowerPlane);
        Band.Add(UpperPlane);
        return(Band);
    }
    MeshTemplate GenerateUpperPart(float _x, float _y, float _z, float _lowetToUpper)
    {
        List <Vector3> lowerRing = new List <Vector3>(4);
        List <Vector3> upperRing = new List <Vector3>(4);
        float          Y         = _y * _lowetToUpper;

        float ZFrontLower = Random.Range(.7f * _z, .4f * _z);
        float ZBackLower  = Random.Range(.6f * _z, .9f * _z);

        lowerRing.Add(new Vector3(_x / 2, Y, -ZBackLower / 2));
        lowerRing.Add(new Vector3(_x / 2, Y, ZFrontLower / 2));
        lowerRing.Add(new Vector3(-_x / 2, Y, ZFrontLower / 2));
        lowerRing.Add(new Vector3(-_x / 2, Y, -ZBackLower / 2));

        float XUpper      = Random.Range(_x, _x * .7f);
        float ZFrontUpper = Random.Range(ZFrontLower, .3f * ZFrontLower);
        float ZBackUpper  = Random.Range(ZBackLower, .6f * ZBackLower);

        upperRing.Add(new Vector3(XUpper / 2, _y, -ZBackUpper / 2));
        upperRing.Add(new Vector3(XUpper / 2, _y, ZFrontUpper / 2));
        upperRing.Add(new Vector3(-XUpper / 2, _y, ZFrontUpper / 2));
        upperRing.Add(new Vector3(-XUpper / 2, _y, -ZBackUpper / 2));

        MeshTemplate Band = MeshTemplatePrimitives.Band(lowerRing, upperRing);

        MeshTemplate roof = MeshTemplatePrimitives.Quad(
            new Vector3(-XUpper / 2, _y, -ZBackUpper / 2),
            Vector3.right * XUpper,
            Vector3.forward * (ZFrontUpper / 2 + ZBackUpper / 2));

        Band.Add(roof);

        return(Band);
    }
    public void GenerateCar()
    {
        float randomX           = Random.Range(m_MinX, m_MaxX);
        float randomY           = Random.Range(m_MinY, m_MaxY);
        float randomZ           = Random.Range(m_MinZ, m_MaxZ);
        float randomWheelRadius = Random.Range(m_WheelMinRadius, m_WheelMaxRadius);

        float        lowerToUpperProp = Random.Range(.3f, .5f);
        MeshTemplate lowerPart        = GenerateLowerPart(randomX, randomY, randomZ, lowerToUpperProp);
        MeshTemplate upperPart        = GenerateUpperPart(randomX, randomY, randomZ, lowerToUpperProp);

        List <MeshTemplate> wheels = new List <MeshTemplate>();

        wheels.Add(MeshTemplatePrimitives.Cylinder(new Vector3(randomX / 2, 0f, randomZ / 2 - 1f), randomWheelRadius, .2f, 12));
        wheels.Add(MeshTemplatePrimitives.Cylinder(new Vector3(randomX / 2, 0f, -randomZ / 2 + .6f), randomWheelRadius, .2f, 12));
        wheels.Add(MeshTemplatePrimitives.Cylinder(new Vector3(-randomX / 2, 0f, randomZ / 2 - 1f), randomWheelRadius, .2f, 12));
        wheels.Add(MeshTemplatePrimitives.Cylinder(new Vector3(-randomX / 2, 0f, -randomZ / 2 + .6f), randomWheelRadius, .2f, 12));

        MeshTemplate car = new MeshTemplate();

        car.Add(lowerPart);
        car.Add(upperPart);

        for (int i = 0; i < wheels.Count; i++)
        {
            car.Add(wheels[i]);
        }
        GetComponent <MeshFilter>().mesh = car.ToMesh();
    }