我的代码有问题。我有一个精灵,当我单击它时,我旋转了另一个对象。我可以用键盘左右移动该对象。问题是,如果您继续按住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
仍保持活动状态。救命!
答案 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.GetKey
,Input.GetKeyUp
和Input.GetKeyDown
而不是自己管理密钥状态。