【问题标题】:Jump height in relation to timeheld of spacebar相对于空格键时间的跳跃高度
【发布时间】:2017-08-07 20:08:24
【问题描述】:

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

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

这是我到目前为止的想法:

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。因此,我正在考虑降低刚体的质量。

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

【问题讨论】:

  • 为你想要什么语言的答案添加标签或无关紧要?
  • 感谢您的建议。添加了 c# 标签。
  • 你不应该将其视为跳跃,因为它不是跳跃,它在一定范围内推动某物。角色上升的应用速度是恒定的还是可变的?
  • 换句话说,如果空格键保持更长时间,您是否希望跳跃更快?
  • 字符中的变量应该向上减速,然后再次加速向下。但是如果按住空格键的时间更长,跳跃应该会更快。

标签: c# unity3d


【解决方案1】:

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

至于编码部分,我建议你在跳转发生时开始一个协程。

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

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
    {

    }
}

}

【讨论】:

  • 我对 Unity 和 C# 非常陌生。您是否有机会向我提供有关如何实现此功能的更多详细信息/代码?
  • @binoscopes 我添加了一些代码给你一个想法,但你必须扩展它,试着理解代码。祝你好运
  • @binoscopes 如果这个答案对你有帮助,请接受。或者您还有其他问题吗?
【解决方案2】:

我不明白你为什么要放

&& myRB.velocity.y == 0

您希望它在空气中减少质量,不是吗。假设在施加初始力后减少质量确实允许刚体走得更高,(重力减弱,我不确定这是否发生在 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;

    }
}

【讨论】:

  • 如果你开始改变不是为此目的的质量;跳跃结束的那一刻,由于质量变化,他似乎会慢慢安静下来,除非你当然重置它。由于重力总是存在的,如果你在跳跃过程中玩弄它,即使跳跃看起来也会变形。(因为他正在使用 Addforce 而不是直接操纵位置,否则这是不真实的)
  • 我猜他为什么一抬起按钮就放myRB.mass = 1,所以我想它应该可以工作
  • 我知道它可能会起作用,但例如,如果游戏在你被敌人击中时应用了反推力;如果你在跳跃时被击中,你将飞过整个游戏。这就是为什么在我看来你不应该使用这样的解决方法。
  • 在 update never fixed update 中还应该检查密钥;只是想帮忙;)。(你可能而且我认为在某些时候会遇到输入丢失)
猜你喜欢
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多