我的Foreach循环需要优化

时间:2015-04-27 06:53:12

标签: c# if-statement foreach unity3d

我在Unity工作,为地形隐藏/显示代码编写了一些C#。 代码可以运行,但有没有办法重写这个,这样每次遇到其中一个非常简单的情况时,我都不必继续编写这个loooong代码?

以下是与此部分相关的变量:

// ...

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

以下是我的启动功能的相关部分:

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

以下是我要在更新功能中修复的主要部分

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

可怕的不是它。想象一下,如果我有超过5个地形图层,我会在完成代码之前死掉。

必须有

2 个答案:

答案 0 :(得分:2)

首先将所有游戏对象放入一个阵列中:

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

从那里休息变得非常简单。首先填充:

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

并更新:

void Update ()
{
    for (int i = 0 ; i < 6 ; i++)
    {
        foreach(GameObject t in ts)
            t.renderer.enabled = i > terLevel;
    }
}

答案 1 :(得分:1)

快速拍摄:

    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;