如何改善Unity中的移动代码?

时间:2015-08-06 11:16:07

标签: unity3d game-physics mouseclick-event flappy-bird-clone

我使用2D格式在Unity中制作游戏,其格式与Flappy Bird相同。但是,我没能使这项运动像我希望的那样好。

主要问题是当我按下鼠标按钮时,直到我松开按钮才会停止。我想只需点击一下就可以动作,所以如果我按下鼠标按钮并且不放手,那么鸟就会掉落。因为,它只会反弹一次。

以下是移动代码,请告诉我如何解决此问题。我已经跳过了代码中没有使用的部分代码。

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;
    }
}

5 个答案:

答案 0 :(得分:0)

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

public class Colour implements Serializable {

    private Long colourId;
    private String colourName;
    private String colourHex;
    private static final long serialVersionUID = 1L;

    public Colour() {}

    public Long getColourId() {
        return colourId;
    }

    public void setColourId(Long colourId) {
        this.colourId = colourId;
    }

    public String getColourName() {
        return colourName;
    }

    public void setColourName(String colourName) {
        this.colourName = colourName;
    }

    public String getColourHex() {
        return colourHex;
    }

    public void setColourHex(String colourHex) {
        this.colourHex = colourHex;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 47 * hash + Objects.hashCode(getColourId());
        return hash;
    }

    @Override
    public boolean equals(Object that) {
        if (!(that instanceof Colour)) {
            return false;
        }

        return this == that || Objects.equals(getColourId(), ((Colour) that).getColourId());
    }

    @Override
    public String toString() {
        return String.format("%s[colourId=%d]", getClass().getCanonicalName(), getColourId());
    }
}

您需要保留一个额外的标志,只有在释放鼠标按钮后才允许翻盖。类似的东西:

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

答案 1 :(得分:0)

这就是你所需要的一切

你正在调用GetMouseButton,每按一次鼠标按钮就会运行一次。而是尝试调用GetMouseButtonDown,每次鼠标按下时会触发一次。

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);
}

答案 2 :(得分:0)

如果你想在Flappy Bird中使用相同的机制,你需要使用rigitbody.velocity而不是施加力量,因为如果鸟儿上升,下降或停止它并不重要,它将永远飞行以相同的初始速度。

private void HandleMouse ()
{   
    if (Input.GetMouseButtonDown(0)) {
        rigidbody.velocity = new Vector3 (rigidbody.velocity.x, velocityUp, 0f);
    }
}

答案 3 :(得分:0)

要单击鼠标按钮一次,请使用GetMouseButtonDown。 然后你需要通过AddForce(),ForceMode.Impulse的第二个参数来施加冲动而不是强制:

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

答案 4 :(得分:0)

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

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

  1. 将Input.GetMouseButtonDown()的返回值存储在本地 变量,因此您每帧只检查一次(每个更新循环 烦恼)。

  2. 尝试在Start()函数上使用GetComponent <>()并将其存储在
    全局变量。因为此功能效率不高
    称为每一帧。