Как деактивировать bool var, если ничего не нажимается - PullRequest
0 голосов
/ 06 июня 2019

У меня проблема с моим кодом.У меня есть спрайт, и когда я нажимаю на него, я поворачиваю другой объект.Этот объект я могу переместить влево, вправо с помощью клавиатуры.Проблема в том, что если вы продолжаете нажимать LeftArrow и одновременно нажимать, чтобы повернуть его, то объект продолжает двигаться влево, даже если вы ничего не нажимаете.

private KeyboardEventSystem kBoard;
private Dictionary<KeyCode, bool> pressed = new Dictionary<KeyCode, bool>();
[ReadOnly] public bool moving;
[ReadOnly] public bool grounded = false;

void Start()
{
    degeticaRb = GetComponent<Rigidbody2D>();

    kBoard = gameObject.AddComponent<KeyboardEventSystem>();
    kBoard.addKey(KeyCode.LeftArrow);
    kBoard.addKey(KeyCode.RightArrow);
    kBoard.addMap(KeyCode.A, KeyCode.LeftArrow);
    kBoard.addMap(KeyCode.D, KeyCode.RightArrow);
    pressed.Add(KeyCode.LeftArrow, false);
    pressed.Add(KeyCode.RightArrow, false);
    kBoard.KeyBoardEvent += KBoard_KeyBoardEvent;
}

private void KBoard_KeyBoardEvent(KeyboardEventType keyboardEventType, KeyCode keyCode)
{
    if (!grounded)
        return;

    if (keyboardEventType == KeyboardEventType.DOWN)
        pressed[keyCode] = true;
    if (keyboardEventType == KeyboardEventType.UP)
    {
        moving = false;
        pressed[keyCode] = false;
        degeticaRb.angularVelocity = 0f;
        degeticaRb.velocity = Vector3.zero;
    }
}

public void DoRotation(int tIndex)
{
    Vector3 rotAngle = transform.rotation.eulerAngles;
    if (tIndex == 1)
    {
        rotAngle.z -= 90f;
        transform.position = new Vector3(transform.position.x - 0.65f, transform.position.y);
    }
    else
    {
        rotAngle.z += 90f;
        transform.position = new Vector3(transform.position.x + 0.65f, transform.position.y);
    }
    transform.eulerAngles = rotAngle;
}

private void FixedUpdate()
{
    Collider2D[] colliders = Physics2D.OverlapCircleAll(Feet.position, 0.1f);
    grounded = false;
    foreach (Collider2D coll in colliders)
    {
        if (coll.tag == "wall")
        {
            grounded = true;
            break;
        }
    }

    if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow))
    {
        moving = (pressed[KeyCode.LeftArrow] ^ pressed[KeyCode.RightArrow]);
        if (moving && grounded)
        {
            moveAxis += pressed[KeyCode.RightArrow] ? accelaration : (accelaration * -1f);
            moveAxis = Mathf.Clamp(moveAxis, -1, 1);
            degeticaRb.velocity = new Vector2(moveAxis * moveSpeed, degeticaRb.velocity.y);
        }
        else
            moveAxis = 0f;

    }
    else
        moving = false;
    DoMoveAnim();
}

Итак, переменная bool moving остается активным, даже если я ничего не нажимаю.Помогите!

1 Ответ

0 голосов
/ 06 июня 2019

Вам необходимо управлять состояниями клавиш, даже если объект не заземлен.Единственное, что заботится, если оно заземлено, это установить moving = false и установить скорости на ноль:

private void KBoard_KeyBoardEvent(KeyboardEventType keyboardEventType, KeyCode keyCode)
{
    if (keyboardEventType == KeyboardEventType.DOWN)
        pressed[keyCode] = true;
    if (keyboardEventType == KeyboardEventType.UP)
    {
        pressed[keyCode] = false;

        if (grounded) 
        {
            moving = false;
            degeticaRb.angularVelocity = 0f;
            degeticaRb.velocity = Vector3.zero;
        }
    }
}

На практике, вы можете просто использовать Input.GetKey, Input.GetKeyUp и Input.GetKeyDown вместоуправлять состоянием ключа самостоятельно.

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