Unity中点击一次触发OnMouseDown仅生成预制体未销毁挂载对象问题
Unity地块点击销毁失效问题解决方案
根因排查方向
- 第一次点击时
GameManager.Manager.buildingID实际值小于0,未进入if判断分支 - 点击射线被上层UI元素拦截,第一次点击未触发地块的
OnMouseDown方法 - 同位置存在多个重叠的地块对象,第一次点击销毁的是上层地块,视觉上误以为未销毁
- 地块的碰撞体未激活/尺寸偏移,第一次点击未命中碰撞体触发方法
可落地排查步骤
- 在
OnMouseDown方法第一行添加日志代码:
运行后点击地块,确认第一次点击是否有日志输出、buildingID是否≥0、是否存在多个不同物体ID的日志。Debug.Log($"点击触发,buildingID:{GameManager.Manager.buildingID},物体ID:{gameObject.GetInstanceID()}"); - 打开Unity编辑器的Hierarchy搜索框,输入地块对象名,确认同坐标下是否有多个重复地块。
- 检查场景中所有UI元素的
Raycast Target属性,不需要响应点击的透明UI、背景UI取消勾选该属性。 - 选中地块的碰撞体组件,勾选
Is Trigger临时测试,确认点击触发是否恢复正常。
解决方案
常规修复方案
如果确认是UI拦截/OnMouseDown触发不稳定问题,直接替换成手动射线检测逻辑,替换原有OnMouseDown代码即可:
public GameObject particle; public GameObject[] building; private void Update() { // 只响应左键点击 if (!Input.GetMouseButtonDown(0)) return; // 检测点击是否命中当前地块 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (!Physics.Raycast(ray, out RaycastHit hit) || hit.collider.gameObject != gameObject) return; // 原有业务逻辑 if (GameManager.Manager.buildingID >= 0) { Instantiate(building[GameManager.Manager.buildingID], transform.position, Quaternion.identity); Instantiate(particle, transform.position, Quaternion.identity); Destroy(gameObject); } }
布尔值自动重置问题修复
你提到之前用布尔值标记地块状态会自动重置,可在布尔值的定义处添加断点、或在set访问器中加日志打印调用栈,即可定位到篡改布尔值的代码逻辑,通常是对象被意外销毁重建、或异步延迟逻辑异常修改导致。
内容的提问来源于stack exchange,提问作者nahtap
相关产品推荐
相关产品推荐

