UnityPointerEventData详解

发布时间:2023-05-18

一、UnityPointerEventData是什么

Unity中,PointerEventData是表示指针设备(例如鼠标、触摸屏)触摸输入的所有事件数据的抽象类。UnityPointerEventData是PointerEventData的一个子类,增加了几个额外的属性和方法,用于更方便地处理Unity的UI事件。 UnityPointerEventData定义了在特定UI事件中相关的指针信息(例如鼠标位置、触摸ID等)。类似于PointerEventData,UnityPointerEventData也包括鼠标、触摸和自定义输入等。

public class UnityPointerEventData : PointerEventData 
{
    public List<RaycastResult> hoveredItems { get; set; }
    public GameObject pointerPress { get; set; }
    public UnityPointerEventData(EventSystem eventSystem)
        : base(eventSystem) { }
    public override void Reset()
    {
        base.Reset();
        hoveredItems.Clear();
        pointerPress = null;
    }
}

二、UnityPointerEventData的属性

1、hoveredItems

hoveredItems是一个RaycastResult列表,表示当前PointerEventData指针下的UI元素。当指针进入、移动或离开UI元素时,事件系统会根据PointerEventData生成新的RaycastResult列表。当识别到指针进入UI元素时,事件系统会执行多个HitTest,并添加每个HitTest的结果到hoveredItems列表。这个列表是只读的,无法直接更改。

foreach (var hoveredItem in eventData.hoveredItems)
{
    // Handle the hovered item
}

2、pointerPress

pointerPress是一个GameObject,表示在手指按下时被点击的UI元素。它被赋予UI元素的引用,当指针按下时它会被设置为pointerPress。当指针在UI元素上移动时,pointerPress将不会改变,直到指针在UI元素外部释放。

if (eventData.pointerPress != null)
{
    eventData.pointerPress.GetComponent<Button>().onClick.Invoke();
}

三、UnityPointerEventData的方法

1、Reset()

Reset()是PointerEventData的一个重载方法,在每次处理事件之前,它将重新设置所有属性。

eventData.Reset();

2、IsPointerMoving()

IsPointerMoving()是一个便捷方法,用于确定指针是否正在移动。它返回一个布尔值,表示指针是否正在移动。如果有,则返回true,否则返回false。

if (eventData.IsPointerMoving())
{
    Debug.Log("The pointer is moving!");
}

3、IsScrolling()

IsScrolling()是一个便捷方法,用于确定是否正在滚动。它返回一个布尔值,表示滚动是否在进行中。如果正在滚动,则返回true,否则返回false。

if (eventData.IsScrolling())
{
    Debug.Log("The user is scrolling!");
}

四、小结

UnityPointerEventData是扩展了基本PointerEventData的子类,封装了更多的UI事件信息,方便处理Unity中UI相关的事件。通过与hoveredItems和pointerPress等对象进行交互,可以更容易地实现交互效果,提高开发效率。