【问题标题】:Unity 3D game jumping randomlyunity 3D 游戏随机跳跃
【发布时间】:2014-11-12 03:56:43
【问题描述】:

我正在使用 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 中制作的第一个游戏/项目。帮助将不胜感激。谢谢!

【问题讨论】:

  • 球有弹性吗?
  • 尝试使用 OnCollisionEnter 代替
  • @Jay Kazama 当我运行它时它不会反弹。

标签: unity3d game-physics unityscript


【解决方案1】:

你会认为像跳跃这样简单的事情应该是不费吹灰之力的,但这里有几个陷阱:

  • 可能会发生两次调用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多