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

Unity PhysicsRaycaster无法正确识别3D碰撞体边缘(OnMouseEnter异常)

鼠标悬停碰撞体识别范围偏移问题

问题现象

主相机挂载PhysicsRaycaster后,鼠标悬停3D立方体的碰撞体识别范围异常:实际有效区域比预期在x+、y-方向上更小,光标划过对应边缘时,无法触发预期的悬停效果(物体变红、光标切换)。

已排查项

  • 确认3D盒碰撞体与立方体完全贴合
  • 场景仅主相机挂载PhysicsRaycaster,无其他相机
  • 测试过多个Unity版本、全新项目,有无Cinemachine Brain的场景均存在问题
  • 尝试过OnMouseEnter/Exit、OnPointerEnter/Exit及EventTrigger多种事件接口,问题依旧

关联代码

using UnityEngine;

public class TextOverlay : MonoBehaviour
{
    public Texture2D[] cursorTexture;
    public Renderer rend;

    private void Start()
    {
        rend = GetComponent<Renderer>();
        ChangeCursor(false);
    }

    public void OnMouseEnter()
    {
        rend.material.color = Color.red;
        ChangeCursor(true);
    }

    public void OnMouseOver()
    {
        rend.material.color -= new Color(0.1F, 0, 0) * Time.deltaTime;
    }

    public void OnMouseExit()
    {
        rend.material.color = Color.white;
        ChangeCursor(false);
    }

    public void ChangeCursor(bool value)
    {
        Debug.Log("change cursor: " + value);
        if (value)
            Cursor.SetCursor(cursorTexture[1], Vector2.zero, CursorMode.Auto);
        else
            Cursor.SetCursor(cursorTexture[0], Vector2.zero, CursorMode.Auto);
    }
}

解决方向

1. 校准PhysicsRaycaster与相机参数

  • 打开主相机的PhysicsRaycaster组件,确认Event Mask包含当前物体所在层,避免层过滤导致检测范围异常
  • 检查相机的Rect参数,确保视口为完整的(0,0,1,1),排除视口裁剪导致的有效检测区域缩小
  • 正交模式下核对正交大小、相机位置与物体的匹配度;透视模式下检查FOV是否过大引发边缘射线偏移

2. 可视化射线检测路径

添加调试代码,直观查看射线是否命中碰撞体边缘:

void Update()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    Debug.DrawRay(ray.origin, ray.direction * 100, Color.blue);
}

运行后观察蓝色射线的路径,若射线偏移,排查UI缩放、分辨率适配设置(如Canvas Scaler的缩放模式)

3. 修复输入坐标偏移问题

  • 用EventSystem.current.IsPointerOverGameObject()配合射线检测双重验证,避免隐藏的UI事件干扰输入坐标
  • 替换为IPointerEnterHandler接口并确保场景存在EventSystem对象:
using UnityEngine.EventSystems;

public class TextOverlay : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    // 原有代码...

    public void OnPointerEnter(PointerEventData eventData)
    {
        rend.material.color = Color.red;
        ChangeCursor(true);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        rend.material.color = Color.white;
        ChangeCursor(false);
    }
}

4. 检查物体变换组件

  • 重置立方体的Transform组件(右键→Reset),避免局部缩放、旋转导致碰撞体世界空间范围偏移
  • 若父物体有缩放,会影响碰撞体的世界范围,确认父物体变换为默认状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:55:09