我的 Foreach 循环需要优化
My Foreach loop needs optimization
我在 Unity 工作,为地形编写一些 C# hide/reveal 代码。
代码有效,但是有没有办法重写它,这样我就不必每次遇到这些非常简单的情况时都写出这么长的代码?
以下是与这部分相关的变量:
// ...
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 个以上的地形层,我会在完成代码之前死去。必须有一个
快拍:
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;
首先将所有游戏对象放入一个数组中:
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;
}
}
我在 Unity 工作,为地形编写一些 C# hide/reveal 代码。 代码有效,但是有没有办法重写它,这样我就不必每次遇到这些非常简单的情况时都写出这么长的代码?
以下是与这部分相关的变量:
// ...
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 个以上的地形层,我会在完成代码之前死去。必须有一个
快拍:
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;
首先将所有游戏对象放入一个数组中:
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;
}
}