2016-11-23 3 views
4

Я нахожусь на своем третьем дне обучения Unity и в настоящее время делаю roll-a-ball tutorial. Я пытаюсь добавить кнопку перезапуска, которая телепортирует мяч обратно в исходное положение/происхождение. Все работает хорошо, но мяч будет продолжать двигаться после перезапуска, но я хочу, чтобы он остался в месте и не двигался сам по себе.Как остановить сферу от перемещения самостоятельно после перезапуска его положения?

То, что я хочу сказать, что если я двигаюсь влево на максимальной скорости и нажимаю 'R' для перезапуска, то он будет продолжать двигаться влево на некоторое время, но я хочу добиться того, что мяч не будет продолжать двигаясь сам по себе после того, как я перезапущу его положение (возможно, скорость просто снижается настолько медленно, что это незаметно, и в этом случае я бы хотел, чтобы она замедлялась быстрее).

Вот мой код, который я только что пробовал и «надеялся» будет работать, но этого не делает. Я думаю, что проблема, которую я имею здесь, заключается в том, что новое значение осиHorizontal/axisVertical variable снова присваивается следующему кадру, значение берется из Input.GetAxis, что из того, что я слышал, невозможно изменить.

Это означает, что движениеForce больше 0/0/0 и AddForce будет снова активировано следующего кадра.

using UnityEngine; 
using System.Collections; 

public class PlayerScript : MonoBehaviour { 

    public float movementSpeed = 7f; 
    private Rigidbody rigidSphere; 

    void Start() { 
     rigidSphere = GetComponent<Rigidbody>(); 
    } 

    void FixedUpdate() { 
     float axisHorizontal = Input.GetAxis("Horizontal"); 
     float axisVertical = Input.GetAxis("Vertical"); 

     Vector3 movementForce = new Vector3(axisHorizontal, 0.0f, axisVertical); 
     rigidSphere.AddForce(movementForce * movementSpeed); 

     if (Input.GetKeyDown(KeyCode.R)) { 
      transform.position = new Vector3(0, 0, 0); 
      rigidSphere.AddForce(0, 0, 0); 
      axisHorizontal = 0; 
      axisVertical = 0; 
     } 
    } 
} 

Я пытался прибегая к помощи о том, как изменить значение, взятое из GetAxis, но другие утверждают, что это невозможно сделать. Поэтому я понятия не имею, как заставить его не продолжать двигаться навсегда ...

И у меня также появился «бонусный» вопрос, возникший в течение этих двух дней, когда я изучал единство, но они не стоят отдельный вопрос, возможно, если они уже ответили ранее (я не смог найти документацию, которая бы мне помогла мне), то просто дайте мне ссылку, где я могу найти ответ на мою проблему.

Вопрос в том, что как заставить мяч прекратить движение через некоторое время после того, как я нажму кнопку (W/A/S/D, значения по умолчанию для положительных/отрицательных кнопок в Input Manager)? Например, я нажимаю «W» всего на секунду, но мяч будет продолжать двигаться вперед навсегда и никогда не остановится.

Что я хочу достичь после того, как я, например, нажимаю «W» на секунду, через несколько секунд мяч полностью остановится, просто кажется, что значение GetAxis никогда не возвращается к 0. Я попытался Google об этом, и я думаю, что это как-то связано с Gravity в Input Manager - я попытался изменить его, но мяч все равно будет двигаться навсегда, единственное, что я заметил, - это изменение скорости.

Я был бы очень благодарен, если бы кто-то помог мне с этими проблемами.

+0

Я бы сказал, что на R, выяснить силу сферы и применять равный в противоположном направлении (но не спрашивайте меня как). –

ответ

4

Я пытаюсь добавить кнопку перезапуска, которая телепортирует мяч обратно в начальную позицию/происхождение. Все работает хорошо, но мяч будет держать , перемещаясь после перезапуска, но я хочу, чтобы он остался на месте и не переместил сам по себе.

Я вижу, что вы пытались решить эту проблему, используя rigidSphere.AddForce(0, 0, 0);. Это добавит только 0,0,0 к существующей силе, на которую движется мяч. Решением этого является установка скорости Rigidbody на 0.

Заменить rigidSphere.AddForce(0, 0, 0); с rigidSphere.velocity = Vector3.zero;

Даже если вы сделаете это, Input.GetAxis значение увеличивается и уменьшается с течением времени до достижения 0. Таким образом, на следующем кадре мяч может все еще двигаться из-за этого.

Чтобы остановить это, также замените Input.GetAxis на Input.GetAxisRaw.

Input.GetAxisRaw будет незамедлительно возвращаться к 0, когда ключ отпущен.

То, что я хочу достигнуть, после того как я, например, нажмите «W» в течение секунды, после нескольких секунд мяч будет полностью остановить, это только кажется, что значение из GetAxis никогда не возвращается к 0.

Поскольку мяч катится, вам необходимо увеличить угловое сопротивление мяча. Это приведет к остановке шара после отпускания ключа. Угловое сопротивление находится на Жесткой стороне, прикрепленной к мячу. Также увеличьте сопротивление, если этого недостаточно.

enter image description here

+0

Спасибо! Единственное, что я заметил, это то, что мяч будет двигаться чуть больше, потому что будет установлена ​​небольшая ось Horizontal/Vertical. Есть ли способ сделать мяч полностью неспособным перемещаться (замораживаться), например, 0,5 секунды? –

+0

Конечно, замените 'Input.GetAxis'' Input.GetAxisRaw'. Это должно убить его полностью. Дай мне знать. – Programmer

Смежные вопросы