当您希望数字小于 1 时,如何在协程中加速 WaitForSeconds?
How do you speed up WaitForSeconds in a coroutine when you want the number to be less than 1?
我正在尝试创建一个程序,它会在随机时间从顶部随机生成球。问题是它不够快,但如果我将值更改为 1/2,它会超快地生成 50 个。
using System.Collections.Generic;
using UnityEngine;
public class SpawnAstroids : MonoBehaviour
{
public GameObject astriod;
public float xBounds, yBounds;
public int playerPoints = 0;
public int enemyPoints = 0;
void Start()
{
StartCoroutine(SpawnRandomGameObject());
}
IEnumerator SpawnRandomGameObject()
{
yield return new WaitForSeconds(Random.Range(1,2)); //Random.Range(1/2, 2)
Instantiate(astriod, new Vector2(Random.Range(-xBounds, xBounds), yBounds), Quaternion.identity);
StartCoroutine(SpawnRandomGameObject());
}
}
Unity C# 要求您指定小数点具体是浮点数还是双精度数。在每个十进制数的末尾添加 f
。例如:Random.Range(0.5f, 2)
;
(次要注意 Random.Range
是包含还是排除取决于您使用的是整数还是浮点数。)
类似地,当你定义一个Vector2 bob = new Vector2(0.5f,0);
时,也需要f
来明确表示它是一个浮点数。
Random.Range
有两个重载。
public static float Range(float minInclusive, float maxInclusive);
和
public static int Range(int minInclusive, int maxExclusive);
你正在传递
Random.Range(1, 2);
这是两个 int
值,因此使用第二个重载,结果将是 1
和 2 - 1
之间的 int
...这里没有太多选择;)
也是你的尝试
Random.Range(1/2, 2);
又是int
值! 1/2
是一个 整数除法 结果是 0
!所以这个随机数可以 return 0
或 1
.
您更想做的是传递 float
值,例如
Random.Range(1f, 2f);
这可能导致 1
和 2
之间的任何浮点值或相应的
Random.Range(0.5f, 2);
或回到你的尝试
Random.Range(1 / 2f, 2);
现在使用 float
除法,因此结果自动为 float
,因此将使用第一个重载。
顺便说一句,一般来说,不需要递归调用协程,你可以简单地循环下去,还要注意 Start
本身可以是协程,例如
private IEnumerator Start()
{
while(true)
{
yield return new WaitForSeconds(Random.Range(0.5f, 2f));
Instantiate(astriod, new Vector2(Random.Range(-xBounds, xBounds), yBounds), Quaternion.identity);
}
}
我正在尝试创建一个程序,它会在随机时间从顶部随机生成球。问题是它不够快,但如果我将值更改为 1/2,它会超快地生成 50 个。
using System.Collections.Generic;
using UnityEngine;
public class SpawnAstroids : MonoBehaviour
{
public GameObject astriod;
public float xBounds, yBounds;
public int playerPoints = 0;
public int enemyPoints = 0;
void Start()
{
StartCoroutine(SpawnRandomGameObject());
}
IEnumerator SpawnRandomGameObject()
{
yield return new WaitForSeconds(Random.Range(1,2)); //Random.Range(1/2, 2)
Instantiate(astriod, new Vector2(Random.Range(-xBounds, xBounds), yBounds), Quaternion.identity);
StartCoroutine(SpawnRandomGameObject());
}
}
Unity C# 要求您指定小数点具体是浮点数还是双精度数。在每个十进制数的末尾添加 f
。例如:Random.Range(0.5f, 2)
;
(次要注意 Random.Range
是包含还是排除取决于您使用的是整数还是浮点数。)
类似地,当你定义一个Vector2 bob = new Vector2(0.5f,0);
时,也需要f
来明确表示它是一个浮点数。
Random.Range
有两个重载。
public static float Range(float minInclusive, float maxInclusive);
和
public static int Range(int minInclusive, int maxExclusive);
你正在传递
Random.Range(1, 2);
这是两个 int
值,因此使用第二个重载,结果将是 1
和 2 - 1
之间的 int
...这里没有太多选择;)
也是你的尝试
Random.Range(1/2, 2);
又是int
值! 1/2
是一个 整数除法 结果是 0
!所以这个随机数可以 return 0
或 1
.
您更想做的是传递 float
值,例如
Random.Range(1f, 2f);
这可能导致 1
和 2
之间的任何浮点值或相应的
Random.Range(0.5f, 2);
或回到你的尝试
Random.Range(1 / 2f, 2);
现在使用 float
除法,因此结果自动为 float
,因此将使用第一个重载。
顺便说一句,一般来说,不需要递归调用协程,你可以简单地循环下去,还要注意 Start
本身可以是协程,例如
private IEnumerator Start()
{
while(true)
{
yield return new WaitForSeconds(Random.Range(0.5f, 2f));
Instantiate(astriod, new Vector2(Random.Range(-xBounds, xBounds), yBounds), Quaternion.identity);
}
}