using TH1_Core.Events; using TH1_Core.Managers; using UI.HintUI; using UnityEngine; using UnityEngine.EventSystems; namespace TH1_UI.HintUI { /// /// 悬浮提示的触发器。 /// 此组件内部包含一个可配置的数据提供者(DataProvider),用于生成提示内容。 /// [RequireComponent(typeof(RectTransform))] public class HintTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { [Tooltip("提示窗口相对于鼠标位置的偏移量。")] [SerializeField] private Vector2 positionOffset = new Vector2(15f, -15f); [SerializeField] [Tooltip("hinttext数据来源")] public HintDataProvider DataProvider; #region --- Unity UI Event System Callbacks --- public void OnPointerEnter(PointerEventData eventData) { // 检查数据提供者是否已配置 if (DataProvider == null) { return; } // 如果提供者有效,但它生成了空内容,也不显示 // (这一步也可以移到HintUI里做,但在这里提前判断可以避免无效的事件发布) if (string.IsNullOrEmpty(DataProvider.GetHintText())) { return; } // 创建并填充请求显示提示的事件 ShowHintEvent showHintEvent = new ShowHintEvent { DataProvider = this.DataProvider, Position = (Vector2)eventData.position + this.positionOffset }; // 通过事件管理器发布事件,通知系统显示提示 EventManager.Publish(showHintEvent); } public void OnPointerExit(PointerEventData eventData) { // 发布隐藏提示的事件 EventManager.Publish(new HideHintEvent()); } private void OnDisable() { // 检查DataProvider是否存在,以避免在编辑器中或销毁过程中产生不必要的事件或错误。 if (DataProvider == null) { return; } // 发布一个事件,通知系统“我被禁用了” // 并把自己的身份信息(DataProvider)一起发出去 EventManager.Publish(new HintTriggerDisabledEvent { DataProvider = this.DataProvider }); } #endregion } }