当您希望数字小于 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 值,因此使用第二个重载,结果将是 12 - 1 之间的 int ...这里没有太多选择;)

也是你的尝试

Random.Range(1/2, 2);

又是int值! 1/2 是一个 整数除法 结果是 0!所以这个随机数可以 return 01.


您更想做的是传递 float 值,例如

Random.Range(1f, 2f);

这可能导致 12 之间的任何浮点值或相应的

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