如果什么也没按下,如何停用bool var

时间:2019-06-06 07:02:24

标签: c# unity3d

我的代码有问题。我有一个精灵,当我单击它时,我旋转了另一个对象。我可以用键盘左右移动该对象。问题是,如果您继续按住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();
}

因此,即使我没有按任何键,布尔变量moving仍保持活动状态。救命!

1 个答案:

答案 0 :(得分:0)

即使对象未接地,也需要管理关键状态。唯一关心的是接地是否设置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.GetKeyInput.GetKeyUpInput.GetKeyDown而不是自己管理密钥状态。