Мне просто нужен простой способ отложить цикл while. Я использую С#. Вот мой код:
while (value<101)
{
Debug.Log(value);
value = value + 10;
//delay here (that i don't know how to do)
}
Я использовал немного переводчика Google, поэтому текст может быть плохим.
Thread.Sleep(timeInMilliSeconds) learn.microsoft.com/en-us/dotnet/api/…
@dmedine Я бы настоятельно рекомендовал не использовать Thread.Sleep() в Unity, так как это приостановит всю игру и заморозит другие сценарии (если вы этого не хотите).
@SetupWizard Спасибо за разъяснение. Я не знал, что у Unity есть такая проблема. Thread.Sleep — это универсальный способ приостановить цикл в .NET.
@dmedine ну да, конечно Thread.Sleep — это общий способ полностью приостановить обсуждение. Дело в том, что вы, конечно же, не хотите приостанавливать основной поток пользовательского интерфейса приложения;) И в Unity, если вы явно не укажете, что по умолчанию все работает в основном потоке, и, кроме того, большая часть API доступна только в основном потоке;)
Чего именно вы пытаетесь достичь? Возможно, вам вообще не нужен цикл для этого — имейте в виду, что есть Update, который запускается один раз за кадр, поэтому вы, вероятно, также можете использовать простой счетчик, который немного увеличивается в каждом кадре и когда он превышает определенное значение (ваша желаемая задержка) вы увеличиваете value





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 пытается достичь, это может быть проблемой здесь
вы можете сделать это, используя функцию 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;
}
}
Почему? Вы не должны пытаться блокировать вещи