与地面的统一碰撞不起作用(菜鸟)

Unity collision with ground doesnt work (noob)

所以我刚开始使用 unity 并希望我的玩家只有在接触地面时才能跳跃。我给了我的地面一个“地面”标签并检查,如果玩家正在使用“地面”标签接触游戏对象,那么接地布尔将被设置为真。不知何故我的碰撞不起作用。

public class PlayerMovement : MonoBehaviour
{
    [SerializeField] float speed = 10;
    private Rigidbody2D body;
    private Animator animate;
    private bool grounded;

    private void Awake()
    {
        body = GetComponent<Rigidbody2D>();
        animate = GetComponent<Animator>();
    }

    private void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        body.velocity = new Vector2(horizontalInput * speed, body.velocity.y);

        if (horizontalInput > 0.01f)
            transform.localScale = new Vector3(7, 7, 7);

        else if (horizontalInput < -0.01f)
            transform.localScale = new Vector3(-7, 7, 7);

        if (Input.GetKeyDown(KeyCode.Space) && grounded == true)
            Jump();
              
            animate.SetBool("Run", horizontalInput != 0);
            animate.SetBool("grounded", grounded);
       

    }

    private void Jump()
    {
      body.velocity = new Vector2(body.velocity.x, speed);
        animate.SetTrigger("Jump");
        grounded = false;
    }

    private void OncollisionEnter2D(Collision2D collision)
    {
        Debug.Log("Collision detected");
        if (collision.gameObject.tag == "Ground")
        grounded = true;
        Debug.Log("ground is being touched");
    }
    

}

我认为让这个过程的某些步骤输出日志消息是个好主意,但我的日志在测试后仍然是空的。

OnCollisionEnter2D 将是您打算写的内容的正确拼写。因此,将 OncollisionEnter2D 更改为 OnCollisionEnter2D,因为大小写很重要。

因为我们已经在这里并且它不会造成伤害,我还建议您使用 CompareTag 而不是 tag == string 因为它由于内存分配较少而性能稍好(如你可以在这里阅读:https://learn.unity.com/tutorial/fixing-performance-problems#5c7f8528edbc2a002053b595),所以习惯CompareTag:

是个好习惯
if(collision.gameObject.CompareTag("MyTag"))

为了完成这个答案,我想指出您可能需要考虑修复您的 auto-completion 建议(在 Visual Studio 和 Visual Studio 代码:IntelliSense 中)万一它不起作用。有了这个工具的帮助,你再也不会拼错这样的东西了,因为在你开始写的时候就会提示正确的名字。