using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.U2D; public class LevelGeneratorV2 : MonoBehaviour { public LineRenderer debugLine; [SerializeField]public Range amplitude = new Range(1,2); [SerializeField]public Range distance = new Range(2,5); [SerializeField]public Range height = new Range(3,6); public float frequency = 0.1f; [Header("Generation")] public SpriteShapeController[] shapes; List pooled,borrowed = new List(); public float tangentSmoothness = 1.5f; // Start is called before the first frame update void Start() { Application.targetFrameRate = 60; // #if UNITY_EDITOR // debugLine.gameObject.SetActive(true); // #else // debugLine.gameObject.SetActive(false); // #endif pooled = new List(); borrowed = new List(); foreach(SpriteShapeController shape in shapes){pooled.Add(shape);} GenerateNext(amount:100); } // Update is called once per frame void Update() { if(PlayerController.position.x > lastStart){ GenerateNext(); } } float lastStart; List points = new List(); float a; void GenerateNext(int amount = 100){ if(points.Count <= 0){points.Add(new Vector3(0,0));} int startIndex = points.Count-1; lastStart = points[startIndex].x; for(int i=0; i < amount; i++){ a+= frequency; float y = Mathf.Sin(a) * amplitude.GetRandom(); float x = points[points.Count-1].x + distance.GetRandom(); points.Add(new Vector3(x,y)); } CleanupBorrowed(); SpriteShapeController bot_controller = pooled[0]; borrowed.Add(pooled[0]); pooled.RemoveAt(0); bot_controller.spline.Clear(); InsertNewPoint(bot_controller, points[startIndex]- new Vector3(0, 50)); for(int i=startIndex; i < points.Count; i++){ InsertNewPoint(bot_controller, points[i] - new Vector3(0, height.GetRandom())); } InsertNewPoint(bot_controller, points[points.Count-1] - new Vector3(0,50)); bot_controller.transform.position = Vector3.zero; bot_controller.gameObject.SetActive(false); bot_controller.gameObject.SetActive(true); SpriteShapeController top_controller = pooled[0]; borrowed.Add(pooled[0]); pooled.RemoveAt(0); top_controller.spline.Clear(); InsertNewPoint(top_controller, points[startIndex]+ new Vector3(0, 50)); for(int i=startIndex; i < points.Count; i++){ InsertNewPoint(top_controller, points[i] + new Vector3(0, height.GetRandom())); } InsertNewPoint(top_controller, points[points.Count-1] + new Vector3(0,50)); top_controller.transform.position = Vector3.zero; top_controller.gameObject.SetActive(false); top_controller.gameObject.SetActive(true); UpdateLine(); } void CleanupBorrowed(){ for(int i= borrowed.Count-1; i > 0; i--){ if(borrowed[i].spline.GetPosition(borrowed[i].spline.GetPointCount()-1).x < PlayerController.position.x -30){ pooled.Add(borrowed[i]); borrowed.RemoveAt(i); } } } void UpdateLine(){ debugLine.positionCount = points.Count; debugLine.SetPositions(points.ToArray()); } void InsertNewPoint(SpriteShapeController spriteShapeController,Vector3 point){ int index= spriteShapeController.spline.GetPointCount(); spriteShapeController.spline.InsertPointAt(index, point); spriteShapeController.spline.SetTangentMode(index, ShapeTangentMode.Continuous); spriteShapeController.spline.SetLeftTangent(index, new Vector3(-tangentSmoothness,0)); spriteShapeController.spline.SetRightTangent(index,new Vector3(tangentSmoothness,0)); } }