与空格键的时间相关的跳跃高度

时间:2017-08-07 09:06:14

标签: c# unity3d

以前曾经问过,但没有一个答案解决了我的问题,因为问题总是略有不同。

我有一个在空格键上跳下来的角色。当空格键按下的时间更长时,我希望它能够进行更高的跳跃,最大值是正常跳跃高度的两倍。

这是我到目前为止所提出的:

void FixedUpdate () {

    if (Input.GetKeyDown(KeyCode.Space) && myRB.velocity.y == 0)
    {
        timeHeld = 1;

    }
    if (Input.GetKey(KeyCode.Space) && myRB.velocity.y == 0)
    {
        myRB.AddForce(Vector3.up * 20,ForceMode2D.Impulse);
        timeHeld += Time.deltaTime;
        myRB.mass = myRB.mass - timeHeld/10;

    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        myRB.mass = 1;

    }
}

由于跳跃必须发生在keydown(而不是keyup)上,我无法增加跳跃上添加的力,因为力已经在keydown上施加。因此,我在考虑降低刚体的质量。

如果我继续按住空格键,上面的代码“有效”:角色跳跃(最小高度),降落,再次跳跃,但现在高一点,等等。但这显然不是我想要的。

2 个答案:

答案 0 :(得分:2)

这可以通过制作跳跃发生的时间范围轻松完成; 在此时间范围内,您可以通过按住空格键来施加向上的力。一旦到达时间段结束或按下按钮结束;你限制向上的速度直到角色降落。 结束跳跃后,让重力走自己的路。

至于编码部分,我建议你在跳跃时启动一个例程。

这里有一些代码可以帮助你入门;

IEnumerator Jumper()
{
    if (maxjumpduration!=jumpduration)
    {
        jumpduration = jumpduration + 0.1f;
        yield return new WaitForSeconds(0.1f);
    }
    else
    {
        jumpduration = 0;
        StopCoroutine(Jumper());
    }
}

至于你想要的事实也有规律的跳跃;如果按空格键被认为是常规跳跃或受控跳跃,则确定另一个时间框架;在最初的时间范围内,你仍在决定它是什么样的跳跃;你执行跳转的一小部分,直到得出结论然后你把它发送到正确的方法。

我为你添加了一些基础工作但是尝试自己完成代码;

{
private bool shortjump = false;
private bool checkphase = false;
private bool hitground = false;
private Rigidbody player = new Rigidbody();
private bool jumping = false;
Vector3 sharedjumpforce = new Vector3();
private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
     {
        Initialjump();
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        if (jumping)
        {
            shortjump = true;
        }
    }
        if (jumping)
    {
        if (hitground)
        {
            jumping = false;
        }
    }
}

void Initialjump()
{
    if (jumping = false)
    {
        checkphase = true;
        jumping = true;
        player.AddForce(sharedjumpforce);
        Invoke("Standardorcontrolledjump", 0.2f);
    }
}
void Standardorcontrolledjump()
{
    checkphase = false;
    if (shortjump)
    {

    }
    else
    {

    }
}

}

答案 1 :(得分:1)

我不明白你为什么要放

&& myRB.velocity.y == 0

你想让它减少它的质量而你在空中不是。假设在施加初始力之后减小质量确实允许Rigidbody更高,(重力减弱,我不确定Unity中是否发生这种情况)

你为什么不试试这个

 void FixedUpdate () {
     // apply force the instant button is pressed. That is only once
    if (Input.GetKeyDown(KeyCode.Space) && myRB.velocity.y == 0)
    {
        myRB.AddForce(Vector3.up * 20,ForceMode2D.Impulse);
        timeHeld = 1;

    }
     // keep subtracting from mass while its held
    if (Input.GetKey(KeyCode.Space))
    {

        timeHeld += Time.deltaTime;
        myRB.mass = myRB.mass - timeHeld/10;

    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        myRB.mass = 1;

    }
}