unity3d 越野车双人跳

gr8qqesn  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(77)

我目前在游戏中实现双跳时遇到了一个问题。我使用这个视频中的代码作为基础(因为我真的很喜欢跳跃的工作方式:https://youtu.be/vFsJIrm2btU),下面的代码是我最好的尝试,它的bug和它几乎不工作,我尝试过其他方法比这一个,但他们要么打破了正常的跳转或只是没有工作在所有.

float jumpRemember = 2;
void FixedUpdate(){
    
Vector2 v2GroundedBoxCheckPosition = (Vector2)transform.position + new Vector2(0, -0.01f);
        Vector2 v2GroundedBoxCheckScale = (Vector2)transform.localScale + new Vector2(-0.02f, 0);
        bool bGrounded = Physics2D.OverlapBox(v2GroundedBoxCheckPosition, v2GroundedBoxCheckScale, 0, lmWalls);

        fGroundedRemember -= Time.deltaTime;
        if (bGrounded)
        {
            fGroundedRemember = fGroundedRememberTime;
            jumpCount = jumpRemember;
        }

        fJumpPressedRemember -= Time.deltaTime;
        if (Input.GetButtonDown("Jump") && jumpCount != 0)
        {
           
            fJumpPressedRemember = fJumpPressedRememberTime;
           
        }
        

        if (Input.GetButtonUp("Jump") && jumpCount != 0)
        {
            if (rigid.velocity.y > 0)
            {
                rigid.velocity = new Vector2(rigid.velocity.x, rigid.velocity.y * fCutJumpHeight);
            }
        }
        
        if ((fJumpPressedRemember > 0) && (fGroundedRemember > 0) || Input.GetButtonDown("Jump") && jumpCount != 0)
        {
            fJumpPressedRemember = 0;
            fGroundedRemember = 0;
          
            rigid.velocity = new Vector2(rigid.velocity.x, fJumpVelocity);
            jumpCount--;
        }
        if(jumpCount <= 0)
        {

            Debug.Log($"Set to zero, soz,{jumpCount}");
          
        }

我试过把jumpCount--;放在GetButtonDown("Jump") if语句中(它只是引起了一个奇怪的巨大跳转),在if(无限跳转)之外,在GetButtonUp(和GetButtonDown一样,但是有一个奇怪的定时)之内,但是没有给我我需要的东西。

oipij1gg

oipij1gg1#

对于一个简单的概念来说,这太复杂,变量太多。
类似下面这样的伪代码应该就足够了:

OnJump()   // Gets called elsewhere via the Input.GetButton()
{
    if (jumpCount == 0)
        SingleJump();
    else if (jumpCount == 1)
        DoubleJump();
   jumpCount++;
}
OnGround()
{
   jumpCount = 0;    // Most important step
}

OnGround可以通过多种方式触发。你可以用一个球体对撞机来探测脚下的物体,并检查碰撞的物体是否是敌人或投射物。你也可以使用标签,用标签floor标记所有楼层,但这意味着如果你滑倒并忘记了楼层标签,你的玩家将经历双跳错误。
你可以做一个光线投射(不是每一帧,每十帧应该很好),如果碰撞发生在脚的阈值以下,那么我们已经着陆了。
我不知道你的提醒是为了达到什么目的,但它们是不必要的。看起来你是在计算飞行时间,但如果他们从高处跳下,然后再跳两次会发生什么?唯一重要的是我们计算跳了多少次,并在他们落地时重置这个计数。

相关问题