2017-08-07 52 views
2

以前已经问过这个问题,但没有一个答案能解决我的问题,因为问题总是稍有不同。与空格键的持续时间相关的跳跃高度

我有一个在空格键上跳转的字符。当空格键长按时,我希望它跳得更高,最大跳跃高度是正常跳跃高度的两倍。

这就是我想出了这么远:

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

上面的代码“工作”,如果我持有空格键:字符跳(最低高度),土地,再次跳,但现在有点高,等等。但这不是我正在寻找,显然。

+0

为你想要的答案或无关紧要的语言添加标签? –

+0

感谢您的建议。新增了c#标签。 – binoculars

+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 
    { 

    } 
} 

}

+0

我对Unity和C#非常陌生。有什么机会可以向我提供更多关于如何实施的细节/代码? – binoculars

+0

@binoculars我添加了一些代码给你一个想法,但你将不得不扩展它,试图理解代码。祝你好运 –

+0

@binoculars如果这个答案帮助你,请接受它。或者你还有其他问题吗? –

1

我不明白你为什么把

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

    } 
} 
+0

如果你开始改变不是为此目的的质量,跳跃结束的那一刻,由于质量变化,他似乎会慢慢安静下来,除非你重新设定它。由于引力总是存在的,所以即使跳跃在跳跃过程中可能会看起来变形(因为他使用的是增强而不是直接操纵位置,否则这将是不真实的) –

+0

dats为什么他把'myRB.mass = 1'只要按钮被提起,我猜,所以它应该工作,我想 –

+0

我知道它可能会工作,但例如,如果游戏有一个后推力施加时,你被击中敌人;如果你在跳跃时被击中,你将会飞过整个比赛。这就是为什么你不应该在我看来使用这种解决方法。 –