C# 循环或if语句中的增量

C# 循环或if语句中的增量,c#,loops,unity3d,coroutine,C#,Loops,Unity3d,Coroutine,事情是这样的。我有一个游戏,其中我有一个产卵-产卵的障碍。我想在每第五个障碍后提高速度。示例:第一、第二、第三、第四、第五个障碍物的默认速度为5,我希望第六、第七、第八、第九、第十个障碍物的速度增加到速度为10,等等。我已经有一些嵌套的if语句,但我希望不间断地增加速度,例如,第一百个障碍物的速度为1000。这是我的密码: IEnumerator SpawnObstacles() { int i = 0; do { var randomTime = Ran

事情是这样的。我有一个游戏,其中我有一个产卵-产卵的障碍。我想在每第五个障碍后提高速度。示例:第一、第二、第三、第四、第五个障碍物的默认速度为5,我希望第六、第七、第八、第九、第十个障碍物的速度增加到速度为10,等等。我已经有一些嵌套的if语句,但我希望不间断地增加速度,例如,第一百个障碍物的速度为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;
}
IEnumerator()
{
int i=0;
做
{
var randomTime=随机范围(minTime、maxTime);
var Random障碍=随机范围(0,障碍物长度);
产生返回新WaitForSeconds(随机时间);
var障碍=实例化(障碍[RandomBorder],transform.position,Quaternion.identity);
破坏(障碍物,10f);
i++;
如果(i>=10)
{
增加速度();
如果(i>=20)
{
增加速度();
如果(i>=30)
{
增加速度();
}
}
}
}
虽然(正确);
}
私有void递增速度()
{
障碍物obs=FindObjectOfType();
obs.speed+=5f;
}

模运算符
%
有助于处理类似的问题。它给出除法运算的剩余部分,例如:

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之间

模运算符
%
有助于这样做。它给出除法运算的剩余部分,例如:

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

  • 使用一个变量(可能是一个静态变量)跟踪到目前为止生成的障碍物实例的数量,并确保使用模
    %
    简单地增加每5个实例的速度。您可以在此处查看更多信息:
模块简介:

//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个实例,如果是,则增加速度

你可以做的是:

  • 使用一个变量(可能是一个静态变量)跟踪到目前为止生成的障碍物实例的数量,并确保使用模
    %
    简单地增加每5个实例的速度。您可以在此处查看更多信息:
模块简介:

//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个实例,如果是,则增加速度

    • 无论如何,在无限循环中有一个协程。。。为什么不干脆做呢

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


      虽然对我来说,你的速度到底会增长多少还不清楚。根据您的描述,似乎您希望在每组迭代之后添加
      5
      。。但是,这意味着第100个对象的速度为100(20*5)。。不是你写的速度=1000,反正你在一个无限循环中有一个协程。。。为什么不干脆做呢

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


      虽然对我来说,你的速度到底会增长多少还不清楚。根据您的描述,似乎您希望在每组迭代之后添加
      5
      。。但是,这意味着第100个对象的速度为100(20*5)。。不是你写的速度=1000,我能想到的最简单的事情是为产生的障碍物设置一个计数器,在速度达到5后增加速度,并将计数器重置为零。你真的不需要为了这么简单的事情去做那些花哨的事情,只要用一个if语句来检查一下柜台就行了。希望我能帮上忙,干杯

      我能想到的最简单的事情就是为生成的障碍物设置一个计数器,并在速度达到5后增加速度,然后将计数器重置为零。你真的不需要为了这么简单的事情去做那些花哨的事情,只要用一个if语句来检查一下柜台就行了。希望我能帮上忙,干杯

      你可以使用模来测试每5次迭代:
      if(i%5==0)IncreaseSpeed()
      或者只是将你的速度设置为迭代次数的函数:
      obj.speed=(i/5)*5f
      注意,你说的是每5次,但是你的
      if
      s在每10次之后疯狂地提高速度。。(你的速度是5,5,5,5,5,5,5,5,5,5,5,15,25,35,45,55,65,75,85,95105125165…)你可以使用模来测试每5次迭代:
      如果(i%5==0)增加速度()
      或者只是将你的速度设置为迭代次数的函数:
      obj.speed=(i/5)*5f
      注意你说过每5次,但是你的
      if
      s每过10秒就会疯狂地提高速度。。(你的速度是5,5,5,5,5,5,5,5,5,15,25,35,45,55,65,75,85,95105125165…)