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

Unity 2D中如何检测GameObject的点击事件?

解决Unity中GameObject点击检测失效问题

核心排查与修复步骤

1. 修正2D射线检测的Z轴参数

你的射线代码中ScreenToWorldPoint使用了Input.mousePosition的默认Z值(0),但正交相机下需要匹配物体与相机的深度差,否则射线会偏离目标。修改代码如下:

private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        // 计算相机到目标物体的Z轴偏移(示例:相机Z=-10,物体Z=0,偏移值为10)
        float zOffset = Camera.main.nearClipPlane - transform.position.z;
        Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(
            new Vector3(Input.mousePosition.x, Input.mousePosition.y, zOffset)
        );
        RaycastHit2D hit = Physics2D.Raycast((Vector2)mouseWorldPos, Vector2.zero);

        if (hit.collider != null && hit.collider.gameObject == gameObject)
        {
            Debug.Log("Clicked on the GameObject.");
            popupWindow.SetActive(true);
        }
    }
}

2. 确保碰撞体组件配置正确

  • 目标GameObject必须挂载2D碰撞体组件(如BoxCollider2D/CircleCollider2D),且碰撞体范围完全覆盖可视区域(可在Scene视图勾选Edit Collider调整)。
  • 若碰撞体开启Is Trigger,需在射线检测中加入触发器检测参数:
    RaycastHit2D hit = Physics2D.Raycast((Vector2)mouseWorldPos, Vector2.zero, Mathf.Infinity, 
                                         LayerMask.GetMask("Default"), 
                                         -Mathf.Infinity, Mathf.Infinity);
    

3. 验证OnMouseDown的生效条件

  • 目标GameObject必须有碰撞体(开启Is Trigger时,需额外挂载Rigidbody2D组件,且设置Body Type为Static/Dynamic)。
  • 场景中的主相机必须勾选MainCamera标签,确保Unity能识别用于射线检测的相机。
  • 脚本需直接挂载在目标GameObject上,且脚本未被禁用。

4. 处理Canvas层级与射线冲突

  • 若目标是UI元素(在Canvas下):不能用Physics2D.Raycast,需使用EventSystem接口实现点击检测:
    using UnityEngine.EventSystems;
    
    public class UIClickHandler : MonoBehaviour, IPointerClickHandler
    {
        public void OnPointerClick(PointerEventData eventData)
        {
            Debug.Log("UI GameObject clicked.");
            popupWindow.SetActive(true);
        }
    }
    
    同时确保Canvas有Graphics Raycaster组件,场景中存在EventSystem对象(右键UI→Event System可快速创建)。
  • 若Canvas遮挡非UI物体:将Canvas的Render Mode改为Screen Space - Camera并绑定主相机,调整UI的Sorting Layer顺序,让非UI物体处于UI上层。

5. 确认射线检测的层掩码

显式指定射线检测的目标层,避免误检测其他层物体:

LayerMask targetLayer = LayerMask.GetMask("Default");
RaycastHit2D hit = Physics2D.Raycast((Vector2)mouseWorldPos, Vector2.zero, Mathf.Infinity, targetLayer);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:58:31