Как я могу сделать своего персонажа основанным на unity3d?

У меня есть код для движения персонажа, но функция заземления никогда не возвращает значение null, и хотя я проверяю слой земли, он все еще думает, что нужно проверить столкновение с коллайдером игрока, чтобы я мог продолжать прыгать вечно.

public float jumpVelocity;
private bool keyPressedW;
private bool isGrounded;

private Rigidbody2D rigidbody2d;
private BoxCollider2D boxCollider2d;

void Start()
{
    rigidbody2d = transform.GetComponent<Rigidbody2D>();
    boxCollider2d = transform.GetComponent<BoxCollider2D>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.W))
        keyPressedW = true;
    if (IsGrounded())
        isGrounded = true;
    else isGrounded = false;
}

 private void FixedUpdate()
{
    if (keyPressedW && isGrounded)
    {
        rigidbody2d.velocity = Vector2.up * jumpVelocity;
        keyPressedW = false;
    }
}

private bool IsGrounded()
{
   RaycastHit2D raycastHit2d = Physics2D.BoxCast(boxCollider2d.bounds.center, 
   boxCollider2d.bounds.size, 0f, Vector2.down * 0.1f , 
   LayerMask.GetMask("Platform"));
   Debug.Log(raycastHit2d.collider);
   return raycastHit2d.collider != null;
}

person Guy    schedule 29.04.2021    source источник


Ответы (1)


Вы должны использовать raycast, а не бокс-коллайдеры. Код должен выглядеть так:

 void Update()
    {
       
        if (Input.GetKeyDown(KeyCode.W))
            keyPressedW = true;
    }//remove the part that was here.

 private void FixedUpdate()
    {
        
        if (keyPressedW && isGrounded)
        {
            rigidbody2d.velocity = Vector2.up * jumpVelocity;
            keyPressedW = false;
        }

    }

private bool IsGrounded()
    {
       if (Physics2D.Raycast(transform.position, -transform.up, groundDistance, groundMask)
       {
          return true
       }
       return false
    }

person ken    schedule 29.04.2021