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; } } }
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; } } } }