正如标题所说,我的播放器更像是跳跃,就像跳跃一样,但我找不到答案。我用的是我的代码
void Jumping()
{
if (Input.GetKeyDown(KeyCode.Space) && currentJumps <= maxJumps)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
currentJumps++;
}
}
答案 0 :(得分:0)
需要从您的Update()
函数中调用Input.GetKeyDown,并且应该在FixedUpdate()
函数中应用物理力。
GetKeyDown仅对于发生它的一帧为真。 在该帧期间,FixedUpdate可能会运行,也可能不会运行。所以,永远不要使用 GetKeyDown(或任何其他类似的Down和Up输入选项)在 固定更新。 https://forum.unity.com/threads/fixedupdate-and-input-getkeydown.56862/
例如这可能会使您的代码看起来像这样:
private bool _jumping;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
_jumping = true;
else if (Input.GetKeyUp(KeyCode.Space))
_jumping = false;
}
void FixedUpdate()
{
if (_jumping) rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
还请注意:
Input.GetKeyDown
在用户开始按下键的帧期间返回true 按名称标识。 https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
Input.GetKey
当用户按住名称标识的键时返回true。 https://docs.unity3d.com/ScriptReference/Input.GetKey.html
Input.GetKeyUp
在用户释放由...标识的帧期间,返回true 名称。 https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html
我通常如何实现跳跃:
我倾向于使用GetKeyDown来检测跳转的开始,检查_jumping
是否为假,并将其设置为true。
我有一个浮点值,它是跳跃的力量乘数(你的jumpForce
),它从高开始,并在整个跳跃过程中减小。
我在FixedUpdate
到jumpForce = Mathf.Max(jumpForce - jumpDecay * Time.fixedDeltaTime, 0)
中减少了这一点。
如果检测到Input.GetKeyUp
且_jumping == true
,则设置jumpForce = 0
。 (停止跳跃)
与地面碰撞时,将_jumping
设置为false并设置jumpForce = maxJumpForce
。
在FixedUpdate
中,检查是否_jumping
然后用我们的jumpForce
施力。
这会导致行为,您按住跳跃的时间越长,跳跃的时间就越长,类似于Mario和Hollow Knight等游戏