Example #1
0
    public void Init(Generator generator, int number, GameObject dronePrefab, GameObject wallPrefab, GameObject cornerPrefab, Material connectionMaterial)
    {
        this.generator = generator;
        this.number    = number;

        foreach (Transform t in transform)
        {
            Destroy(t.gameObject);
        }
        buildings.Clear();
        connections.Clear();

        int targetCount = generator.GetInt(8, 12);

        while (buildings.Count < targetCount)
        {
            Building building = new Building(
                generator.buildings[generator.GetInt(0, generator.buildings.Count)],
                new Vector3(generator.GetFloat(-35.0f, 35.0f), 4.0f, generator.GetFloat(-35.0f, 35.0f)));

            if (!building.DoesOverlap(buildings))
            {
                buildings.Add(building);
            }
        }

        foreach (Building b in buildings)
        {
            if (b.GetConnectionCount() == 0)
            {
                float    closestConnection = float.MaxValue;
                Building closest           = new Building();

                foreach (Building c in buildings)
                {
                    if (b != c)
                    {
                        if ((c.GetPosition() - b.GetPosition()).magnitude < closestConnection)
                        {
                            closestConnection = (c.GetPosition() - b.GetPosition()).magnitude;
                            closest           = c;
                        }
                    }
                }

                if (closest.name != "")
                {
                    connections.Add(new KeyValuePair <int, int>(buildings.IndexOf(b), buildings.IndexOf(closest)));
                    b.AddConnection();
                    closest.AddConnection();
                }
            }
        }

        // Connections
        foreach (KeyValuePair <int, int> k in connections)
        {
            Building a = buildings[k.Key];
            Building b = buildings[k.Value];

            float x = Mathf.Abs(b.GetPosition().x - a.GetPosition().x);
            float z = Mathf.Abs(b.GetPosition().z - a.GetPosition().z);

            List <Vector3> points = new List <Vector3>();
            Vector3        start, end, point1, point2;

            if (x > z)
            {
                start  = ((a.GetRight().x < b.GetLeft().x) ? a.GetRight() : a.GetLeft()) + transform.position;
                end    = ((a.GetRight().x < b.GetLeft().x) ? b.GetLeft() : b.GetRight()) + transform.position;
                point1 = start + new Vector3((end.x - start.x) / 2, 0.0f, 0.0f);
                point2 = end - new Vector3((end.x - start.x) / 2, 0.0f, 0.0f);
            }
            else
            {
                start  = ((a.GetTop().z < b.GetBottom().z) ? a.GetTop() : a.GetBottom()) + transform.position;
                end    = ((a.GetTop().z < b.GetBottom().z) ? b.GetBottom() : b.GetTop()) + transform.position;
                point1 = start + new Vector3(0.0f, 0.0f, (end.z - start.z) / 2);
                point2 = end - new Vector3(0.0f, 0.0f, (end.z - start.z) / 2);
            }

            points.Add(a.GetPosition());
            points.Add(start);

            float resolution = 0.02f;
            for (int i = 0; i < Mathf.FloorToInt(1f / resolution); i++)
            {
                float t         = i * resolution;
                float oneMinusT = 1f - t;

                Vector3 Q      = oneMinusT * start + t * point1;
                Vector3 R      = oneMinusT * point1 + t * point2;
                Vector3 S      = oneMinusT * point2 + t * end;
                Vector3 P      = oneMinusT * Q + t * R;
                Vector3 T      = oneMinusT * R + t * S;
                Vector3 newPos = oneMinusT * P + t * T;

                points.Add(newPos);
            }

            points.Add(end);
            points.Add(b.GetPosition());

            List <Vector3> vertices  = new List <Vector3>();
            List <int>     triangles = new List <int>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                int startCount = vertices.Count;

                Vector3 A = points[i];
                Vector3 B = points[i + 1];
                Vector3 c = (A + B) / 2;

                Vector3 n = Quaternion.Euler(0.0f, 90.0f, 0.0f) * (B - A).normalized;
                Vector3 d = c + n;
                Vector3 e = c - n;

                vertices.Add(new Vector3(d.x, 4.0f, d.z));
                vertices.Add(new Vector3(e.x, 4.0f, e.z));
                vertices.Add(new Vector3(d.x, 6.592f, d.z));
                vertices.Add(new Vector3(e.x, 6.592f, e.z));

                if (i < points.Count - 2)
                {
                    triangles.Add(startCount + 7);
                    triangles.Add(startCount + 3);
                    triangles.Add(startCount + 5);

                    triangles.Add(startCount + 3);
                    triangles.Add(startCount + 1);
                    triangles.Add(startCount + 5);

                    triangles.Add(startCount + 2);
                    triangles.Add(startCount + 6);
                    triangles.Add(startCount + 0);

                    triangles.Add(startCount + 6);
                    triangles.Add(startCount + 4);
                    triangles.Add(startCount + 0);

                    triangles.Add(startCount + 1);
                    triangles.Add(startCount + 0);
                    triangles.Add(startCount + 5);

                    triangles.Add(startCount + 0);
                    triangles.Add(startCount + 4);
                    triangles.Add(startCount + 5);

                    triangles.Add(startCount + 2);
                    triangles.Add(startCount + 3);
                    triangles.Add(startCount + 6);

                    triangles.Add(startCount + 3);
                    triangles.Add(startCount + 7);
                    triangles.Add(startCount + 6);
                }

                // GameObject o = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                // o.transform.parent = transform;
                // o.transform.position = c;
                // o.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
                //
                // GameObject o1 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                // o1.transform.parent = transform;
                // o1.transform.position = d;
                // o1.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
                //
                // GameObject o2 = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                // o2.transform.parent = transform;
                // o2.transform.position = e;
                // o2.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            }

            GameObject g = new GameObject("wall");
            g.transform.parent = transform;
            Mesh m = new Mesh();
            m.vertices  = vertices.ToArray();
            m.triangles = triangles.ToArray();
            m.RecalculateNormals();

            g.AddComponent <MeshFilter>().mesh = m;
            g.AddComponent <MeshRenderer>();
            g.AddComponent <MeshCollider>();
            g.GetComponent <MeshRenderer>().material = connectionMaterial;
        }

        foreach (Building b in buildings)
        {
            GameObject o = GameObject.Instantiate(Resources.Load(b.name)) as GameObject;
            o.transform.parent        = transform;
            o.transform.localPosition = b.GetPosition();
        }

        for (int i = 0; i < generator.GetInt(3, buildings.Count); i++)
        {
            GameObject drone = GameObject.Instantiate(dronePrefab, buildings[i].GetPosition() + transform.position + new Vector3(0.0f, 4.0f, 0.0f), Quaternion.identity);
            drone.transform.parent = transform;
            Drone d = drone.GetComponent <Drone>();
            d.Init(generator, this, buildings[i]);
        }

        float lowestX = float.MaxValue, highestX = -float.MaxValue, lowestZ = float.MaxValue, highestZ = -float.MaxValue;
        float lowestXIndex = -1, highestXIndex = -1, lowestZIndex = -1, highestZIndex = -1;

        for (int i = 0; i < buildings.Count; i++)
        {
            Building b = buildings[i];

            if (b.GetLeft().x < lowestX)
            {
                lowestX      = b.GetLeft().x;
                lowestXIndex = i;
            }
            if (b.GetRight().x > highestX)
            {
                highestX      = b.GetRight().x;
                highestXIndex = i;
            }

            if (b.GetBottom().z < lowestZ)
            {
                lowestZ      = b.GetBottom().z;
                lowestZIndex = i;
            }
            if (b.GetTop().z > highestZ)
            {
                highestZ      = b.GetTop().z;
                highestZIndex = i;
            }
        }
        lowestX  -= 5.0f;
        highestX += 5.0f;
        lowestZ  -= 5.0f;
        highestZ += 5.0f;

        GameObject corner1 = GameObject.Instantiate(cornerPrefab);

        corner1.transform.parent        = transform;
        corner1.transform.localPosition = new Vector3(lowestX, 2.0f, lowestZ);
        GameObject corner2 = GameObject.Instantiate(cornerPrefab);

        corner2.transform.parent        = transform;
        corner2.transform.localPosition = new Vector3(highestX, 2.0f, lowestZ);
        GameObject corner3 = GameObject.Instantiate(cornerPrefab);

        corner3.transform.parent        = transform;
        corner3.transform.localPosition = new Vector3(lowestX, 2.0f, highestZ);
        GameObject corner4 = GameObject.Instantiate(cornerPrefab);

        corner4.transform.parent        = transform;
        corner4.transform.localPosition = new Vector3(highestX, 2.0f, highestZ);

        GameObject wall1 = GameObject.Instantiate(wallPrefab);

        wall1.transform.parent        = transform;
        wall1.transform.localPosition = new Vector3(lowestX, 5.0f, lowestZ + ((highestZ - lowestZ) / 2));
        wall1.transform.localScale    = new Vector3(1.0f, 1.0f, (highestZ - lowestZ));
        GameObject wall2 = GameObject.Instantiate(wallPrefab);

        wall2.transform.parent        = transform;
        wall2.transform.localPosition = new Vector3(highestX, 5.0f, lowestZ + ((highestZ - lowestZ) / 2));
        wall2.transform.localScale    = new Vector3(1.0f, 1.0f, (highestZ - lowestZ));
        GameObject wall3 = GameObject.Instantiate(wallPrefab);

        wall3.transform.parent           = transform;
        wall3.transform.localPosition    = new Vector3(lowestX + ((highestX - lowestX) / 2), 5.0f, lowestZ);
        wall3.transform.localEulerAngles = new Vector3(0.0f, 90.0f, 0.0f);
        wall3.transform.localScale       = new Vector3(1.0f, 1.0f, (highestX - lowestX));
        GameObject wall4 = GameObject.Instantiate(wallPrefab);

        wall4.transform.parent           = transform;
        wall4.transform.localPosition    = new Vector3(lowestX + ((highestX - lowestX) / 2), 5.0f, highestZ);
        wall4.transform.localEulerAngles = new Vector3(0.0f, 90.0f, 0.0f);
        wall4.transform.localScale       = new Vector3(1.0f, 1.0f, (highestX - lowestX));

        center = new Vector3(lowestX + ((highestX - lowestX) / 2), 0.0f, lowestZ + ((highestZ - lowestZ) / 2));
        left   = new Vector3(lowestX, 0.0f, lowestZ + ((highestZ - lowestZ) / 2));
        right  = new Vector3(highestX, 0.0f, lowestZ + ((highestZ - lowestZ) / 2));
        bottom = new Vector3(lowestX + ((highestX - lowestZ) / 2), 0.0f, lowestZ);
        top    = new Vector3(lowestX + ((highestX - lowestZ) / 2), 0.0f, highestZ);

        width  = highestX - lowestX;
        height = highestZ - lowestZ;
    }