1

我正在统一制作游戏,并且我有这个“如果声明”,每 5 波我的商店菜单就会变得可见。代码确实有效,但我确定我做错了什么或者可以做得更好!

if (waveCount == 5 || waveCount == 10 || waveCount == 15 || waveCount == 20 || waveCount == 25 || waveCount == 30 || waveCount == 35 || waveCount == 40 || waveCount == 45 || waveCount == 50)
{
    // yield return new WaitForSeconds(shopWait);
    shopPanel.SetActive(true);
}

如您所见,“if 语句”不是那么好,通常它会一直持续到waveCount == 100但我将其删除。必须有一种更简单或更清洁的方法来做到这一点:/但我就是无法绕开它:(

编辑 1

谢谢,我对模不太了解,知道我知道我必须阅读的内容:)

4

9 回答 9

6

您可以使用模运算:

if (waveCount % 5 == 0)

于 2017-01-21T15:36:10.657 回答
2

是的,确实有更简单的方法可以做到这一点。如果您使用一点数学和逻辑,您可以解决这个问题。

由于要检查 的值是否waveCount是 5 的倍数,所以可以使用%来获取 的提醒waveCount / 5。如果该提醒为 0,waveCount则为 5 的倍数。

if (waveCount % 5 == 0 && waveCount <= 100)

我添加了在大于 100waveCount <= 100时复制代码的行为,即不进入 if 语句。waveCount

或者,您可以将所有值放入一个列表中:

var list = new List<int>();
for (int i = 1 ; i <= 20 ; i++) {
    list.Add(i * 5);
}

然后检查列表是否包含数字:

if (list.Contains(waveNumber))

这样做的好处是,如果您决定更改游戏的运行方式,并说商店菜单可以在第 9、52 和 77 波打开,您只需将数字添加到列表中,而无需修改 if 语句。这提供了很大的灵活性。

于 2017-01-21T15:43:33.030 回答
2
if (waveCount % 5 == 0 && waveCount <= 50) {
    //...code
}
于 2017-01-21T15:51:22.027 回答
1

如果你的“if”语句的主体只包含shopPanel.SetActive(true); 你可以做到这一点,甚至不用像那样使用“if”。

shopPanel.SetActive(waveCount % 5 == 0 && waveCount <= 50);
于 2017-01-21T16:46:54.603 回答
0

可以测试除以5的余数是否为0,即能被5整除。

if (waveCount % 5 == 0 && waveCount >= 5 && waveCount <= 50)

C#对整数类型 ( , , , ...)执行整数数学运算。例子:intlonguint

13 / 5 = 2

即你永远不会得到小数部分。互补运算是模运算。它为您提供了此除法的其余部分:

13 % 5 = 3

即,13 / 5 是 2 加上余数 3。除法和模运算一起允许您执行相反的运算。

(5 * (13 / 5)) + (13 % 5) =  
(5 *     2   ) + (   3  ) =  13

如果您有不规则的数字,则完全不同的方法是使用以下switch语句:

switch (waveCount) {
    case 5:
    case 10:
    case 15:
    case 20:
    case 25:
    case 30:
    case 35:
    case 40:
    case 45:
    case 50:
        shopPanel.SetActive(true);
        break;
}

或允许值的数组:

private static readonly int[] AllowedValues =
    new int[] { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 };

if(Array.IndexOf(AllowedValues, waveCount) >= 0) { ... }
于 2017-01-21T15:47:15.157 回答
0

您可以为此使用余数运算符:

if (waveCount % 5 == 0 && waveCount > 0 && waveCount <= 50)
{
    //yield return new WaitForSeconds(shopWait);
    shopPanel.SetActive(true);
}
于 2017-01-21T15:41:58.840 回答
0

试试看

if (waveCount % 5 == 0 && waveCount <= 50)
于 2017-01-21T15:37:14.687 回答
0

使用运算符:

if(waveCount % 5 == 0 && waveCount <= 100) ...

运算符计算整数除法的余数。在您的情况下,该语句应返回零,表示您的数字除以5没有余数。

于 2017-01-21T15:39:21.297 回答
0

概括一下:如果您拥有的数据与模式不匹配,您可以将所有要匹配的东西放在一个集合中,然后测试该集合的成员资格:

var thingsToMatch = Set(2, 5, 8, 14, 23, 80, 274...);
if (someNumber in thingsToMatch) {...} 

只要您知道每次调用该函数时都不会重新创建该集合,这已被证明是相当快的。如果您的语言不自动缓存该集合,您可以将其设为函数的静态变量。

于 2017-01-21T15:40:14.913 回答