Как поставить задержку в цикле while в Unity?

Мне просто нужен простой способ отложить цикл while. Я использую С#. Вот мой код:

while (value<101)
{
    Debug.Log(value);
    value = value + 10;
    //delay here (that i don't know how to do)
}

Я использовал немного переводчика Google, поэтому текст может быть плохим.

Почему? Вы не должны пытаться блокировать вещи

Daniel A. White 20.07.2023 03:24
Thread.Sleep(timeInMilliSeconds) learn.microsoft.com/en-us/dotnet/api/…
dmedine 20.07.2023 03:34

@dmedine Я бы настоятельно рекомендовал не использовать Thread.Sleep() в Unity, так как это приостановит всю игру и заморозит другие сценарии (если вы этого не хотите).

SetupWizard 20.07.2023 03:38

@SetupWizard Спасибо за разъяснение. Я не знал, что у Unity есть такая проблема. Thread.Sleep — это универсальный способ приостановить цикл в .NET.

dmedine 20.07.2023 04:33

@dmedine ну да, конечно Thread.Sleep — это общий способ полностью приостановить обсуждение. Дело в том, что вы, конечно же, не хотите приостанавливать основной поток пользовательского интерфейса приложения;) И в Unity, если вы явно не укажете, что по умолчанию все работает в основном потоке, и, кроме того, большая часть API доступна только в основном потоке;)

derHugo 20.07.2023 09:29

Чего именно вы пытаетесь достичь? Возможно, вам вообще не нужен цикл для этого — имейте в виду, что есть Update, который запускается один раз за кадр, поэтому вы, вероятно, также можете использовать простой счетчик, который немного увеличивается в каждом кадре и когда он превышает определенное значение (ваша желаемая задержка) вы увеличиваете value

derHugo 20.07.2023 09:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Unity позволяет откладывать выполнение кода с помощью сопрограмм. Это позволяет избежать приостановки всего потока, в отличие от Thread.Sleep(). Чтобы добавить задержку в цикл while, вы можете сделать что-то вроде этого:

private IEnumerator DelayedWhileLoop()
{
    int value = 0;
    while (value < 101)
    {
        Debug.Log(value);
        value += 10;
        yield return new WaitForSeconds(1); // Delay for 1 second
    }
}

void Start()
{
    StartCoroutine(DelayedWhileLoop());
}

Чтобы добавить задержку внутри цикла while в C#, вы можете использовать метод Thread.Sleep из пространства имен System.Threading. Метод Thread.Sleep приостанавливает выполнение текущего потока на указанное время. Вот как вы можете изменить свой код, чтобы добавить задержку:

с помощью UnityEngine; использование System.Threading;

открытый класс DelayedLoop: MonoBehaviour { частное целое значение = 0;

private void Start()
{
    // Start the loop when the script is enabled (e.g., in Start or whenever needed)
    StartLoop();
}

private void StartLoop()
{
    // Use a separate thread to run the loop with a delay
    new Thread(LoopWithDelay).Start();
}

private void LoopWithDelay()
{
    while (value < 101)
    {
        Debug.Log(value);
        value += 10;

        // Add a delay of 500 milliseconds (0.5 seconds)
        Thread.Sleep(500);
    }
}

}

В приведенном выше коде я использовал Thread.Sleep(500), чтобы ввести задержку в 500 миллисекунд (0,5 секунды) между каждой итерацией цикла. Вы можете настроить продолжительность задержки, изменив аргумент, передаваемый в Thread.Sleep, в соответствии с вашими конкретными требованиями.

Хотя потоки в целом - это путь, имейте в виду, что в Unity большая часть API доступна (разрешена для использования) только в основном потоке, поэтому во многом зависит от того, чего именно OP пытается достичь, это может быть проблемой здесь

derHugo 20.07.2023 09:31

вы можете сделать это, используя функцию Unity Coroutine с задержкой. Пожалуйста, запустите любимый код. открытый класс LoopWithDelayExample: MonoBehaviour { частное логическое значение isRunning = false;

    // Start Coroutine
    public void StartCoroutineTest()
    {
        if (!isRunning)
        {
            StartCoroutine(DelayCoroutineWithLoop());
        }
    }

    // Delayed Coroutine
    private IEnumerator DelayCoroutineWithLoop()
    {
        isRunning = true;
        float loopingTime = 5f; // The duration of the loop in seconds.
        float delay = 2f; // The delay duration in seconds.

        float startTime = Time.time;
        float endTime = startTime + loopingTime;

        // Loop  for given duration
        while (Time.time < endTime)
        {
            Debug.Log("Loop is running...");
            // Wait for the next frame.
            yield return null;
        }

        // Delay for the specified duration.
        yield return new WaitForSeconds(delay);
        //Reset Vars
        isRunning = false;
    }
}

Другие вопросы по теме