好的,所以我正在构建一个有两种跳跃类型的平台游戏。 正常跳跃 - 在地面上,按空格键 空中跳跃 - 跳跃时,有限的额外跳跃(同时按空格键)
我已经找到了这个跳跃的主要机制,但我遇到了障碍。每次跳跃时,有限的空中跳跃开始为3。但是,根据我编写的代码,Unity使用最初的“正常跳转”作为三者之一。
以下是我的代码示例:
bool pressingJumpButton = Input.GetKeyDown("space");
if (pressingJumpButton)
{
if (canJump)
{
jumping = true;
}
}
if (jumping)
{
if (pressingJumpButton && inAir == false) {
Debug.Log("jump");
GetComponent<Rigidbody>().velocity = new Vector3(
GetComponent<Rigidbody>().velocity.x,
jumpingSpeed,
GetComponent<Rigidbody>().velocity.z);
inAir = true;
}
}
//airJump logic
if(inAir==true)
{
airJump = true;
if (airJump && maxAir>0 && pressingJumpButton)
{
Debug.Log("airJump");
maxAir -= 1;
GetComponent<Rigidbody>().velocity = new Vector3(
GetComponent<Rigidbody>().velocity.x,
jumpingSpeed,
GetComponent<Rigidbody>().velocity.z);
}
}
// on the floor
void OnTriggerStay (Collider otherCollider)
{
if (otherCollider.tag =="JumpingArea")
{
canJump = true;
jumping = false;
inAir = false;
maxAir = 3;
airJump = false;
}
}
我把debug.logs放进去,看看我是否能找到问题,当我第一次跳跃(从地面)时,它注册为正常和空中跳跃。
我认为通过使用inAir bool只能在按下跳转按钮后返回true,这将是修复但没有运气。
我做错了什么?
答案 0 :(得分:2)
您需要结合跳跃和空中测试并使用else
子句。正如它的编写,你正在进行跳转,设置inAir = true
,然后在测试之后inAir
是否为真,这意味着你在每次正常跳跃后都会进行空中跳跃。
if (jumping && !inAir)
{
Debug.Log("jump");
...
}
else if (inAir && jumping)
{
Debug.Log("airJump");
...
}
由于您在设置pressingJumpButton
时已经测试过,因此也无需重新检查jumping = true
。
一个(恕我直言)更好的版本,避免重复的代码,并摆脱不必要的变量:
if (pressingJumpButton && canJump)
{
if (!inAir)
{
Debug.Log("jump");
inAir = true;
DoJump();
}
else if (maxAir > 0)
{
Debug.Log("airJump");
maxAir--;
DoJump();
}
}
private void DoJump()
{
GetComponent<Rigidbody>().velocity =
new Vector3(GetComponent<Rigidbody>().velocity.x,
jumpingSpeed,
GetComponent<Rigidbody>().velocity.z);
}