Unity 3D游戏随机跳跃

SpiroDiscoBall

我正在使用Unity3D引擎开发第一款游戏,但遇到了第一个问题!不像我想的那样令人兴奋。如果我发送了跳跃按钮垃圾邮件,则w我的球会第一次跳跃,那么当它着陆时,它不会立即跳跃,但是在多次按下按钮后它会随机跳跃。我正在使用的代码如下。

    #pragma strict

var rotationSpeed = 100;
var jumpHeight = 8;

private var isFalling = false;

function Update ()
{
    //Handle ball rotation.
    var rotation : float = Input.GetAxis ("Horizontal") * rotationSpeed;
    rotation *= Time.deltaTime;
    rigidbody.AddRelativeTorque (Vector3.back * rotation);

    if (Input.GetKeyDown(KeyCode.W) && isFalling == false)
    {
        rigidbody.velocity.y = jumpHeight;
    }
    isFalling = true;
}

function OnCollisionStay ()
{
    isFalling = false;
}

我听说这是UnityScript中的算术行为问题。我是编程的初学者,不太了解UnityScript中的代码,这是我在Unity3D中编写的第一个游戏/项目。帮助将不胜感激。谢谢!

li

您会认为,像跳动这样简单的事情应该很容易,但是这里有一些陷阱:

  • 可能发生两次调用Update(),而其间没有任何物理更新的情况。这意味着您不会在两者之间没有收到OnColliderEnter或OnColliderStay,但仍会重置isFalling,从而阻止跳转键。
  • 球击中的那一刻,您将收到OnColliderEnter,但不会收到OnColliderStay。在下一次物理更新之前,不会发生这种情况。如果您只听-stay,则会迟到一次更新。
  • 如果您在应该将球击中地面时按向右跳,则当第一个对撞机击中时,您的钥匙已经按下。您将稍后再进行更新。
  • 物体会沉入对撞机中。跳跃时,清除对撞机之前可能需要进行几次更新,并且跳跃会收到OnColliderStay信息

我认为最后一点是这里最大的问题。要解决此问题,您需要做几件事:

  • 同时使用OnColliderEnter和OnColliderStay。一次更新可为您增加时间。
  • 在FixedUpdate中而不是在Update中重置isFalling。FixedUpdate是物理循环的一部分,因此在OnCollisionEnter和OnCollisionStay之前调用它,后者将在需要时立即对其进行再次设置。
  • 请记住,您一直在尝试跳跃,直到您真正处于空中。这使您可以一键清除对撞机。

下面的代码实现了这些要点。如果您希望时间更紧一点,则必须在飞行中排队下一个跳跃。

#pragma strict
var rotationSpeed = 100;
var jumpHeight = 8;

private var isFalling = false;
private var tryingToJump = false;

function Update ()
{
    //Handle ball rotation.
    var rotation : float = Input.GetAxis ("Horizontal") * rotationSpeed;
    rotation *= Time.deltaTime;
    rigidbody.AddRelativeTorque (Vector3.back * rotation);

    if (Input.GetKeyDown(KeyCode.W) && !isFalling) tryingToJump = true;
    if (tryingToJump)
    {
        if (isFalling) tryingToJump = false;
        else rigidbody.velocity.y = jumpHeight;
    }
}

function FixedUpdate()
{
    isFalling = true;
}

function OnCollisionStay()
{
    isFalling = false;
}

function OnCollisionEnter()
{
    isFalling = false;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章