Как решить эту проблему с движением / анимацией единства 2-го бокового скроллера - PullRequest
0 голосов
/ 07 февраля 2019

Итак, я создаю свою первую игру в единстве, и сейчас я работаю над движением слева направо.

  • Я двигаюсь влево, отпускаю кнопку со стрелкой влево -> холостая анимация.

  • Нажмите стрелку вправо, и символ переместится вправо, отпустите -> холостой ход.

Проблема в том, что мне нужно подождать, пока не начнется анимация, прежде чем я смогу нажать, чтобы перейти в другое выбранное направление.Когда я нажимаю влево и вправо, персонаж не двигается.

Я хотел бы сделать следующее:

  • нажмите влево -> символ переместится влево, а затем

  • нажмитев то же время -> персонаж идет правильно.

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

Код анимации:

if (Input.GetKeyDown(KeyCode.LeftArrow)) 
{
    this.GetComponent<Animator>().SetInteger("pallotila", 1);
}

if (Input.GetKeyUp(KeyCode.LeftArrow))
{
    this.GetComponent<Animator>().SetInteger("pallotila", 0);
}

if (Input.GetKeyDown(KeyCode.RightArrow))
{
    this.GetComponent<Animator>().SetInteger("pallotila", 2);
}

if (Input.GetKeyUp(KeyCode.RightArrow))
{
    this.GetComponent<Animator>().SetInteger("pallotila", 0);
}

Код движения игрока:

if (Input.GetKey(KeyCode.LeftArrow))
{
    this.transform.position += Vector3.left * this.nopeus * Time.deltaTime;
    this.transform.rotation = this.vasemmalle;
}

if (Input.GetKey(KeyCode.RightArrow))
{
    this.transform.position += Vector3.right * this.nopeus * Time.deltaTime;
    this.transform.rotation = this.oikealle;
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете изменить переменную «Значение» на

    animator.SetInteger("pallotila", 0);
    break;

в расположении

value = 0;
break;

или изменить

int value;

на

int value = 0;

в коде @ derHugo

0 голосов
/ 07 февраля 2019

Обратите внимание, что вы никогда не должны использовать GetComponent в Update, лучше сделайте это один раз и повторно используйте ссылку.

//Here you store the Animator reference
private Animator animator;

private void Awake()
{
    animator = GetComponent<Animator>();
}

Я также использовал бы switch, чтобы определить, что должно произойти, для которогочтобы избежать повторного ввода одного и того же кода.

private void SetLastPressed(KeyCode code)
{
    int value = 0;
    switch (code)
    {
        case KeyCode.None:
            value = 0;
            break;

        case KeyCode.LeftArrow:
            value = 1;
            break;

        case KeyCode.RightArrow:
            value = 2;
            break;
    }

    animator.SetInteger("pallotila", value);
    lastPressed = code;
}

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

// Here you store the last pressed key
private KeyCode lastPressed = KeyCode.None;

private void Update()
{

    if (lastPressed != KeyCode.LeftArrow && Input.GetKeyDown(KeyCode.LeftArrow))
    {
        SetLastPressed(KeyCode.LeftArrow);
    }
    else if (lastPressed != KeyCode.RightArrow && Input.GetKeyDown(KeyCode.RightArrow))
    {
        SetLastPressed(KeyCode.RightArrow);
    }

    // If none of the keys is pressed reset
    else if (lastPressed != KeyCode.None && !Input.GetKey(KeyCode.LeftArrow) && !Input.GetKey(KeyCode.RightArrow))
    {
        SetLastPressed(KeyCode.None);
    }

    // And if only one of them is released but the other one still pressed
    //go on using that still pressed key again
    else if (lastPressed != KeyCode.LeftArrow && Input.GetKeyUp(KeyCode.RightArrow) &&
             Input.GetKey(KeyCode.LeftArrow))
    {
        SetLastPressed(KeyCode.LeftArrow);
    }
    else if (lastPressed != KeyCode.RightArrow && Input.GetKeyUp(KeyCode.LeftArrow) &&
             Input.GetKey(KeyCode.RightArrow))
    {
        SetLastPressed(KeyCode.RightArrow);
    }

Для движения вы можете просто повторно использовать значение lastPresses, а также

    if(lastPressed == KeyCode.LeftArrow)
    {
        transform.position += Vector3.left * nopeus * Time.deltaTime;
        transform.rotation = vasemmalle;
    }
    else if (lastPressed == KeyCode.RightArrow)
    {
        transform.position += Vector3.right * nopeus * Time.deltaTime;
        transform.rotation = oikealle;
    }

Кроме того, вы можете / должны использовать List<KeyCode> для хранения последнегопрессы.Каждый раз, когда кнопка опускается, добавляйте кнопку в конец списка;каждый раз, когда кнопка поднимается, удаляйте ее из списка

result => последняя нажатая кнопка всегда является последней в списке.

Это делает возврат к предыдущей кнопке более простым игибкий без добавления / изменения такого количества строк кода, как

private List<KeyCode> lastPresses = new List<KeyCode>();
private KeyCode lastPressed = KeyCode.None;

private Animator animator;

private void Awake()
{
    animator = GetComponent<Animator>();
}

private void SetLastPressed(KeyCode code)
{
    int value = 0;
    switch (code)
    {
        case KeyCode.None:
            value = 0;
            break;

        case KeyCode.LeftArrow:
            value = 1;
            break;

        case KeyCode.RightArrow:
            value = 2;
            break;
    }

    animator.SetInteger("pallotila", value);
    lastPressed = code;
}

private void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        if (!lastPresses.Contains(KeyCode.LeftArrow)) lastPresses.Add(KeyCode.LeftArrow);
    }
    else if (Input.GetKeyUp(KeyCode.LeftArrow))
    {
        if (lastPresses.Contains(KeyCode.LeftArrow)) lastPresses.Remove(KeyCode.LeftArrow);
    }

    if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        if (!lastPresses.Contains(KeyCode.RightArrow)) lastPresses.Add(KeyCode.RightArrow);
    }
    else if (Input.GetKeyUp(KeyCode.RightArrow))
    {
        if (lastPresses.Contains(KeyCode.RightArrow)) lastPresses.Remove(KeyCode.RightArrow);
    }

    var currentCode = lastPresses.Count > 0 ? lastPresses[lastPresses.Count - 1] : KeyCode.None;

    if (currentCode != lastPressed) SetLastPressed(currentCode);

    if (lastPressed == KeyCode.LeftArrow)
    {
        transform.position += Vector3.left * nopeus * Time.deltaTime;
        transform.rotation = vasemmalle;
    }
    else if (lastPressed == KeyCode.RightArrow)
    {
        transform.position += Vector3.right * nopeus * Time.deltaTime;
        transform.rotation = oikealle;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...