Есть ли способ вырваться из функции Update () - PullRequest
0 голосов
/ 06 марта 2020

Итак, я пытаюсь создать свой собственный скрипт движения для Unity с компонентом Rigidbody, прикрепленным к моему персонажу, и я использую этот код внутри функции обновления:

// Up above, in public scope, before Start and Update functions
public float speed = 1f;
public Rigidbody body;

void Update() {
    if (Input.GetKey(KeyCode.LeftArrow())) { // Left arrow key
        body.AddForce(transform.forward * speed * Time.deltaTime);
    }
}

Моя проблема если он находится внутри функции Update (), он продолжает работать, он продолжает вращаться, даже если у меня не нажата клавиша.

Кто-нибудь знает, как решить эту проблему? Я пытался убрать Time.deltaTime, но Brackeys сказал, что вы используете его так, чтобы он зависел от частоты кадров, поэтому, если у вас более высокая частота кадров, она не поворачивается быстрее, и то же самое с низкой частотой кадров, вы поворачиваете медленнее. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Он продолжает вращаться даже после отпускания ключа? Да, это то, что будет делать AddForce.
После того, как вы примените силу к объекту, он будет продолжать двигаться, основываясь на той силе, если у него нет сопротивления или противодействующей силы. Go в жесткое тело, чтобы установить перетаскивание или создать скрипт, который применяет противодействующую силу, как только вы перестанете нажимать кнопку.

Если вы поместите Debug.Log в оператор if, вы увидите, что это не вызывается каждый кадр, но только когда вы удерживаете кнопку нажатой.
И последнее, я не думаю, что ваш код ключа должен иметь () после LeftArrow, разве это не вызывает ошибку?

0 голосов
/ 06 марта 2020

У вас есть два вопроса, один на заголовок и другой на описание.

Для заголовка:

Единственный способ остановить / прервать обновление Цикл () - отключение сценария, например:

enabled = false;

Для первого описания:

Необходимо остановить силу, приложенную к объекту (как остальные ответы иллюстрируют). Вы можете применить противоположную силу или просто установить скорость на 0.

 rigidbody.velocity = Vector3.zero;
0 голосов
/ 06 марта 2020

Объект в движении остается в движении с той же скоростью и в том же направлении, если на него не действует несбалансированная сила. ---- Исаа c Ньютон

Итак, если вы хотите остановить объект, вы можете сделать:

  1. Добавить противоположную силу

    if (Input.GetKey(KeyCode.LeftArrow())) {
        ...
    } else if (!body.IsSleeping()) {
        body.AddForce(-body.velocity * factor);
    }
    
  2. Дайте значение сопротивления

    body.drag = dragValue;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...