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

Unity中实现非碰撞体点击事件的方法咨询

解决Unity中点击空白区域的检测问题

嘿,我来帮你搞定这个点击空白区域的需求!其实核心思路就是用射线检测(Raycast)——Unity里判断鼠标点击是否命中碰撞体的标准方案,刚好能解决你的问题。

先理清楚逻辑:你已经通过ColliderEventSystem处理了点击对象的逻辑,那我们只需要在Update里检测鼠标点击,然后判断这次点击有没有命中任何带碰撞体的对象,如果没命中,就输出你要的日志。

具体实现步骤

  1. 在Update里监听鼠标左键点击事件(Input.GetMouseButtonDown(0),0对应左键);
  2. 从主相机向鼠标当前位置发射一条射线;
  3. 检查这条射线是否命中了任何碰撞体:如果没命中,就说明点击的是空白区域。

修改后的完整代码

public GameObject[] objects;
// 如果需要只检测特定层的对象,可以添加这个变量,在Inspector里选择对应层
public LayerMask interactableLayer;

private void Start() {
    foreach (GameObject ob in objects) {
        ob.GetOrAddComponent<ColliderEventSystem>().ColliderEntered += Click;
    }
}

private void Update() {
    // 检测鼠标左键按下的瞬间
    if (Input.GetMouseButtonDown(0)) {
        // 创建从主相机指向鼠标位置的射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;

        // 方案1:检测所有带碰撞体的对象
        // if (!Physics.Raycast(ray, out hitInfo))

        // 方案2:更精准,只检测你指定的对象所在的层(推荐)
        if (!Physics.Raycast(ray, out hitInfo, Mathf.Infinity, interactableLayer)) {
            Debug.Log("Bad Click, here is no object");
        }
    }
}

// 你原来的点击对象触发逻辑
private void Click() {
    // 这里写点击到对象时的处理代码
}

注意事项

  • 如果你的对象是2D物体(用BoxCollider2D),要把Physics.Raycast换成Physics2D.Raycast,对应的用RaycastHit2D类型;
  • 确保Camera.main能正确获取到你的主相机(如果主相机没勾选MainCamera标签,需要手动获取相机引用);
  • 用LayerMask过滤层是很有必要的——如果场景里还有其他带碰撞体的物体(比如地面、UI),可以避免这些物体干扰空白点击的判断,只检测你关心的objects数组里的对象。

内容的提问来源于stack exchange,提问作者Anghelina Guznac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:16:25