105 lines
3.9 KiB
C#
105 lines
3.9 KiB
C#
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
|
||
}
|
||
}
|