Unity中OnMouseEnter函数异常:未Hover即打印日志且Hover后无响应
问题解决思路与修正代码
核心问题分析
- 启动时直接触发日志:你在
Start()里手动调用了OnMouseEnter()和OnMouseExit(),这俩方法本该由Unity的事件系统自动触发,手动调用自然一启动就打印所有日志。 - UGUI不识别OnMouse系列方法:
OnMouseEnter/Exit是给带Collider的3D对象用的,UGUI元素(比如你的TextMeshProUGUI)要靠EventSystem的指针接口来响应悬停。 - 逻辑错误:你在
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!!"); } }
第三步:场景设置
- 给每个需要悬停效果的TextMeshProUGUI对象单独挂载这个脚本(不要只挂在Panel上)。
- 确保每个TextMeshProUGUI对象有
Graphic Raycaster组件(UGUI元素默认自带,如果没有就手动添加)。 - 可选:在Inspector里调整
hoverColor和glowHoverColor到你想要的效果。
额外注意
- 如果用发光效果,要确保你的TextMeshProUGUI用的是支持发光的Shader,比如TMP自带的
TextMeshPro/Distance Field(开启Glow选项)或者TextMeshPro/Distance Field - Outline + Soft Shadow这类带发光的Shader。 - 不要用
GameObject.FindGameObjectsWithTag在交互方法里反复查找对象,效率低且逻辑错误,直接获取当前组件才是正确做法。
内容的提问来源于stack exchange,提问作者Malgosh
相关产品推荐
相关产品推荐

