Как применить интервал / задержку для цикла for в Unity - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь начать свою сцену со случайного числа из 1-3, генерируемого в цикле for.

Я намерен, чтобы число было случайным каждый раз, однако я не хочу 't те же самые два числа, которые должны быть сгенерированы непосредственно друг за другом, вместо этого сначала генерируется случайное число между 1-3, затем ждет 60 секунд, генерируя случайное число между 1-3, исключая последнее сгенерированное число.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KOTH_ZoneRandom : MonoBehaviour
{
    int Rand;
    int Lenght = 4;
    List<int> list = new List<int>();
    void Start()
    {
        list = new List<int>(new int[Lenght]);

        for (int j = 1; j < Lenght; j++)
        {

            Rand = Random.Range(1, 4);

            while (list.Contains(Rand))
            {
                Rand = Random.Range(1, 4);
            }

            list[j] = Rand;
            print(list[j]);
        }

    }
}

Редактировать предпринята попытка реализовать подпрограмму, которая будет действовать как интервал для цикла.однако он все еще не работает, его выводит на консоль, поэтому определенно выполняется подпрограмма, однако функция WaitForSeconds, похоже, не работает.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KOTH_ZoneRandom : MonoBehaviour
{
    int Rand;
    int Length = 4;
    List<int> list = new List<int>();
    void Start()
    {
        list = new List<int>(new int[Length]);

        for (int j = 1; j < Length; j++)
        {
            StartCoroutine(loopDelay());
            Rand = Random.Range(1, 4);

            while (list.Contains(Rand))
            {
                Rand = Random.Range(1, 4);
            }

            list[j] = Rand;
            print(list[j]);
        }

    }
    IEnumerator loopDelay ()
    {

        print("started delay");
        yield return new WaitForSeconds(60);
    }
}

Ответы [ 4 ]

2 голосов
/ 09 мая 2019
  1. Метод запуска может быть сопрограммой, поэтому измените тип возврата на IEnumerator.

  2. Добавьте yield return new WaitForSeconds(60); в конце цикла for.

IEnumerator Start()
{
    list = new List<int>(new int[Lenght]);

    for (int j = 1; j < Lenght; j++)
    {
        Rand = Random.Range(1, 4);

        while (list.Contains(Rand))
        {
            Rand = Random.Range(1, 4);
        }

        list[j] = Rand;
        print(list[j]);

        yield return new WaitForSeconds(60);
    }
}
1 голос
/ 09 мая 2019
void start() {
    StartCoroutine(KothTimer());
}

IEnumerator KothTimer() {

    var wait = new WaitForSeconds(HillSwitchDelay);

    while(enabled) {
        var chosenHill = ListOfHills[Random.Range(0, ListOfHills.count)];
        SetActiveHill(chosenHill);
        yield return wait;
    }
}
0 голосов
/ 09 мая 2019

Хорошо, я скину свой "не последний элемент", и рекурсивный процесс можно решить просто.

private int currentValue = -1;
private List<int> list = new List<int>(){ 0, 1, 2 };
void Start()
{
     // Set current value
     this.currentValue = this.list[Random.Range(0, this.list.Count)];
     // invoke SetValue in 60 seconds
     Invoke("SetValue", 60f);
}

void SetValue()
{
     // store current value
     int temp = this.currentValue;
     // remove current value so it can't be picked
     this.list.Remove(temp);
     // set a new value, current value cannot be picked since it got removed
     this.currentValue = this.list[Random.Range(0, this.list.Count)];
     // current value is set, previous value is pushed back in the list
     this.list.Add(temp);
     // invoke SetValue in 60 seconds
     Invoke("SetValue", 60f);
}
void OnDestroy()
{
     // object is destroyed (could be OnDisable), remove the invoke
     CancelInvoke("SetValue");
}
0 голосов
/ 09 мая 2019

Улучшение ответа Шинго здесь с точки зрения производительности (мне не нравится этот цикл while, потому что хотя он в конечном итоге и закончится, он только вероятностно связан с наихудшим сценарием ^^. Ofc это работает, это простонекрасиво):

using System.Linq;

void start()
{
    StartCoroutine(KothTimer());
}

IEnumerator KothTimer()
{
    System.Random rnd= new System.Random();
    var oneToFourShuffled = (new int[4]{1,2,3,4}).OrderBy(x => rnd.Next()).ToArray();

    for (int j = 0; j < Length; j++)
    {
        list[j] = oneToFourShuffled[j];
        print(list[j]);

        yield return new WaitForSeconds(60);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...