Unity中移动rigidbody立方体与静态空对象的碰撞检测实现方法
Unity碰撞检测方案解答
方法选择判断标准
两个方法的适用场景完全明确,直接根据你的需求选即可:
- 需要物理碰撞效果(移动的立方体撞上静态物体后被阻挡、产生物理反馈,不会穿模):使用
OnCollisionEnter,无需修改Collider的Is Trigger属性 - 仅需要碰撞事件通知,不需要物理阻挡(移动的立方体可以穿过静态物体,只需要触发对应逻辑):使用
OnTriggerEnter,需要给任意一方的Collider勾选Is Trigger属性
你的场景满足Unity碰撞触发的前置要求:两个物体都带有Collider,且其中一方(移动立方体)挂载了Rigidbody组件,两种方法都可以正常触发,只需要按需求选择即可。
具体调用方法
OnCollisionEnter 用法
脚本挂载到带Rigidbody的移动立方体上即可,示例代码如下:
using UnityEngine; public class CollisionCheck : MonoBehaviour { // 碰撞开始时触发1次 private void OnCollisionEnter(Collision collisionInfo) { // 建议给静态对象提前设置标签「StaticBlock」,方便判断碰撞目标 if (collisionInfo.gameObject.CompareTag("StaticBlock")) { Debug.Log("检测到与静态立方体碰撞"); // 这里写你需要执行的逻辑 } } // 碰撞持续过程中每帧触发1次 private void OnCollisionStay(Collision collisionInfo) { if (collisionInfo.gameObject.CompareTag("StaticBlock")) { // 持续碰撞逻辑 } } // 碰撞结束时触发1次 private void OnCollisionExit(Collision collisionInfo) { if (collisionInfo.gameObject.CompareTag("StaticBlock")) { // 碰撞结束逻辑 } } }
注意:不要给任何一方的Collider勾选Is Trigger,移动立方体的Rigidbody不要勾选Is Kinematic。
OnTriggerEnter 用法
首先给静态对象的Box Collider勾选Is Trigger属性,脚本同样挂载到移动立方体上,示例代码如下:
using UnityEngine; public class TriggerCheck : MonoBehaviour { // 进入触发器范围时触发1次 private void OnTriggerEnter(Collider other) { if (other.CompareTag("StaticBlock")) { Debug.Log("进入静态立方体触发范围"); // 触发逻辑 } } // 在触发器范围内每帧触发1次 private void OnTriggerStay(Collider other) { if (other.CompareTag("StaticBlock")) { // 持续触发逻辑 } } // 离开触发器范围时触发1次 private void OnTriggerExit(Collider other) { if (other.CompareTag("StaticBlock")) { // 触发结束逻辑 } } }
注意:如果勾选了静态对象的Is Trigger,移动立方体的Rigidbody依然不能勾选Is Kinematic,否则无法触发事件。
内容的提问来源于stack exchange,提问作者RNG
相关产品推荐
相关产品推荐

