【问题标题】:My Foreach loop needs optimization [closed]我的 Foreach 循环需要优化 [关闭]
【发布时间】:2015-04-27 06:53:11
【问题描述】:

我在 Unity 工作,为地形隐藏/显示代码编写一些 C#。 代码有效,但是有没有办法重写它,这样我就不必每次遇到这些非常简单的情况时都写出这段冗长的代码?

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

// ...

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 个地形层,我会在我完成代码之前死去。必须有一个

【问题讨论】:

  • Code Review 会更好吗?
  • 我投票结束这个问题,因为它属于CodeReview
  • 如果您对这段代码的作用感到好奇,它基本上是一种将所有地形图层隐藏在您正在处理的内容之上的方法。我没有这里显示的按钮,但这里的前提是:你按下 upTerrain 按钮,它会从下往上显示一层。如果你按下 downTerrain 按钮,它会隐藏最高可见层。
  • 请使用unity3d 标签回答与 Unity 游戏引擎相关的问题。在应用标签之前阅读标签描述通常是个好主意。

标签: c# if-statement foreach unity3d


【解决方案1】:

首先将所有游戏对象放入一个数组中:

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

【讨论】:

  • 天哪,这太天才了!非常感谢!
【解决方案2】:

快速拍摄:

    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;

【讨论】:

  • 对不起,如果周围没有...答案已更正
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2020-06-29
  • 2016-06-29
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多