我在Unity3D中有一个C#数组类型的Transform对象。要赢得游戏,所有图片的rotation.z值必须为0。
Transform[] Pictures;
if (Pictures[0].rotation.z == 0 &&
Pictures[1].rotation.z == 0 &&
Pictures[2].rotation.z == 0 &&
Pictures[3].rotation.z == 0 &&
Pictures[4].rotation.z == 0 &&
Pictures[5].rotation.z == 0)
{
YouWin = true;
//WinText.enabled = true;//.SetActive(true);
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1);
}
但这是丑陋的方式。而且,如果数组扩展,游戏就不会结束。因此,我尝试编写新代码以使事情变得更容易。但是不能。
foreach (var item in Pictures)
{
if (item.rotation.z == 0)
{
YouWin = true;
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1);
}
}
foreach无法正常运行。从第一个图像的foreach存在。必须检查每个图像的rotation.z值。
for (int i = 0; i < Pictures.Length; i++)
{
if (Pictures[i].rotation.z ==0)
{
YouWin = true;
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1);
}
}
“ for”也与foreach相同。我认为它需要嵌套for或foreach。如果rotation.z值等于0,如何检查所有项目?谢谢。
答案 0 :(得分:4)
要赢得游戏,所有
picture
的{{1}}值必须为rotation.z
。
让我们借助 Linq 0
来实现它:
All
如果您想循环使用 ,则可以反转逻辑- using System.Linq;
...
if (Pictures.All(picture => picture.rotation.z == 0)) {
// Win
YouWin = true;
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1);
}
,如果我们没有计数器示例(YouWin == true
)
item.rotation.z != 0
答案 1 :(得分:2)
您有几种选择可以执行此任务。 最简单的方法是添加一个额外的标志并取消检查条件。 如果任何图片rotation.z不为0,则您没有赢。 如果所有图片rotation.z为0,则您赢了。
bool success = true;
foreach (var item in Pictures)
{
if (item.rotation.z != 0)
{
success = false;
}
}
if (success) {
YouWin = true;
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1);
}
或使用Linq:
bool won = pictures.TrueForAll(x=> x.rotation.z == 0);