玩家跳跃时的 Unity Tag 和 Collider 问题

Unity Tag and Collider problem while player is jumping

这是我的播放器的跳转代码:

void Update()
{
    float oldmoveHorizontal = moveHorizontal;
    moveHorizontal = Joystick.Horizontal;
    moveVertical = Joystick.Vertical;    

    if (isJumping == false && moveVertical >= .7f)
    {
        moveVertical = Speed * 70;
        isJumping = true;
    }

    ball_move = new Vector2(moveHorizontal, moveVertical);         
    ball_rigid.AddForce(ball_move);

    void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag == "Ground")
         {
             isJumping = false;
         }        
    }
}

当球碰到对撞机下方时,它可以再次跳跃。我怎样才能阻止这种情况?

如果下载不了:https://ibb.co/yVgXmrM

一个解决方案是检查碰撞的碰撞点的位置,看看它们中的任何一个是 "low enough" 从你的玩家的中心是一个可跳跃的碰撞:

private Collider2D playerCollider; 
private float playerJumpableOffset = 0.001;

void Start() { playerCollider = GetComponent<Collider2D>(); }

void OnCollisionEnter2D(Collision2D col)
{
    float jumpableWorldHeight = transform.position.y - playerJumpableOffset;

    for (int i = 0 ; i < col.contactCount && isJumping; i++)  
    {
        Vector2 contactPoint = col.GetContact(i).point; 
        if (contactPoint.y <= jumpableWorldHeight) 
        {
            isJumping = false;
        }
    }
}
void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.tag == "Ground")
    {
        foreach (ContactPoint2D item in col.contacts)
        {
            Debug.Log("Normal:" + item.normal);
            if (item.normal.y > 0 && col.gameObject.tag == "Ground")
            {
                isJumping = false;
                Debug.Log("Top of Collider");
            }
        }
    }}

我通过检查对撞机的顶部找到了解决方案。 使用此代码方式,如果玩家触摸 collider 的顶部,它将再次激活跳跃。