0

I'm working in Unity, writing some C# for a terrain hide/reveal code. The code works, but is there a way to rewrite this so that I wont have to keep writing this loooong code out every time I encounter one of these pretty simple situations?

Here are the variables relevant to this part:

// ...

private int terLevel = 0;
private GameObject[] t0;
private GameObject[] t1;
private GameObject[] t2;
private GameObject[] t3;
private GameObject[] t4;
private GameObject[] t5;

Here is the relevant part of my start function:

void Start ()
    {
        // ...

        t0 = GameObject.FindGameObjectsWithTag ("T0");
        t1 = GameObject.FindGameObjectsWithTag ("T1");
        t2 = GameObject.FindGameObjectsWithTag ("T2");
        t3 = GameObject.FindGameObjectsWithTag ("T3");
        t4 = GameObject.FindGameObjectsWithTag ("T4");
        t5 = GameObject.FindGameObjectsWithTag ("T5");
    }

And here are is the main part I want to fix in my update function:

void Update ()
    {
        // ...

        if(terLevel <= 0)
    {
        foreach(GameObject i in t1)
            i.renderer.enabled = false;
        foreach(GameObject i in t2)
            i.renderer.enabled = false;
        foreach(GameObject i in t3)
            i.renderer.enabled = false;
        foreach(GameObject i in t4)
            i.renderer.enabled = false;
        foreach(GameObject i in t5)
            i.renderer.enabled = false;
    }
    else
    {
    if(terLevel == 1)
    {
        foreach(GameObject i in t1)
            i.renderer.enabled = true;
        foreach(GameObject i in t2)
            i.renderer.enabled = false;
        foreach(GameObject i in t3)
            i.renderer.enabled = false;
        foreach(GameObject i in t4)
            i.renderer.enabled = false;
        foreach(GameObject i in t5)
            i.renderer.enabled = false;
    }
    else
    {
    if(terLevel == 2)
    {
        foreach(GameObject i in t1)
            i.renderer.enabled = true;
        foreach(GameObject i in t2)
            i.renderer.enabled = true;
        foreach(GameObject i in t3)
            i.renderer.enabled = false;
        foreach(GameObject i in t4)
            i.renderer.enabled = false;
        foreach(GameObject i in t5)
            i.renderer.enabled = false;
    }
    else
    {
    if(terLevel == 3)
    {
        foreach(GameObject i in t1)
            i.renderer.enabled = true;
        foreach(GameObject i in t2)
            i.renderer.enabled = true;
        foreach(GameObject i in t3)
            i.renderer.enabled = true;
        foreach(GameObject i in t4)
            i.renderer.enabled = false;
        foreach(GameObject i in t5)
            i.renderer.enabled = false;
    }
    else
    {
    if(terLevel == 4)
    {
        foreach(GameObject i in t1)
            i.renderer.enabled = true;
        foreach(GameObject i in t2)
            i.renderer.enabled = true;
        foreach(GameObject i in t3)
            i.renderer.enabled = true;
        foreach(GameObject i in t4)
            i.renderer.enabled = true;
        foreach(GameObject i in t5)
            i.renderer.enabled = false;
    }
    else
    {
    if(terLevel >= 5)
    {
        foreach(GameObject i in t1)
            i.renderer.enabled = true;
        foreach(GameObject i in t2)
            i.renderer.enabled = true;
        foreach(GameObject i in t3)
            i.renderer.enabled = true;
        foreach(GameObject i in t4)
            i.renderer.enabled = true;
        foreach(GameObject i in t5)
            i.renderer.enabled = true;
    }}}}}}
}

Terrifying isn't it. Imagine if I had more than 5 terrain layers, I would die before I finished the code. There must be a

Max Yankov
  • 12,551
  • 12
  • 67
  • 135
Buffoonery
  • 13
  • 3
  • 3
    Would be better in [CodeReview.SE]? – Soner Gönül Apr 27 '15 at 06:54
  • 6
    I'm voting to close this question as off-topic because it belongs on [CodeReview](http://codereview.stackexchange.com/) – Yuval Itzchakov Apr 27 '15 at 06:54
  • If you're curious on what this code does, it's basically a way to hide all the terrain layers above what you are working on. I don't have the buttons shown here, but the premise here is: You press the upTerrain button, it reveals one layer from the bottom up. If you press the downTerrain button, it hides the highest visible layer. – Buffoonery Apr 27 '15 at 07:03
  • Please use `unity3d` tag for questions related to Unity game engine. It's generally a good idea to read the tags descriptions before applying them. – Max Yankov Apr 27 '15 at 07:35

2 Answers2

2

Start by putting all of your game objects into a single array:

private GameObject[][] ts = new GameObject[6][];

From there the rest becomes pretty simple. First populate:

void Start ()
{
    for (int i = 0 ; i < 6 ; i++)
    {
        ts[i] = GameObject.FindGameObjectsWithTag(string.Format("T{0}", i));
    }
}

And updating:

void Update ()
{
    for (int i = 0 ; i < 6 ; i++)
    {
        foreach(GameObject t in ts)
            t.renderer.enabled = i > terLevel;
    }
}
jaket
  • 9,140
  • 2
  • 25
  • 44
1

quick shot:

    foreach(GameObject i in t1)
        i.renderer.enabled = terLevel > 0;
    foreach(GameObject i in t2)
        i.renderer.enabled = terLevel > 1;
    foreach(GameObject i in t3)
        i.renderer.enabled = terLevel > 2;
    foreach(GameObject i in t4)
        i.renderer.enabled = terLevel > 3;
    foreach(GameObject i in t5)
        i.renderer.enabled = terLevel > 4;
Thomas Krojer
  • 1,018
  • 7
  • 9