嗨,我该如何停止2D角色停止在空中跳跃?

问题描述

当我按下跳转按钮时,他将始终跳转。我希望你能帮助我。这是我的第一场比赛,所以我不太了解。这是我的代码

Rigidbody2D rb;
float dirX;
float jumpForce = 300f;
private bool canJump = false;
private bool hasSwitchedLayers = false;
public Transform Teleport1;
private Vector3 startPos;

void Start()
{
    startPos = new Vector3(-10,1.5f,0);
    rb = GetComponent<Rigidbody2D>();  
}

void Update()
{
    dirX = CrossplatformInputManager.GetAxis("Horizontal");
    rb.veLocity = new Vector2(dirX * 10,rb.veLocity.y);

    if (CrossplatformInputManager.GetButtonDown("Jump") )
    {
        rb.AddForce(new Vector2(rb.veLocity.x,jumpForce),ForceMode2D.Force);  
    }
}

解决方法

在脚本中添加一个isGrounded布尔值。在您的跳转if语句中添加isGrounded的支票,例如if(CrossPlatformInputManager.GetButtonDown("Jump") && isGrounded){}。但是,您将必须添加一条语句以检查播放器是否在地面上是真实的。您可以通过多种方式进行操作。

您可以使用simple short raycast来检测自己是否在地面上。 isGrounded = Physics2D.Raycast(transform.position,Vector3.down,distToGround + 0.2),请注意distToGround = collider.bounds.extents.y。这将创建一个光线投射,该光线投射将从播放器向下传播(其传播距离将是从播放器的碰撞轴到底部的碰撞边缘,再加上一点,以防万一您在斜坡上等)。如果命中路径中的任何对象,它将返回true。此方法将要求它在update方法中。但是,您也可以通过执行以下操作将其添加到isGrounded本身中:

bool isGrounded(){
    return Physics2D.Raycast(transform.position,distToGround + 0.2);
}
void Update(){
    if(isGrounded() && .......){}
}

如果您的角色具有角色控制器,您也可以只使用简单的if(CharacterController.isGrounded) statement

您可以使用的另一种方法是在玩家的脚下添加一个小的碰撞球/盒子。这可以通过两种方式完成。首先,您可以让玩家检测到碰撞,然后检查是否是地面,

private bool IsGrounded;
void OnCollisionEnter2D(Collision2D c){
    if(c.tag == "ground"){
        isGrounded = true;
    }
}
void OnCollisionExit2D(Collision2D c){
    if(c.tag == "ground"){
        isGrounded = false;
    }
}

第二(更复杂),您可以在编辑器中添加一个空的游戏对象,该对象带有附加的碰撞盒/球体(带有isTrigger == true)和一个脚本。该游戏对象将是玩家的孩子,并且应该靠近玩家的脚。在其脚本中,可以添加一个静态变量public static bool isPlayerGrounded,然后添加一个简单的OnTriggerEnter2DOnTriggerExit2D函数,并检查它们触发的对象是否通过使用标记进行了接地。 / p>

public static bool IsPlayerGrounded;
void OnTriggerEnter2D(Collider2D c){
    if(c.tag == "ground"){
        IsPlayerGrounded = true;
    }
}
void OnTriggerExit2D(Collider2D c){
    if(c.tag == "ground"){
        IsPlayerGrounded = false;
    }
}

然后,您可以检查播放器脚本中的播放器是否已接地

private Isgrounded;
void Update(){
    Isgrounded = NameofOtherScript.IsPlayerGrounded;
}
,

有多种方法可以防止游戏对象跳到空中,但是我想说这是最简单的方法。首先,请确保您的游戏对象具有附加的对撞机。如果是这样,您将必须创建一个响应所有冲突的方法,并且还必须引入一个名为isJumping的新变量:

bool isJumping = false;
void OnCollisionEnter2D(Collision2D col) //this method responds to all collisions
{
    jumping = false;
}
if (CrossPlatformInputManager.GetButtonDown("Jump") && !jumping) //making sure that the game object is not already jumping
{
    rb.AddForce(new Vector2(rb.velocity.x,jumpForce),ForceMode2D.Force);
    jumping = true;
}

虽然此解决方案可能并不完美,并且您可能会遇到一些错误,例如游戏对象与墙壁/障碍物在空中碰撞时能够跳跃,但这是我能想到的最简单的解决方案。并且,为了避免该错误,请确保为此使用的对撞机位于游戏对象的底部(这样,它只有在落在地面上时才可以跳跃)。另外,如果您想了解有关OnCollisionEnter2D方法的更多信息,请查看Unity文档中的OnCollisionEnter2D(Collision2D)