Unity 3D绑定摄像机聚光灯的BoxCollider与RigidBody碰撞检测失效求解
问题原因
- 回调函数选择错误:
OnCollisionEnter是物理碰撞回调,仅在双方Collider均未开启Is Trigger、且至少一方挂载非运动学Rigidbody时才会触发。而手电筒照射属于区域触发检测,通常会给聚光灯的BoxCollider开启Is Trigger,此时OnCollisionEnter完全不会响应。 - 基础配置不符合要求:
- 碰撞双方未满足触发/碰撞的组件要求:触发检测要求至少一方挂载Rigidbody组件,物理碰撞要求至少一方挂载非运动学Rigidbody
- 项目Layer碰撞矩阵关闭了双方所在层的碰撞权限
- 聚光灯对象名称与代码中判断的
Spot_Light不完全匹配,存在大小写、空格、拼写差异
- 脚本挂载位置错误:
OnCollisionEnter脚本未挂载在参与碰撞的带Rigidbody的对象上
解决方案
- 调整检测逻辑适配触发场景
勾选聚光灯挂载的BoxCollider的Is Trigger属性,将物理碰撞回调替换为触发回调,修改后的代码如下:void OnTriggerEnter(Collider other) { if (other.gameObject.name == "Spot_Light") { Debug.Log("detected"); test = 375; } } - 补全/修正组件配置
- 给聚光灯对象添加Rigidbody组件,勾选
Is Kinematic避免聚光灯受物理力影响产生位移 - 确认被检测物体已挂载Collider组件
- 打开
Edit > Project Settings > Physics,检查Layer Collision Matrix,确认碰撞双方所在层的对应碰撞复选框为勾选状态
- 给聚光灯对象添加Rigidbody组件,勾选
- 校验对象名称:直接复制聚光灯对象的完整名称,替换代码中的
Spot_Light字符串,排除拼写误差 - 确认脚本挂载在带Rigidbody的被检测物体上;如果需要将脚本挂载在聚光灯上,可调整判断逻辑为校验被碰撞物体的名称/标签即可
内容的提问来源于stack exchange,提问作者Yablu
相关产品推荐
相关产品推荐

