Unity 3D游戏随机跳跃

时间:2014-09-17 23:37:32

标签: unity3d game-physics unityscript

我正在使用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中创建的第一个游戏/项目。非常感谢帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

你会认为像跳跃一样简单的东西应该是不费脑子的,但这里有一些问题:

  • 可能会发生两次调用Update()而中间没有任何物理更新。这意味着你之间没有收到OnColliderEnter和OnColliderStay,但仍然会重置isFalling,阻止跳转键。
  • 球击中的那一刻你会收到OnColliderEnter,但不会收到OnColliderStay。直到下一次物理更新才会发生这种情况。如果您只是聆听 - 住宿,您将会迟到一次更新。
  • 如果你在球应该击中地面时向右按下跳跃,那么当第一个对撞机击中注册时你的钥匙已经关闭了。你将会迟到另一个更新。
  • 物体稍稍沉入对撞机。当你跳跃时,在清除对撞机之前可能需要几次更新,你会在跳过后收到OnColliderStay

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

  • 同时使用OnColliderEnter和OnColliderStay。这将通过一次更新来改善您的时间安排。
  • 在FixedUpdate中重置isFalling而不是在Update中。 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;
}