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

Unity地形平面OnMouseOver()与OnMouseExit()事件触发异常求助

解决Unity平面鼠标事件触发异常的问题

嘿,这个问题我之前帮好几个开发者排查过,大概率是碰撞体配置、射线检测设置或者脚本变量的问题,咱们一步步来解决:

1. 先检查平面预制体的碰撞体设置

这是最常见的触发异常原因:

  • 确保每个平面都有独立的专属碰撞体:别用Mesh Collider(尤其是没烘焙的),直接给预制体加Plane Collider就好,它完美适配平面的形状。
  • 检查碰撞体范围:运行游戏时,选中单个平面,在Scene视图里看碰撞体的绿色线框是不是刚好覆盖这个平面,有没有和相邻平面重叠、或者超出平面范围(比如缩放平面后没调整碰撞体大小)。
  • 避免父物体带碰撞体:如果生成的平面都挂在同一个父物体下,千万别给父物体加碰撞体,不然射线会直接触发父物体的碰撞体,导致整个象限/长条区域被识别。

2. 排查射线检测的相关配置

Unity的OnMouseXXX事件依赖主相机的射线检测,这些设置错了也会出问题:

  • 检查主相机的Event Mask:打开主相机的Camera组件,确保你的平面所在的层(比如默认层或者自定义的Terrain层)被包含在Event Mask里,不然射线会直接忽略这些平面,触发其他错误对象。
  • 测试相机投影模式:如果用的是透视相机,远处的平面可能因为射线夹角问题被同时检测到,试试暂时改成正交相机,看是不是还会出现长条触发的情况——如果正交模式下正常,那就是透视相机的射线范围问题,可以调整相机的视野或者平面的布局来优化。
  • 排查遮挡物:检查主相机前方有没有透明UI、空物体带碰撞体之类的东西,它们会拦截射线,导致触发错误的对象。

3. 修正鼠标事件脚本的变量问题

很多时候是脚本里的共享变量搞的鬼:

  • 别用静态变量存原始颜色:如果你的脚本里写了static Color originalColor,所有平面都会共享这个颜色值,一个平面变色后,其他平面的原始颜色也会被覆盖,看起来像是随机触发。改成非静态变量,在Start里存储每个平面自己的原始颜色:
private Renderer _renderer;
private Color _originalColor;

void Awake()
{
    _renderer = GetComponent<Renderer>();
}

void Start()
{
    _originalColor = _renderer.material.color;
}

void OnMouseOver()
{
    _renderer.material.color = Color.blue; // 替换成你的指定颜色
}

void OnMouseExit()
{
    _renderer.material.color = _originalColor;
}
  • 避免共享Material实例:如果所有平面用的是同一个Material,那一个平面变色会导致所有平面跟着变,看起来像是整个区域触发。要么给每个平面实例化独立的Material,要么用MaterialPropertyBlock来修改颜色(性能更好):
private MaterialPropertyBlock _propBlock;
private Renderer _renderer;
private Color _originalColor;

void Awake()
{
    _renderer = GetComponent<Renderer>();
    _propBlock = new MaterialPropertyBlock();
}

void Start()
{
    _renderer.GetPropertyBlock(_propBlock);
    _originalColor = _propBlock.GetColor("_Color");
}

void OnMouseOver()
{
    _propBlock.SetColor("_Color", Color.blue);
    _renderer.SetPropertyBlock(_propBlock);
}

void OnMouseExit()
{
    _propBlock.SetColor("_Color", _originalColor);
    _renderer.SetPropertyBlock(_propBlock);
}

4. 检查平面生成逻辑

最后确认生成代码有没有问题:

  • 确保每个生成的平面都是独立的GameObject:别把多个平面合并成一个物体,或者让它们共享任何组件。
  • 检查生成的位置和缩放:确保平面之间是紧密排列但没有重叠的,重叠的平面会让射线同时检测到多个,导致随机触发其中一个。

按照这个顺序排查,基本就能解决触发异常的问题啦!

内容的提问来源于stack exchange,提问作者Rory L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:34:29