【问题标题】:How do I spawn an item using Random.Range, but have the waiting time change after each spawn?如何使用 Random.Range 生成项目,但每次生成后等待时间发生变化?
【发布时间】:2019-10-07 08:19:58
【问题描述】:

我的概念很简单:我正在生成对象。我有三个浮点数:RunEvery、BetweenThis 和 AndThis。我可以得到一个值作为回报,但我无法更改这个值。我每次都想要一个新的随机数,但我总是得到相同的初始值。

RunEvery = Random.Range(BetweenThis, AndThis);

假设BetweenThis 等于1,AndThis 等于20。RunEvery 然后变成1 到20 之间的任意数字。所以如果选择的数字是10,脚本将每10 秒生成一次该对象。

我不是在寻找“10、10、10、10、10...等”。

我需要“10、7、5.5、18、9...等”

public UnityEvent OnTimerEnd;

void OnEnable()
{
    SetRandomizer();
    if (RunOnAwake){
        Invoke("Execute", 0);
    }
    if (Loop){
        //SetRandomizer();
        InvokeRepeating("Execute", RunEvery, RunEvery);
    }
    else{
        Invoke("Execute", RunEvery);
    }
}

public void SetRandomizer(){
    RunEvery = Random.Range(BetweenThis, AndThis);
    Debug.Log("The Random Range is " + RunEvery);
}

public void Execute(){
    OnTimerEnd.Invoke();
    //SetRandomizer();
}

我希望它继续选择随机数,但我只能让脚本每次都重复初始值。

我尝试创建包含 Random.Range 内容的新函数,但由于某种原因,它甚至只会使用第一个生成的值。

我尝试过移动部分代码,创建一个 IEnumerator 并等待,我什至尝试打开和关闭整个脚本。我尝试了很多其他的东西,但我不会让你厌烦。

我确信这很容易解决,但这不是我自己能解决的问题。我浏览了 Scripting API 和手册以及我的 C# 书籍,但他们只谈论过使用 Random.Range 一次,而不是重复使用。

【问题讨论】:

  • 所以为了清楚起见,假设说你得到的第一个值,即 RunEvery 说 10 秒后 10 秒你想产生对象,那时你还想给 RunEvery 分配新值正确吗?
  • @PraveenPanishetti,是的。例如,假设我们有一滴水从叶子上掉下来。第一个随机数的范围在 1 到 20 秒之间。假设它随机选择数字 5。5 秒后,雨滴会产生并落下。选择 1 到 20 之间的新随机数。假设它随机选择 17 秒。第一次掉落17秒后,第二次掉落。将选择一个新的随机数,并以这种方式继续下降。目前,我只能保留初始计算的使用,即使我重新设置了值。

标签: c# unity3d random


【解决方案1】:

Random.Range 给你一个int,在你生成它之后它不会改变。例如:

int rand = Random.Range(0, 10);
Debug.Log(rand); // 4

rand 是一个保存值 4 的变量。它不保存生成另一个随机数的代码。如果你想创建一个新的随机数,你必须再次运行 Random.Range() 。在上面的代码中,您只是存储随机数的结果并一遍又一遍地使用它。

此外,InvokeRepeating() 将在每次后续调用中使用您提供给它的相同号码。如果您希望它是随机的,您需要每次使用不同的号码手动调用Invoke()

您可以将其嵌套为循环调用的简单方法:

void Start
{
     Invoke("Execute", 0);
}

void Execute()
{
      float randTime = Random.Range(your min, your max )

      // do you code

      if (Loop)
          Invoke("Execute", randTime);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多