После того, как я добавил этот оператор for, Unity падает, я открывал и запускал его несколько раз, но он все еще падает. Вот инструкция for:
for (i = 0; i < 20; i++)
{
player.transform.position += Vector3.right * -1;
i = 0;
}
@BugFinder Причина, по которой я это сделал, заключалась в том, что я думал, что это единственный способ иметь повторяющуюся функцию, которая будет иметь какую-то задержку. Какой метод лучше?
Нет. Это не даст ни малейшей задержки, просто постоянно будет делать первое дело и никогда не останавливаться. Найдите сопрограммы. Они позволяют уступать и фактически приостанавливать их на время без полной гибели единства. Если вы хотите, чтобы он работал постоянно, вы можете сделать это, но есть много других способов добиться вечного цикла без бесконечного цикла змеи, пожирающей свой хвост. Вы можете просто сделать пока правда; что-нибудь; дайте несколько секунд, и он будет делать это через восемь секунд между каждым циклом, если вы используете сопрограммы
Ваш цикл работает бесконечно. На каждой итерации вы устанавливаете свою переменную счетчика обратно в 0, поэтому она никогда не останавливается и продолжает уменьшать позицию вашего игрока. Вы пытались принудительно завершить цикл в какой-то момент, чтобы увидеть, не падает ли ваша программа по-прежнему?
Проблема в том, что я хочу, чтобы он работал бесконечно. Опять же, я новичок, поэтому, если есть лучший способ справиться с повторяющейся функцией с задержкой, я был бы рад, если бы вы мне сказали.
Ваш код приводит к бесконечному циклу. Если вы хотите иметь повторяющуюся функцию с задержкой, вы можете использовать Корутина. YieldИнструкция (yield return new WaitForSeconds(waitTime)
в примере документа Unity) определяет время ожидания. Образец кода в документе печатается бесконечно с задержкой в 2 секунды; однако переписывание условия цикла while
— это один из способов, который поможет вам определить, когда заканчивается сопрограмма.
Другой способ добиться этого — использовать асинхронно/ожидание. Однако инструкции, которые вы можете использовать для await, не так богаты, как инструкции yield. Более того, в последний раз, когда я проверял, код while true со статусом печати продолжает печатать, даже когда единство больше не находится в режиме воспроизведения.
это работает. Но я нашел лучшее решение для моей ситуации.
Ну конечно у вас программа вылетает, у вас бесконечный цикл из-за постоянного сброса
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;
}
Все бесконечные циклы разрушают единство. Почему вы хотите сделать это