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

Unity中OnMouseEnter函数异常:未Hover即打印日志且Hover后无响应

问题解决思路与修正代码

核心问题分析

  1. 启动时直接触发日志:你在Start()里手动调用了OnMouseEnter()和OnMouseExit(),这俩方法本该由Unity的事件系统自动触发,手动调用自然一启动就打印所有日志。
  2. UGUI不识别OnMouse系列方法:OnMouseEnter/Exit是给带Collider的3D对象用的,UGUI元素(比如你的TextMeshProUGUI)要靠EventSystem的指针接口来响应悬停。
  3. 逻辑错误:你在OnMouseEnter里遍历所有带HoverText标签的文本,不管鼠标悬停的是哪个,这完全不符合需求——应该只处理当前鼠标碰到的那个文本。

修正步骤与代码

第一步:实现UGUI指针交互接口

给脚本添加IPointerEnterHandler和IPointerExitHandler接口,这是UGUI处理鼠标悬停的标准方式。同时确保场景里有EventSystem(创建UI时自动生成,没有的话右键菜单选UI > Event System添加)。

第二步:修正脚本逻辑

移除Start()里的手动方法调用,直接操作当前挂载对象的TextMeshProUGUI组件,保存初始颜色用于悬停后恢复。

修正后的代码:

using UnityEngine;
using UnityEngine.EventSystems;
using TMPro;

public class OptionsHoverSkript : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    private TextMeshProUGUI textComponent;
    private Color originalColor;
    // 自定义悬停颜色,可在Inspector里调整
    public Color hoverColor = new Color32(215, 127, 60, 255);
    // 可选:发光颜色,如果用了带发光的TMP材质
    public Color glowHoverColor = new Color32(215, 127, 60, 255);

    void Awake()
    {
        // 获取当前对象的TextMeshProUGUI组件
        textComponent = GetComponent<TextMeshProUGUI>();
        if (textComponent != null)
        {
            // 保存初始颜色
            originalColor = textComponent.color;
        }
    }

    // 鼠标进入时触发
    public void OnPointerEnter(PointerEventData eventData)
    {
        if (textComponent == null) return;

        // 切换文本颜色
        textComponent.color = hoverColor;

        // 如果要实现发光效果,确保TMP用的是带发光的材质(比如TMP默认的Glow shader)
        if (textComponent.fontSharedMaterial != null)
        {
            textComponent.fontSharedMaterial.SetColor(ShaderUtilities.ID_GlowColor, glowHoverColor);
        }

        // 根据文本内容打印日志
        switch (textComponent.text)
        {
            case "Save":
                Debug.Log("Log1111111111111");
                break;
            case "Load":
                Debug.Log("Log222222222");
                break;
            case "Options":
                Debug.Log("Options hovered");
                break;
            case "Quit":
                Debug.Log("Quit hovered");
                break;
        }
    }

    // 鼠标离开时触发
    public void OnPointerExit(PointerEventData eventData)
    {
        if (textComponent == null) return;

        // 恢复初始颜色
        textComponent.color = originalColor;

        // 恢复初始发光颜色(如果之前改了的话)
        if (textComponent.fontSharedMaterial != null)
        {
            textComponent.fontSharedMaterial.SetColor(ShaderUtilities.ID_GlowColor, Color.clear);
        }

        Debug.Log("ARGH / ANGRY ARNOLD VOICE!!");
    }
}

第三步:场景设置

  1. 给每个需要悬停效果的TextMeshProUGUI对象单独挂载这个脚本(不要只挂在Panel上)。
  2. 确保每个TextMeshProUGUI对象有Graphic Raycaster组件(UGUI元素默认自带,如果没有就手动添加)。
  3. 可选:在Inspector里调整hoverColor和glowHoverColor到你想要的效果。

额外注意

  • 如果用发光效果,要确保你的TextMeshProUGUI用的是支持发光的Shader,比如TMP自带的TextMeshPro/Distance Field(开启Glow选项)或者TextMeshPro/Distance Field - Outline + Soft Shadow这类带发光的Shader。
  • 不要用GameObject.FindGameObjectsWithTag在交互方法里反复查找对象,效率低且逻辑错误,直接获取当前组件才是正确做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:05:30