Ejemplo n.º 1
0
    void Start()
    {
        ChunkGenerator generator = GetComponent <ChunkGenerator>() as ChunkGenerator;

        if (generator.depth == 0)
        {
            Vector2 p0  = Vector2.zero;
            Vector2 p3  = generator.size;
            float   dis = Vector2.Distance(p0, p3) / 2;
            Vector2 p1  = p0 + (new Vector2(1, generator.a0)).normalized * dis;
            Vector2 p2  = p3 - (new Vector2(1, generator.a1)).normalized * dis;

            List <Vector2> topline    = new List <Vector2>();
            List <Vector2> bottomline = new List <Vector2>();
            foreach (Vector2 v in BezierCurver.Generate((int)(generator.size.x / precision), p0, p1, p2, p3))
            {
                topline.Add(v);
            }
            foreach (Vector2 v in BezierCurver.Generate((int)(generator.size.x / precision), p0 + Vector2.down * thickness, p1 + Vector2.down * thickness, p2 + Vector2.down * thickness, p3 + Vector2.down * thickness))
            {
                bottomline.Add(v);
            }

            GetComponent <MeshFilter>().mesh = createMesh(topline.ToArray(), bottomline.ToArray());

            GetComponent <EdgeCollider2D>().points = topline.ToArray();
            if (!generator.collidable)
            {
                GetComponent <EdgeCollider2D>().isTrigger = true;
            }
        }
    }
Ejemplo n.º 2
0
    void LateUpdate()
    {
        if (depth > 0)
        {
            // Delete old
            foreach (GameObject chunk in GetChunksToRemove())
            {
                Destroy(chunk);
            }

            // Create new
            Vector2 p0  = Vector2.zero;
            Vector2 p3  = size;
            float   dis = Vector2.Distance(p0, p3) / 2;
            Vector2 p1  = (new Vector2(1, a0)).normalized * dis;
            Vector2 p2  = (new Vector2(1, a1)).normalized * dis;

            Vector2[] points = BezierCurver.Generate(iterations, p0, p1, p2, p3);

            for (int i = 0; i < points.Length - 1; i++)
            {
                Vector2 pointSize = points[i + 1] - points[i];
                if (IsIntervalVisible(points[i].x - offset, points[i].x + pointSize.x + offset) &&
                    !IsChunkInInterval(points[i].x, points[i].x + pointSize.x))
                {
                    GameObject     chunk     = Instantiate(chunkPrefab) as GameObject;
                    ChunkGenerator generator = chunk.AddComponent <ChunkGenerator>() as ChunkGenerator;
                    chunk.transform.parent        = transform;
                    chunk.transform.localPosition = points[i];
                    generator.size = pointSize;
                    if (i == 0)
                    {
                        generator.a0 = a0;
                    }
                    else
                    {
                        generator.a0 = (points[i + 1].y - points[i - 1].y) / (points[i + 1].x - points[i - 1].x);
                    }

                    if (i == points.Length - 2)
                    {
                        generator.a1 = a1;
                    }
                    else
                    {
                        generator.a1 = (points[i + 2].y - points[i].y) / (points[i + 2].x - points[i].x);
                    }
                    generator.a0         += GetRandomValue(transform.position + new Vector3(points[i].x, points[i].y, 0f), generator.depth);
                    generator.a1         += GetRandomValue(transform.position + new Vector3(points[i + 1].x, points[i + 1].y, 0f), generator.depth);
                    generator.iterations  = 5;
                    generator.depth       = depth - 1;
                    generator.chunkPrefab = chunkPrefab;
                    generator.collidable  = collidable;
                    generator.offset      = offset;
                }
            }
        }
    }