Unity跳跃跑酷游戏:如何检测玩家是否接触地形?
Unity CharacterController 地面检测解决方案
方法一:使用CharacterController自带的isGrounded属性
CharacterController组件内置了专门的地面检测属性isGrounded,这是官方推荐的最简方案,无需额外添加Rigidbody或调整碰撞体。
示例代码:
using UnityEngine; public class PlayerGroundCheck : MonoBehaviour { private CharacterController controller; void Start() { controller = GetComponent<CharacterController>(); } void Update() { if (controller.isGrounded) { // 这里写接触地面后的操作,比如允许跳跃、播放落地动画等 Debug.Log("玩家已接触地面"); } } }
注意:可以调整CharacterController的Skin Width参数(建议设为0.01左右),优化isGrounded的检测精度,避免延迟或误判。
方法二:添加Rigidbody配合碰撞检测
如果需要精准检测与地形的碰撞事件,可按以下步骤配置:
- 给玩家对象添加Rigidbody组件,在Inspector面板勾选
Is Kinematic(启用运动学)——这样既不会干扰CharacterController的移动逻辑,又能触发碰撞事件。 - 确认地形的
Terrain Collider处于启用状态,且标签已设为Terrain。 - 编写碰撞检测代码:
using UnityEngine; public class PlayerCollisionCheck : MonoBehaviour { private void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Terrain")) { // 执行接触地形后的操作 Debug.Log("玩家接触到地形地面"); } } // 可选:用OnCollisionStay持续检测接触状态 private void OnCollisionStay(Collision collision) { if (collision.gameObject.CompareTag("Terrain")) { // 持续接触时的操作 } } }
注意:如果不勾选Is Kinematic,Rigidbody的物理效果会和CharacterController的移动逻辑冲突,导致角色不受控制。
内容的提问来源于stack exchange,提问作者Angelina
相关产品推荐
相关产品推荐

