You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中点击一次触发OnMouseDown仅生成预制体未销毁挂载对象问题

Unity地块点击销毁失效问题解决方案

根因排查方向

  1. 第一次点击时GameManager.Manager.buildingID实际值小于0,未进入if判断分支
  2. 点击射线被上层UI元素拦截,第一次点击未触发地块的OnMouseDown方法
  3. 同位置存在多个重叠的地块对象,第一次点击销毁的是上层地块,视觉上误以为未销毁
  4. 地块的碰撞体未激活/尺寸偏移,第一次点击未命中碰撞体触发方法

可落地排查步骤

  • 在OnMouseDown方法第一行添加日志代码:
    Debug.Log($"点击触发,buildingID:{GameManager.Manager.buildingID},物体ID:{gameObject.GetInstanceID()}");
    
    运行后点击地块,确认第一次点击是否有日志输出、buildingID是否≥0、是否存在多个不同物体ID的日志。
  • 打开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 00:00:02