Unity3D高级编程:主程手记
上QQ阅读APP看书,第一时间看更新

4.3.3 事件数据模块

事件数据模块对整个输入事件系统的作用就是,它主要定义并且存储了事件发生时的位置、与事件对应的物体、事件的位移大小、触发事件的输入类型及事件的设备信息等。事件数据模块主要是为了获取数据,提供数据服务。

事件数据模块包含PointerEventData、AxisEventData、BaseEventData三个类,分别为点位事件数据类、滚轮事件数据类、事件基础数据类。PointerEventData类和AxisEventData类继承自BaseEventData类,且AxisEventData类的逻辑量非常少,因为它只需要提供滚轮的方向信息。其源码如下:


namespace UnityEngine.EventSystems
{
    public class AxisEventData : BaseEventData
    {
        // 移动方向
        public Vector2 moveVector { get; set; }
        public MoveDirection moveDir { get; set; }

        public AxisEventData(EventSystem eventSystem)
            : base(eventSystem)
        {
            moveVector = Vector2.zero;
            moveDir = MoveDirection.None;
        }
    }
}

BaseEventData类定义了几个常用的接口,其子类PointerEventData是最常用的事件数据。BaseEventData类的代码量并不多,基本全是数据定义,源码如下:


public class PointerEventData : BaseEventData
{
    public GameObject pointerEnter { get; set; }

    // 接收OnPointerDown事件的物体
    private GameObject m_PointerPress;
    // 上一次接收OnPointerDown事件的物体
    public GameObject lastPress { get; private set; }
    // 接收按下事件后无法响应的物体
    public GameObject rawPointerPress { get; set; }
    // 接收OnDrag事件的物体
    public GameObject pointerDrag { get; set; }

    public RaycastResult pointerCurrentRaycast { get; set; }
    public RaycastResult pointerPressRaycast { get; set; }

    public List<GameObject>hovered = new List<GameObject>();

    public bool eligibleForClick { get; set; }

    public int pointerId { get; set; }

    // 鼠标或触摸时的点位
    public Vector2 position { get; set; }
    // 滚轮的移速
    public Vector2 delta { get; set; }
    // 按下时的点位
    public Vector2 pressPosition { get; set; }

    // 为双击服务的上次点击时间
    public float clickTime { get; set; }
    // 为双击服务的点击次数
    public int clickCount { get; set; }

    public Vector2 scrollDelta { get; set; }
    public bool useDragThreshold { get; set; }
    public bool dragging { get; set; }

    public InputButton button { get; set; }
}

上述代码中PointerEventData为数据类的核心类,它存储了大部分事件系统逻辑需要的数据,包括按下时的位置、松开与按下的时间差、拖曳的位移差、点击的物体等,承载了所有输入事件需要的数据。事件数据模块的意义是存储数据并为逻辑部分做好准备。

事件数据模块的主要作用是在各种事件发生时,为事件逻辑做好数据工作。