74 lines
2.4 KiB
C#
74 lines
2.4 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
|
||
{
|
||
[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
|
||
}
|
||
} |