0

我正在使用与 Flappy Bird 相同的机制在 Unity 中使用 2D 格式制作游戏。但是,我没有让运动达到我想要的那样好。

主要问题是当我按下鼠标按钮时,它不会停止,直到我释放按钮。我想要一键只移动一个动作,这样如果我按下鼠标按钮并且不松手,鸟就会掉下来。因为,它只会反弹一次。

这是移动代码,请告诉我如何解决此问题。我跳过了运动中未使用的一些代码部分。

float flapSpeed = 25f;
float forwardSpeed = 0.9f;

void Update () {
      if  (Input.GetMouseButton(0)) { 
          didFlap = true;
      }
}

void FixedUpdate () {
// Movement
    GetComponent<Rigidbody2D>().AddForce(Vector2.right * forwardSpeed);
    if (didFlap) {
         GetComponent<Rigidbody2D>().AddForce(Vector2.up * flapSpeed);
         didFlap = false;
    }
}
4

5 回答 5

0

这是因为您正在检查鼠标按钮是否一直被按下并对其做出反应:

void Update () {
      if  (Input.GetMouseButton(0)) { 
          didFlap = true;
      }
}

您需要保留一个附加标志,该标志仅在释放鼠标按钮后才允许襟翼。就像是:

private bool allowFlap = true;

void Update () {
      bool mouseDown = Input.GetMouseButton(0);
      if (allowFlap && mouseDown) { 
          didFlap = true;
          allowFlap = false;
      } else if (!allowFlap && !mouseDown) {
          allowFlap = true;
      }
}
于 2015-08-06T11:51:04.630 回答
0

要让鼠标按钮单击一次,请使用 GetMouseButtonDown。然后,您需要通过 AddForce() 的第二个参数 ForceMode.Impulse 应用脉冲而不是力:

void Update () {
    if (Input.GetMouseButtonDown(0)) 
        GetComponent<Rigidbody2D>().AddForce(Vector2.up * flapSpeed, ForceMode.Impulse);
}
于 2015-08-06T15:19:41.183 回答
0

这就是你所需要的

您正在调用GetMouseButtonwhich 在鼠标按钮按下时每帧运行一次。而是尝试调用GetMouseButtonDownwhich 将在每次鼠标按下时触发一次。

float flapSpeed = 25f;
float forwardSpeed = 0.9f;

void Update () {
     if (Input.GetMouseButtonDown(0)) 
          GetComponent<Rigidbody2D>().AddForce(Vector2.up * flapSpeed);
}

void FixedUpdate () {
      GetComponent<Rigidbody2D>().AddForce(Vector2.right * forwardSpeed);
}
于 2015-08-06T13:41:01.603 回答
0

如果您想在 Flappy Bird 中使用相同的机制,您需要使用rigitbody.velocity而不是施加力,因为无论鸟是上升、下降还是停止,它总是会以相同的初始速度飞起来。

private void HandleMouse ()
{   
    if (Input.GetMouseButtonDown(0)) {
        rigidbody.velocity = new Vector3 (rigidbody.velocity.x, velocityUp, 0f);
    }
}
于 2015-08-06T14:44:17.523 回答
0

您正在检查 Input.GetMouseButton(0) 每帧。如果玩家按住button_0 ,此函数返回 true 。你想要的是检查一次触发的 Input.GetMouseButtonDown(0) 。

顺便说一句,我对您的代码有两个建议。

  1. 将 Input.GetMouseButtonDown() 的返回值存储在局部变量中,因此您只需每帧检查一次(每次更新循环迭代)。

  2. 尝试在 Start() 函数上使用 GetComponent<>() 并将其存储在
    全局变量中。因为这个函数不是
    每帧都调用的成本效益。

于 2018-07-30T17:19:44.830 回答