Unity аварийно завершает работу из-за оператора for

После того, как я добавил этот оператор for, Unity падает, я открывал и запускал его несколько раз, но он все еще падает. Вот инструкция for:

for (i = 0; i < 20; i++)
{
    player.transform.position += Vector3.right * -1;
    i = 0;
}

Все бесконечные циклы разрушают единство. Почему вы хотите сделать это

BugFinder 17.03.2022 22:33

@BugFinder Причина, по которой я это сделал, заключалась в том, что я думал, что это единственный способ иметь повторяющуюся функцию, которая будет иметь какую-то задержку. Какой метод лучше?

Athsmooth 17.03.2022 23:56

Нет. Это не даст ни малейшей задержки, просто постоянно будет делать первое дело и никогда не останавливаться. Найдите сопрограммы. Они позволяют уступать и фактически приостанавливать их на время без полной гибели единства. Если вы хотите, чтобы он работал постоянно, вы можете сделать это, но есть много других способов добиться вечного цикла без бесконечного цикла змеи, пожирающей свой хвост. Вы можете просто сделать пока правда; что-нибудь; дайте несколько секунд, и он будет делать это через восемь секунд между каждым циклом, если вы используете сопрограммы

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

Ответы 3

Ваш цикл работает бесконечно. На каждой итерации вы устанавливаете свою переменную счетчика обратно в 0, поэтому она никогда не останавливается и продолжает уменьшать позицию вашего игрока. Вы пытались принудительно завершить цикл в какой-то момент, чтобы увидеть, не падает ли ваша программа по-прежнему?

Проблема в том, что я хочу, чтобы он работал бесконечно. Опять же, я новичок, поэтому, если есть лучший способ справиться с повторяющейся функцией с задержкой, я был бы рад, если бы вы мне сказали.

Athsmooth 17.03.2022 22:15
Ответ принят как подходящий

Ваш код приводит к бесконечному циклу. Если вы хотите иметь повторяющуюся функцию с задержкой, вы можете использовать Корутина. YieldИнструкция (yield return new WaitForSeconds(waitTime) в примере документа Unity) определяет время ожидания. Образец кода в документе печатается бесконечно с задержкой в ​​2 секунды; однако переписывание условия цикла while — это один из способов, который поможет вам определить, когда заканчивается сопрограмма.

Другой способ добиться этого — использовать асинхронно/ожидание. Однако инструкции, которые вы можете использовать для await, не так богаты, как инструкции yield. Более того, в последний раз, когда я проверял, код while true со статусом печати продолжает печатать, даже когда единство больше не находится в режиме воспроизведения.

это работает. Но я нашел лучшее решение для моей ситуации.

Athsmooth 18.03.2022 22:33

Ну конечно у вас программа вылетает, у вас бесконечный цикл из-за постоянного сброса

i = 0;

что в основном делает его эквивалентным

while(true)
{
    // move
}

поскольку вы никогда не выходите из этого цикла, вы никогда не позволяете Unity двигаться дальше в его выполнении -> Приложение и весь редактор Unity, который работает в одном и том же главном потоке Unity, полностью зависает.


Поскольку вы говорите, что в любом случае хотите, чтобы это происходило бесконечно, вы скорее хотите переместить это в Update, который называется один раз в каждом кадре, а затем использовать Tim.deltaTime для преобразования вашего фиксированного value per frame в value per second

// Speed in Units per second
// adjust this via the Inspector
[SerializeField] private float speed = 1;

private void Update()
{
    player.transform.position += Vector3.left * speed * Time.deltaTime;
}

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