Как я могу сделать одну команду "переопределить" другую в Unity / C #? - PullRequest
0 голосов
/ 03 января 2019

Я делаю очень простой движок в Unity3D, используя GetKey.Я знаю, это может показаться простым, но я новичок.Ниже приведен код.Я вижу проблему, но не могу найти способ ее решить, хотя я пробовал много обходов.Заранее спасибо!

Я попытался изменить код с GetKey на GetKeyDown, но он не сработал.

void Update()
{
    bool w, a, s, d;
    w = Input.GetKey(KeyCode.W);
    a = Input.GetKey(KeyCode.A);
    s = Input.GetKey(KeyCode.S);
    d = Input.GetKey(KeyCode.D);

    if (w)
    {
        transform.Translate(0.0f, speed * Time.deltaTime, 0.0f);
    }
    if (a)
    {
        transform.Translate(-speed * Time.deltaTime, 0.0f, 0.0f);
    }
    if (s)
    {
        transform.Translate(0.0f, -speed * Time.deltaTime, 0.0f);
    }
    if (d)
    {
        transform.Translate(speed * Time.deltaTime, 0.0f, 0.0f);

    }
}

Ожидалось, что если я нажму "A", а затем нажму "D ", двигатель перемещается вправо (как будто я только нажимаю D, так как я нажал его в последний раз).В настоящее время движение отменяется, и оно остается на своем месте.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы можете определить переменные в объекте, которые будут отслеживать, какая клавиша была нажата первой.В этом случае мы изменяем эти значения на true только тогда, когда нажата эта клавиша и , а другая не нажата.

Тогда мы разрешаем движение только в направлении, если другое направление не 't удерживается или в другом направлении нажата первой.

private bool WPressedFirst = false;
private bool SPressedFirst = false;
private bool APressedFirst = false;
private bool DPressedFirst = false;

void Update()
{
    bool w, a, s, d;
    w = Input.GetKey(KeyCode.W);
    a = Input.GetKey(KeyCode.A);
    s = Input.GetKey(KeyCode.S);
    d = Input.GetKey(KeyCode.D);

    // if any key isn't being pressed, set its pressedfirst value to false
    if(!w)
    {
        WPressedFirst = false;
    }
    if(!a)
    {
        APressedFirst = false;
    }
    if(!s)
    {
        SPressedFirst = false;
    }
    if(!d)
    {
        DPressedFirst = false;
    }

    // if a key is being pressed AND the other one isn't, set it to pressedfirst true
    if(w && !SPressedFirst)
    {
        WPressedFirst = true;
    }
    if(s && !WPressedFirst)
    {
        SPressedFirst = true;
    }
    if(a && !DPressedFirst)
    {
        APressedFirst = true;
    }
    if(d && !APressedFirst)
    {
        DPressedFirst = true;
    }

    // only allow movement in a direction if it is pressed and the other isn't pressed
    // OR if it is pressed and the other was pressed first.
    if (w && (!s || SPressedFirst))
    {
        transform.Translate(0.0f, speed * Time.deltaTime, 0.0f);
    }
    if (a && (!d || DPressedFirst))
    {
        transform.Translate(-speed * Time.deltaTime, 0.0f, 0.0f);
    }
    if (s && (!w || WPressedFirst))
    {
        transform.Translate(0.0f, -speed * Time.deltaTime, 0.0f);
    }
    if (d && (!a || APressedFirst))
    {
        transform.Translate(speed * Time.deltaTime, 0.0f, 0.0f);

    }
}
0 голосов
/ 03 января 2019

Теперь я получил то, что вы хотите: новое нажатие кнопки должно отменить прежнее

Вы можете использовать сопрограммы:

private void Update()
{
    bool w, a, s, d;
    w = Input.GetKeyDown(KeyCode.W);
    a = Input.GetKeyDown(KeyCode.A);
    s = Input.GetKeyDown(KeyCode.S);
    d = Input.GetKeyDown(KeyCode.D);

    if (w)
    {
        StopAllCoroutines();
        StartCoroutine (HandleKey(KeyCode.W));
    }
    else if (a)
    {
        StopAllCoroutines();
        StartCoroutine (HandleKey(KeyCode.A));
    }
    else if (s)
    {
        StopAllCoroutines();
        StartCoroutine (HandleKey(KeyCode.S));
    }
    else if (d)
    {
        StopAllCoroutines();
        StartCoroutine (HandleKey(KeyCode.D));
    }
}

private IEnumerator HandeKey(KeyCode code)
{
    Vector3 vector;

    Switch(code)
    {
        case KeyCode.W:
            vector = new Vevtor3(0.0f, speed * Time.deltaTime, 0.0f);
            break;


        case KeyCode.A:
            vector = new Vector3(-speed * Time.deltaTime, 0.0f, 0.0f);

            break;

        case KeyCode.D:
            vector = new Vector3(speed * Time.deltaTime, 0.0f, 0.0f);
            break;

        case KeyCode.S:
            vector = new Vector3(0.0f, -speed * Time.deltaTime, 0.0f);
            break;
    }

    // Go on while the button stays pressed
    while(Input.GetKey(code))
    {
        transform.Translate(vector);
        yield return null;
    }
}

Или сделать то же самое без подпрограмм:

private KeyCode lastKeyPressed;
private Vector3 vector;

private void Update ()
{
    bool w, a, s, d;
    w = Input.GetKeyDown(KeyCode.W);
    a = Input.GetKeyDown(KeyCode.A);
    s = Input.GetKeyDown(KeyCode.S);
    d = Input.GetKeyDown(KeyCode.D);  

    if (w)
    {
        lastKeyPressed = KeyCode.W;
        vector = new Vector3(0.0f, speed * Time.deltaTime, 0.0f);
    }
    else if (a)
    {
        lastKeyPressed = KeyCode.A;
        vector = new Vector3(-speed * Time.deltaTime, 0.0f, 0.0f);
    }
    else if (s)
    {
        lastKeyPressed = KeyCode.S;
        vector = new Vector3(0.0f, -speed * Time.deltaTime, 0.0f);
    }
    else if (d)
    {
        lastKeyPressed = KeyCode.D;
        vector = new Vector3(speed * Time.deltaTime, 0.0f, 0.0f);
    }

    if(Input.GetKey(lastKeyPressed))
    {
        transform.Translate(vector);
    }
}

Но мне это не очень нравится ^^

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