Unity 2D中如何检测目标对象点击?如何忽略Confiner?
解决Unity中OnMouseDown被Confiner遮挡的问题
给你几个实用的解决办法,按需选择:
直接让Confiner不接收射线检测(最简单的方案)
如果Confiner是UI元素(比如全屏Image),找到它的Image组件,把Raycast Target的勾选去掉,这样UI射线就不会检测到它,目标按钮的OnMouseDown就能正常触发。
如果是3D物体的Confiner,把它的Layer改成Unity默认的Ignore Raycast层,系统射线会自动忽略这个层的所有物体,完全不影响其他对象的点击检测。自定义射线检测,只检测目标按钮所在Layer
如果你需要保留Confiner的其他功能,不想改它的设置,可以手动写射线检测逻辑,只针对目标按钮的Layer:
3D场景可替换OnMouseDown用这段代码:void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 替换成你按钮所在的Layer名字 int buttonLayer = LayerMask.NameToLayer("ButtonLayer"); if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, 1 << buttonLayer)) { // 这里写按钮点击后的逻辑 Debug.Log("目标按钮被点击"); } } }UI场景则用EventSystem检测:
using UnityEngine.EventSystems; using System.Collections.Generic; void Update() { if (Input.GetMouseButtonDown(0)) { PointerEventData eventData = new PointerEventData(EventSystem.current); eventData.position = Input.mousePosition; List<RaycastResult> hitResults = new List<RaycastResult>(); EventSystem.current.RaycastAll(eventData, hitResults); foreach (var result in hitResults) { // 用标签判断目标按钮,也可以换成Layer判断 if (result.gameObject.CompareTag("TargetButton")) { // 处理点击逻辑 Debug.Log("目标按钮被点击"); break; } } } }给Confiner的OnMouseDown留空
这个方案优先级最低,不推荐:给Confiner挂个脚本,里面的OnMouseDown方法什么都不写。但它只能避免Confiner触发错误逻辑,没法让目标按钮的OnMouseDown触发——因为射线会先检测到最上层的Confiner。
内容的提问来源于stack exchange,提问作者xogeh
相关产品推荐
相关产品推荐

