TH1/Unity/Assets/Scripts/TH1_UI/HintUI/HintTrigger.cs
2026-05-29 17:32:44 +08:00

105 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using TH1_Core.Events;
using TH1_Core.Managers;
using UI.HintUI;
using UnityEngine;
using UnityEngine.EventSystems;
namespace TH1_UI.HintUI
{
/// <summary>
/// 悬浮提示的触发器。
/// 此组件内部包含一个可配置的数据提供者(DataProvider),用于生成提示内容。
/// </summary>
[RequireComponent(typeof(RectTransform))]
public class HintTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
[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;
// TextDataGiantUpgrate 类型走 HeroHintPanel悬浮预览
if (DataProvider.HintDataType == HintDataType.TextDataGiantUpgrate)
{
EventManager.Publish(new ShowHeroHintPanelEvent
{
GiantType = DataProvider.UnitFullType.GiantType,
Position = eventData.position,
Pinned = false
});
return;
}
// 临时诊断:定位 PlayerTask Hint 显示路径
if (DataProvider.HintDataType == HintDataType.PlayerTaskData)
{
var preview = DataProvider.GetHintText();
UnityEngine.Debug.Log($"[HintTrigger-PtrEnter] PlayerTaskType={DataProvider.PlayerTaskType} CustomHint='{DataProvider.PlayerTaskCustomHint}' GetHintText returns='{preview}'");
}
// 如果提供者有效,但它生成了空内容,也不显示
if (string.IsNullOrEmpty(DataProvider.GetHintText())) return;
// 创建并填充请求显示提示的事件
ShowHintEvent showHintEvent = new ShowHintEvent
{
DataProvider = this.DataProvider,
Position = (Vector2)eventData.position + this.positionOffset
};
// 通过事件管理器发布事件,通知系统显示提示
EventManager.Publish(showHintEvent);
}
public void OnPointerClick(PointerEventData eventData)
{
if (DataProvider == null) return;
if (eventData.button != PointerEventData.InputButton.Left) return;
// TextDataGiantUpgrate 类型左键点击 → 固定 HeroHintPanel
if (DataProvider.HintDataType == HintDataType.TextDataGiantUpgrate)
{
EventManager.Publish(new ShowHeroHintPanelEvent
{
GiantType = DataProvider.UnitFullType.GiantType,
Position = eventData.position,
Pinned = true
});
}
}
public void OnPointerExit(PointerEventData eventData)
{
EventManager.Publish(new HideHintEvent());
// 鼠标移出时仅关闭未固定的 HeroHintPanel
EventManager.Publish(new HideHeroHintPanelEvent { Force = false });
}
private void OnDisable()
{
// 检查DataProvider是否存在以避免在编辑器中或销毁过程中产生不必要的事件或错误。
if (DataProvider == null)
{
return;
}
// 发布一个事件,通知系统“我被禁用了”
// 并把自己的身份信息DataProvider一起发出去
EventManager.Publish(new HintTriggerDisabledEvent { DataProvider = this.DataProvider });
}
#endregion
}
}