【问题标题】:Trouble with jumping and remembering jump time跳跃和记住跳跃时间的麻烦
【发布时间】:2020-03-10 22:45:32
【问题描述】:

我试图让我的角色在他被停飞时能够跳跃,或者如果他在空中飞行,那么只有在他有额外的跳跃并且经过 x 时间时才能跳跃。 目前我有这个:'

void Jump()
{
    jumpTime -= Time.fixedDeltaTime;
    if ((jumpRemember > 0) && ((groundRemember > 0) || ((jumps>0) && (jumpTime <= 0))))
    {
        jumpRemember = 0;
        groundRemember = 0;
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        jumps--;
        jumpTime = timeSinceLastJump;
    }
}

(跳跃记忆和接地记忆是检查我是否按下跳跃按钮或在最后 0.1 秒内接地)

但是当他被搁浅并与屋顶相撞并被送回地面时,即使我使用了“或”运算符,他也不能在时间过去后跳起来。

【问题讨论】:

  • 我不明白你的变量 jumpRemembergroundRemember 的用途,但我猜你的问题是当玩家点击跳转按钮时你调用 Jump() 并且它只在你做的这段代码jumpTime -= Time.fixedDeltaTime;。所以基本上jumpTime只会在玩家点击跳跃时减少,这可能不是你想要的。我不依赖于每帧递减值,而是使用时间检查。
  • groundRemember 应该是一个布尔值...但是告诉我们变化的地方
  • @rfmodulator 我有groundRemember -= Time.deltaTime; if (isGrounded == true) { groundRemember = groundRememberTime; } 所以它在技术上是一个布尔值
  • @FredrikSchön 我会调查时间检查,谢谢
  • @ToBeFrank 我现在和你在一起......isGrounded 有道理。

标签: c# unity3d


【解决方案1】:

尝试使用 Debug.Log(variable) 检查变量的状态。

“当他被接地并与屋顶碰撞并被送回地面时” - 这会改变哪些变量?

当角色与屋顶碰撞时,这些变量是否会发生意外变化?

我会在评论中留下这一点,但您需要声誉才能解锁该网站的该功能。

【讨论】:

  • 嘿,在看到最后一段之前,我差点投反对票。投赞成票,这样你就可以摆脱那些愚蠢的束缚。当然,它们是有道理的,但阻止人们增加价值肯定不是重点!
  • 对我来说也一样 LOL :)
  • 哎呀,实际上是指从接地跳起来但修复是@Rodger 提出的,无论如何,谢谢
【解决方案2】:

如何解决问题的示例。

const int MAX_JUMPS = 2;
const FLOAT JUMP_TIMER = 1;
const float JUMP_FORCE = 100;

int jumps = 2;
float nextJump = 0;
bool grounded = true;


void Update() 
{
    if (Input.GetKeyDown(KeyCode.Space)) 
       TryJump();
}

void TryJump() 
{
    if (grounded || (jumps > 0 && nextJump < Time.time)) 
    {
        Jump();
    }

}

void Jump() 
{
    rb.velocity = new Vector2(rb.velocity.x, JUMP_FORCE);
    jumps--;
    nextJump = Time.time + JUMP_TIMER;
}

void Grounded() 
{
    grounded = true;
    jumps = MAX_JUMPS;
}

void Airborne()
{
    grounded = false;
}

void OnCollisionEnter(Collision col) 
{
    if (col.tag == "Floor")
        Grounded();

}

void OnCollisionExit(Collision col) 
{
    if (col.tag == "Floor")
        Airborne();

}

【讨论】:

    【解决方案3】:

    我认为你放错了括号。您希望前两个都为真,还是后两个都为真?

    if ((jumpRemember > 0) && ((groundRemember > 0) || ((jumps>0) && (jumpTime <= 0))))
    

    应该吗?

    if ((jumpRemember > 0 && groundRemember > 0) || (jumps>0 && jumpTime <= 0))
    

    groundRemember 前面的第二个括号导致它与 or 语句右侧的两个组合在一起。您需要一直记住,然后要么记住> 0,要么其他两个都为真。听起来这不是你想要的。是吗?

    【讨论】:

    • 就是这样!太乱了,我自己看不到,谢谢!
    • 作者不会校对自己的英语,原因与我们很难校对自己的代码一样。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2021-12-07
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多