我目前在游戏中实现双跳时遇到了一个问题。我使用这个视频中的代码作为基础(因为我真的很喜欢跳跃的工作方式: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一样,但是有一个奇怪的定时)之内,但是没有给我我需要的东西。
1条答案
按热度按时间oipij1gg1#
对于一个简单的概念来说,这太复杂,变量太多。
类似下面这样的伪代码应该就足够了:
OnGround
可以通过多种方式触发。你可以用一个球体对撞机来探测脚下的物体,并检查碰撞的物体是否是敌人或投射物。你也可以使用标签,用标签floor标记所有楼层,但这意味着如果你滑倒并忘记了楼层标签,你的玩家将经历双跳错误。你可以做一个光线投射(不是每一帧,每十帧应该很好),如果碰撞发生在脚的阈值以下,那么我们已经着陆了。
我不知道你的提醒是为了达到什么目的,但它们是不必要的。看起来你是在计算飞行时间,但如果他们从高处跳下,然后再跳两次会发生什么?唯一重要的是我们计算跳了多少次,并在他们落地时重置这个计数。