Unity возвращает вращение в 0 после отпускания кнопки - PullRequest
0 голосов
/ 12 мая 2018

У меня есть небольшая игра, которую я написал, в которой у меня есть объект, который двигается вперед и поворачивается влево и вправо.когда пользователь нажимает A объект идет влево и поворачивается влево, если пользователь нажимает D , он идет влево и поворачивается влево, то есть, чтобы установить вращение на 0 после того, как пользователь нажал клавишу

bool slowbtn = Input.GetKey("s");
bool right = Input.GetKey("d");

if (right == true)
{
    rd.AddForce(sideForce * Time.deltaTime, 0, 0,ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, 10 , 0);
}
if (Input.GetKey("a"))
{
    rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, -10 , 0);
}

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

if (Input.GetButtonUp("a"))
{
    rd.transform.eulerAngles = new Vector3(0, 0, 0);
}
if (Input.GetButtonUp("d"))
{
    rd.transform.eulerAngles = new Vector3(0, 0, 0);
}

, но это не работает, я не понимаю, почемуа также он тормозит мой предыдущий код, поэтому объект, если не движется вперед

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Когда я заменяю ваш

Input.GetButtonUp("a")

на

Input.GetKeyUp("a")

, это работает совершенно нормально.

Вы пытались отладить этот код для себя?Потому что было довольно просто понять, что Input.GetButtonUp(…) не был вызван путем установки точки останова в этой строке.

Кстати.Я хотел бы написать ваш входной код следующим образом:

if (Input.GetKey("d"))
{
    rd.AddForce(sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, 10, 0);
}
else if (Input.GetKey("a"))
{
    rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, -10, 0);
}
else
{
    rd.transform.eulerAngles = new Vector3(0, 0, 0);
}
0 голосов
/ 12 мая 2018

Unity's Input.GetButtonUp и Input.GetButtonDown обрабатывают «виртуальные» кнопки, которые вы устанавливаете в настройках ввода. Input.GetKeyUp / Input.GetKeyDown о клавишах на вашей клавиатуре. Таким образом, вы должны выбрать GetKey или GetButton, но не оба одновременно.

Как я вижу, вы хотите, чтобы ваш объект вращался все время, пока пользователь нажимает клавишу. Я предлагаю вам использовать свойство "state" в вашем классе:

private State state = State.IDLE;
private enum State {
  LEFT, RIGHT, IDLE
};

Обновите ваш код:

if (Input.GetKeyDown(KeyCode.D)) {
  state = State.RIGHT;
}
if (Input.GetKeyDown(KeyCode.A)) {
  state = State.LEFT;
}
if (Input.GetKeyUp(KeyCode.D) || Input.GetKeyUp(KeyCode.A)) {
  state = State.IDLE;
}
switch (state) {
  case State.LEFT:
    rd.AddForce(sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, 10, 0);
  break;
  case State.RIGHT:
    rd.AddForce(-sideForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    rd.transform.eulerAngles = new Vector3(0, -10 , 0);
  break;
  case State.IDLE:
    rd.transform.eulerAngles = Vector3.zero;
  break;
}

Несколько рекомендаций:

  1. Работа с физикой в ​​методе FixedUpdate () вместо Update ()
  2. Использовать перечисление Unity KeyCode для клавиш клавиатуры
  3. Держите ваш код в чистоте
  4. Сначала разработайте алгоритм, а затем преобразуйте этот алгоритм в код
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...