Unity – 检查播放器是否接地不工作

我希望玩家在玩家停飞时跳跃。

private void OnTriggerStay(Collider other) { if(other.gameObject.layer == 8) { isGrounded = true; }else { isGrounded = false; } } 

产卵时,播放器播出。 在玩家跌落到具有标记Ground的Terrain之后, isGrounded仍然是假的。 当我手动设置isGrounded并再次跳转时,它在碰撞后仍然是真的。 我也不希望玩家在空中双跳,我可能已编码但由于出了问题而无法正常工作。

OnTriggerStay更改为OnTriggerEnter不会更改某些内容。 我希望你能帮助我。

不要使用OnTriggerStay来执行此操作。 这不能保证是真实的。

调用OnCollisionEnter时,将isGrounded标志设置为true。 调用OnCollisionExit时将其设置为false。

 bool isGrounded = true; private float jumpForce = 2f; private Rigidbody pRigidBody; void Start() { pRigidBody = GetComponent(); } private void Update() { if (Input.GetButtonDown("Jump") && isGrounded) { pRigidBody.AddForce(new Vector3(0, jumpForce, 0)); } } void OnCollisionEnter(Collision collision) { Debug.Log("Entered"); if (collision.gameObject.CompareTag("Ground")) { isGrounded = true; } } void OnCollisionExit(Collision collision) { Debug.Log("Exited"); if (collision.gameObject.CompareTag("Ground")) { isGrounded = false; } } 

在您说它不起作用之前,请检查以下内容:

  • 您必须将RigidbodyRigidbody2D连接到播放器。

  • 如果是这个Rigidbody2D ,你必须使用OnCollisionEnter2DOnCollisionExit2D

  • 您必须在禁用IsTrigger的情况下将Collider连接到播放器。

  • 确保您没有使用transform.positiontransform.Translatetransform.position移动Rigidbody 。 您必须使用MovePosition函数移动Rigidbody

使用它来检查是否检测到碰撞,这是进一步调试的良好起点:

 private void OnTriggerStay(Collider other) { Debug.Log(other); }