【问题标题】:Incrementation in loop or if statement循环或 if 语句中的增量
【发布时间】:2021-04-18 21:59:24
【问题描述】:

所以事情就是这样。我有一个游戏,其中我有一个生成器 - 生成障碍物。我想在每遇到 5 个障碍后提高速度。示例:第 1、第 2、第 3、第 4、第 5 个障碍物的默认速度 = 5,我希望第 6、第 7、第 8、第 9、第 10 个障碍物的速度提高到速度 = 10 等。我已经有一些嵌套的 if 语句,但是我想无限地提高速度,例如第 100 个障碍物的速度 = 1000。这是我的代码:

IEnumerator SpawnObstacles()
{
    int i = 0;
    do
    {
        var randomTime = Random.Range(minTime, maxTime);
        var randomObstacle = Random.Range(0, obstacles.Length);
        yield return new WaitForSeconds(randomTime);
        var obstacle = Instantiate(obstacles[randomObstacle], transform.position, Quaternion.identity);
        Destroy(obstacle, 10f);
        i++;
        if(i >= 10)
        {
            IncreaseSpeed();
            if(i >= 20)
            {
                IncreaseSpeed();
                if(i >= 30)
                {
                    IncreaseSpeed();
                }
            }
        }
    }
    while (true);
}
private void IncreaseSpeed()
{
        Obstacle obs = FindObjectOfType<Obstacle>();
        obs.speed += 5f;
}

【问题讨论】:

  • 您可以使用模数来测试每 5 次迭代:if (i % 5 == 0) IncreaseSpeed() 或将您的速度设置为迭代次数的函数:obj.speed = (i/5) * 5f
  • 注意你说的是每5个,但是你的ifs每10个就疯狂增加速度..(你的速度是5,5,5,5,5,5,5,5,5 ,5,15,25,35,45,55,65,75,85,95,105,125,145,165...)

标签: c# loops unity3d coroutine


【解决方案1】:

模运算符% 有助于处理此类问题。它给出了除法运算的余数,例如:

3%5 is 3
4%5 is 4
5%5 is 0
6%5 is 1
7%5 is 2
8%5 is 3
9%5 is 4
10%5 is 0

因此,如果您的 x 从 0 开始,并且您想每 5 增加一次速度,那么您只需查看模数为 4 的时间......

x 可以随心所欲(嗯,int.MaxValue),但模数始终为 0..4:

//do some stuff

//should we increase speed?
if(x % 5 == 4)
  IncreaseSpeed();

也是制作圆形数组的便捷工具。someArray[i % someArray.Length] 永远不会越界,因为模数的结果总是在 0 到小于长度 1 之间

【讨论】:

    【解决方案2】:

    你可以做的是:

    模数简介:

    //It essentially shows the rest of a division
    5 / 5 == 1 
    //Since there's no rest there, 
    5 % 5 == 0
    
    //But in the case of where there is a rest
    6 / 5 == 1 (Rest 1)
    //Hence
    6 % 5 == 1
    
    //Other examples :
    7 % 5 == 2
    8 % 5 == 3
    9 % 5 == 4
    10 % 5 == 0 //!! The result is back to zero here as 10/5 == 2 with no Rest
    
    • 在对象中实现一个递归函数,该函数在另一个具有相同属性的对象中生成,但传递一个参数,该参数指示到目前为止已经生成了多少个实例,并检查它是否是第 5 个实例,如果是则增加速度。

    【讨论】:

      【解决方案3】:

      反正你有一个无限循环的协程......为什么不干脆做

      IEnumerator SpawnObstacles()
      {
          do
          {
              for(var x = 0; x < 5; x++)
              {
                  var randomTime = Random.Range(minTime, maxTime);
                  var randomObstacle = Random.Range(0, obstacles.Length);
                  yield return new WaitForSeconds(randomTime);
                  var obstacle = Instantiate(obstacles[randomObstacle], transform.position, Quaternion.identity);
                  Destroy(obstacle, 10f);
              }
      
              // These lines are automatically reached after every 5 iterations
              // no need for any módulo or other magic check
              Obstacle obs = FindObjectOfType<Obstacle>();
              obs.speed += 5f;
          }
          while (true);
      }
      

      或者因为我不确定这整个FindObjectWithTag 东西......实际上在我看来它是你实例化的同一个对象,对吗?那么为什么不干脆呢

      IEnumerator SpawnObstacles()
      {
          var speed = 5;
          do
          {
              for(var x = 0; x < 5; x++)
              {
                  var randomTime = Random.Range(minTime, maxTime);
                  var randomObstacle = Random.Range(0, obstacles.Length);
                  yield return new WaitForSeconds(randomTime);
                  var obstacle = Instantiate(obstacles[randomObstacle], transform.position, Quaternion.identity);
                  obstacle.GetComponent<Obstacle>().speed = speed;
                  Destroy(obstacle, 10f);
              }
      
              // These lines are automatically reached after every 5 iterations
              // no need for any módulo or other magic check
              speed += 5f;
          }
          while (true);
      }
      

      虽然对我来说,你的速度究竟会增长到什么程度还不太清楚。根据您的描述,听起来您想在每组迭代之后添加5 .. 但这意味着您对于第 100 个对象的速度 = 100 (20*5) .. 而不是您所写的速度 = 1000

      【讨论】:

        【解决方案4】:

        我能想到的最简单的事情是为生成的障碍物设置一个计数器,并在达到 5 后增加速度并将计数器重置为零。您真的不需要为了这么简单的事情而陷入花哨的事情,只需使用 if 语句来检查计数器。希望我有所帮助,干杯!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-28
          相关资源
          最近更新 更多