Пример #1
0
    public void Generate(int _type, float size, int _numberOfSites, float _mainRoadWidth, float _sideRoadWidth)
    {
        lStreets = new List <GameObject>();
        siteGen  = GetComponent <SiteGenerator>();
        vBuilder = GetComponent <VoronoiBuilder>();
        Ground.transform.localScale = new Vector3(size, 0.01f, size);
        groundRad     = size / 2f;
        numberOfSites = _numberOfSites;
        mainRoadWidth = _mainRoadWidth;
        sideRoadWidth = _sideRoadWidth;
        type          = (GenerationType)_type;


        List <Vector2> sites = new List <Vector2>();

        switch (type)
        {
        case GenerationType.Orgnic:
            sites = siteGen.GenerateRandom(new Vector2(Ground.transform.position.x, Ground.transform.position.z), groundRad, width, height, numberOfSites);
            break;

        case GenerationType.Circular:
            sites = siteGen.GenerateCircular(height, width, groundRad, new Vector2(Ground.transform.position.x, Ground.transform.position.z), 3, numberOfSites);
            break;

        case GenerationType.Grid:
            sites = siteGen.GenerateGrid(new Vector2(Ground.transform.position.x, Ground.transform.position.z), groundRad, 400, 400);
            break;

        default:
            break;
        }



        List <Edge> vEdges = vBuilder.GenerateVoronoi(sites, new Vector2(Ground.transform.position.x, Ground.transform.position.z), groundRad);
        int         i      = 0;

        for (i = 0; i < vEdges.Count; i++)
        {
            // check to see if the curent edge is entirely out of the worldbound
            if (CheckWholeEdge(vEdges[i]))
            {
                continue;
            }
            if (!CheckPositiontoWorldBounds(vEdges[i].start))
            {
                Vector2[] inter = EdgeToCircleIntersection(vEdges[i]);


                float dis1 = Vector2.Distance(vEdges[i].start, inter[0]);
                float dis2 = Vector2.Distance(vEdges[i].start, inter[1]);

                if (dis1 < dis2)
                {
                    vEdges[i].start = inter[0];
                }
                else
                {
                    vEdges[i].start = inter[1];
                }
            }
            if (!CheckPositiontoWorldBounds(vEdges[i].end))
            {
                Vector2[] inter = EdgeToCircleIntersection(vEdges[i]);


                float dis1 = Vector2.Distance(vEdges[i].start, inter[0]);
                float dis2 = Vector2.Distance(vEdges[i].start, inter[1]);

                if (dis1 < dis2)
                {
                    vEdges[i].end = inter[0];
                }
                else
                {
                    vEdges[i].end = inter[1];
                }
            }
            GameObject newMainRoad = Instantiate(mainRoadPF, new Vector3(vEdges[i].start.x, 0.1f, vEdges[i].start.y), Quaternion.identity);
            newMainRoad.GetComponent <MeshBuilderVoronoi>().GenerateMesh(vEdges[i].start, vEdges[i].end, mainRoadWidth);
            newMainRoad.transform.rotation = Quaternion.LookRotation(new Vector3(vEdges[i].ndir.x, 0, vEdges[i].ndir.y));
            newMainRoad.name = vEdges[i].LR;
            newMainRoad.GetComponent <AttachPoints>().CreateAttachPoints(Vector3.Distance(vEdges[i].start, vEdges[i].end), 5);

            Vector2 midPoint = new Vector2((vEdges[i].start.x + vEdges[i].end.x) / 2, (vEdges[i].start.y + vEdges[i].end.y) / 2f);
            Vector2 rotation = Vector2.Perpendicular(vEdges[i].ndir);

            GameObject       t  = Instantiate(turtlePf, new Vector3(midPoint.x, 0.1f, midPoint.y), Quaternion.LookRotation(new Vector3(rotation.x, 0, rotation.y)));
            TurtleController tc = t.GetComponent <TurtleController>();
            tc.streeWidth  = sideRoadWidth;
            tc.startStreet = newMainRoad;
            if (type == GenerationType.Circular)
            {
                float disToMid = Vector2.Distance(midPoint, Ground.transform.position);
                float p        = disToMid * 100 / groundRad;
                int   itt      = 0;
                if (p < 33.3f)
                {
                    itt = 3;
                }
                else if (p < 66.6f)
                {
                    itt = 2;
                }
                else
                {
                    itt = 1;
                }

                tc.Generate(itt);
            }
            else
            {
                tc.Generate(1);
            }
        }
    }