Así que aquí está la cosa. Tengo un juego en el que tengo un generador: para generar obstáculos. Y quiero después de cada 5 obstáculos para aumentar la velocidad. Ejemplo: los obstáculos 1, 2, 3, 4, 5 tienen una velocidad predeterminada = 5 y quiero que los obstáculos 6, 7, 8, 9, 10 tengan una velocidad aumentada a velocidad = 10, etc. Ya tengo algunas declaraciones if anidadas, pero Quiero aumentar la velocidad infinitamente, por ejemplo, para tener una velocidad = 1000 para el obstáculo número 100. Aquí está mi código:
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; }El operador de módulo % ayuda con cosas como esta. Da el resto de la operación de división, por ejemplo:
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 Entonces, si su x comienza en 0 y desea aumentar la velocidad cada 5, solo mire cada vez que el módulo sea 4.
x puede ir tan alto como quieras (bueno, int.MaxValue) pero el módulo siempre será 0..4:
//do some stuff //should we increase speed? if(x % 5 == 4) IncreaseSpeed(); También es una herramienta útil para crear matrices circulares... someArray[i % someArray.Length] nunca se saldrá de los límites, porque el resultado de un módulo siempre está entre 0 y uno menos que la longitud
Lo que podrías hacer en su lugar es:
% . Puede consultar más información aquí: https://blog.mattclemente.com/2019/07/12/modulus-operator-modulo-operation.htmlUna introducción rápida a Modulos:
//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 RestTienes un Coroutine en un bucle infinito de todos modos ... ¿por qué no simplemente hacer
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); } O como no estoy seguro de todo este asunto de FindObjectWithTag ... en realidad me parece que es el mismo objeto que instanciaste, ¿verdad? Entonces, ¿por qué no simplemente
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); } Aunque para mí no está claro cómo crecerá exactamente tu velocidad. Según su descripción, parece que desea agregar 5 después de cada grupo de iteraciones ... sin embargo, esto significaría que tiene velocidad = 100 (20 * 5) para el objeto número 100 ... no velocidad = 1000 como escribió