Спрайт движется только в одном направлении, когда удерживаются две кнопки

avatar
Jack Hengen
9 августа 2021 в 03:55
41
1
0

Я пытаюсь заставить свой спрайт время от времени перемещаться на единицу. Он работает до тех пор, пока несколько клавиш не будут удерживаться одновременно. В этом случае он движется в одном направлении, в зависимости от того, какое направление запрограммировано первым в коде. Мне кажется, что мой спрайт должен двигаться в обоих направлениях, поскольку операторы if не являются операторами if else. Если я иду вверх и влево, он ДОЛЖЕН двигаться на 1 единицу вверх и на 1 единицу влево. Как я могу заставить его это сделать?

public Transform timmyTransform;
private float timer= 0;
public float movementDelay;


void Update()
{

    timer += Time.deltaTime;
    if (Input.GetAxis("Vertical") < 0 && timer > movementDelay)
    {
        timer = 0;
        timmyTransform.transform.position += new Vector3(0, -1, 0);
    }
    if (Input.GetAxis("Vertical") > 0 && timer > movementDelay)
    {
        timer = 0;
        timmyTransform.transform.position += new Vector3(0, 1, 0);
    }
    if (Input.GetAxis("Horizontal") < 0 && timer>movementDelay)
    {
        timer = 0;
        timmyTransform.transform.position += new Vector3(-1, 0, 0);
    }
    if(Input.GetAxis("Horizontal") > 0 && timer > movementDelay)
    {
        timer = 0;
        timmyTransform.transform.position += new Vector3(1, 0, 0);
    }

    
   

Источник
Alphaharrius
9 августа 2021 в 03:59
1

Хм, вы, кажется, установили timer = 0, поэтому последующая проверка для timer > movementDelay вернет false и пропустит остальные направления. (Я думаю, movementDelay никогда не будет отрицательным...)

Zer0
9 августа 2021 в 04:01
2

Добавляя к комментарию @Alphaharrius, вы, вероятно, хотите bool moved, установите для него значение true, если вы нажмете один из этих блоков, а затем в конце обнулите таймер.

Ответы (1)

avatar
derHugo
9 августа 2021 в 06:08
0

Ваша проблема в timer.

Вы всегда устанавливаете его на 0, поэтому после первого нажатия кнопки другие условия никогда не выполняются.

Я бы предпочел сделать что-то вроде, например,

timer += Time.deltaTime;
// Get and store the Input ONCE
var vertical = Mathf.Sign(Input.GetAxis("Vertical"));
var horizontal = Mathf.Sign(Input.GetAxis("Horizontal"));
// directly get the movement as a vector so you can use vector maths
var movement = new Vector2(horizontal, vertical);

// Check whether there currently is any input and timer is due
if (movement.sqrMagnitude > 0 && timer > movementDelay)
{
    timer = 0;

    // directly use the movement as it is already the vector based on the input
    timmyTransform.transform.position += movement;
}