UnityGameProjectsCode / Rise2Point0Game / Level / LevelLimiter.cs
LevelLimiter.cs
Raw
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class LevelLimiter : MonoBehaviour
{
    private GameObject deathWall;
    private LevelGenerator levelGen;
    private float wallHeight;

    public float timeBetweenChecks;
    private float timeSinceCheck;
    private bool checkedTiles;

    private List<GameObject> wallsAndTiles = new List<GameObject>();
    private List<GameObject> backgroundElements = new List<GameObject>();

    private void Start()
    {
        deathWall = ObjectManager.GetObject(2);
        levelGen = GetComponent<LevelGenerator>();
    }

    private void Update()
    {
        if (checkedTiles)
        {
            timeSinceCheck += Time.deltaTime;

            if (timeSinceCheck >= timeBetweenChecks)
            {
                checkedTiles = false;
            }
        }
        else
        {
            wallHeight = deathWall.transform.position.y;

            CollectTiles();

            foreach (GameObject item in wallsAndTiles)
            {
                if (item.transform.position.y - 10 < wallHeight && item.activeSelf)
                {
                    foreach (Transform transform in item.GetComponentsInChildren<Transform>())
                    {
                        if (transform.TryGetComponent(out BoxCollider2D boxColl))
                            if(boxColl.name == "Blocker Wall")
                                boxColl.enabled = false;
                            else
                                boxColl.enabled = true;

                        if (transform.TryGetComponent(out SpriteRenderer targetSprite))
                        {
                            Color currentSpriteColor = targetSprite.color;

                            if (transform.name == "Glow")
                                targetSprite.color = new Color(currentSpriteColor.r, currentSpriteColor.g, currentSpriteColor.b, 0);
                            else if (transform.name.Contains("Gradient"))
                                targetSprite.color = new Color(currentSpriteColor.r, currentSpriteColor.g, currentSpriteColor.b, 0);
                            else
                                targetSprite.color = new Color(currentSpriteColor.r, currentSpriteColor.g, currentSpriteColor.b, 0.5f);

                            if(item.name.Contains("Wall Piece"))
                                item.gameObject.SetActive(false);
                        }
                    }
                }


                if (item.transform.position.y + 20 < wallHeight)
                {
                    item.SetActive(false);

                    foreach (Transform transform in item.GetComponentsInChildren<Transform>())
                    {
                        if (transform.TryGetComponent(out BoxCollider2D boxColl))
                            if(boxColl.name == "Blocker Wall")
                                boxColl.enabled = false;
                            else
                                boxColl.enabled = true;

                        if (transform.TryGetComponent(out SpriteRenderer targetSprite))
                        {
                            Color currentSpriteColor = targetSprite.color;

                            if (transform.name == "Glow")
                                targetSprite.color = new Color(currentSpriteColor.r, currentSpriteColor.g, currentSpriteColor.b, 0.1019608f);
                            else if (transform.name.Contains("Gradient"))
                                targetSprite.color = new Color(currentSpriteColor.r, currentSpriteColor.g, currentSpriteColor.b, 0.07843138f);
                            else
                                targetSprite.color = new Color(currentSpriteColor.r, currentSpriteColor.g, currentSpriteColor.b, 1);

                            if(item.name.Contains("Wall Piece"))
                                item.gameObject.SetActive(false);
                        }
                    }
                }
            }

            foreach (GameObject item in backgroundElements)
                if (item.transform.position.y + 20 < wallHeight)
                    item.SetActive(false);

            checkedTiles = true;
            timeSinceCheck = 0.0f;
        }
    }

    public void CollectTiles()
    {
        foreach (GameObject item in levelGen.CreatedNormalTiles)
        {
            if (!wallsAndTiles.Contains(item))
                wallsAndTiles.Add(item);
        }

        foreach (GameObject item in levelGen.CreatedClouds)
        {
            if (!backgroundElements.Contains(item))
                backgroundElements.Add(item);
        }

        foreach (GameObject item in levelGen.CreatedParticles)
        {
            if (!backgroundElements.Contains(item))
                backgroundElements.Add(item);
        }

        foreach (GameObject item in levelGen.CreatedBackgrounds)
        {
            if (!wallsAndTiles.Contains(item))
                wallsAndTiles.Add(item);
        }

        foreach (GameObject item in levelGen.CreatedConnectorTiles)
        {
            if (!wallsAndTiles.Contains(item))
                wallsAndTiles.Add(item);
        }

        wallsAndTiles = wallsAndTiles.Distinct().ToList();
        backgroundElements = backgroundElements.Distinct().ToList();

        int wtListCount = wallsAndTiles.Count - 1;
        int bgListCount = backgroundElements.Count - 1;

        for (int i = wtListCount; i >= 0; i--)
        {
            if (wallsAndTiles[i] == null)
                wallsAndTiles.RemoveAt(i);
        }

        for (int i = bgListCount; i >= 0; i--)
        {
            if (backgroundElements[i] == null)
                backgroundElements.RemoveAt(i);
        }
    }
}