Как я могу создать предмет, используя Random.Range, но время ожидания меняется после каждого появления? - PullRequest
2 голосов
/ 21 мая 2019

Моя концепция очень проста: я порождаю объекты.У меня есть три поплавка: RunEvery, BetweenThis и AndThis.Я могу получить взамен значение, но я не могу изменить это значение.Мне бы хотелось каждый раз новое случайное число, но я просто продолжаю получать одно и то же начальное значение.

RunEvery = Random.Range(BetweenThis, AndThis);

Допустим, что BetweenThis равен 1, а AndThis равен 20. RunEvery становится любымчисло от 1 до 20. Таким образом, если выбранное число равно 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 и просто ждать, и я даже попытался включить и выключить весь скрипт.Есть куча других вещей, которые я пробовал, но я не буду утомлять вас этим.

Я уверен, что это легко исправить, но это не то, что я могу понять самостоятельно.Я просмотрел API сценариев, руководство и мои книги по C #, но они когда-либо говорили об использовании Random.Range только один раз, а не несколько раз.

1 Ответ

2 голосов
/ 21 мая 2019

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...