UIGU源码分析2:StandaloneInputModule

本文深入解析Unity的StandaloneInputModule,它是EventSystem中处理标准输入如鼠标和触摸的关键组件。BaseInputModule作为基类,PointerInputModule处理指向设备输入,而StandaloneInputModule在此基础上管理鼠标和触摸输入。通过Process方法,它处理输入事件,包括Update、Move和Submit等,确保输入事件正确地传递给UI元素。此外,文章还介绍了触摸事件的处理流程,如Press、Move和Drag事件的处理。

源码2:StandaloneInputModule

在上文EventSystem中,EventSystem调用了BaseInputModule的process函数,将输入的部分交给了输入模块去处理。根据处理流程的不一样,开发者可以实现不同的BaseInputModule子类,并重写process函数。Unity则是提供了默认的StandaloneInputModule类。这一篇文章先来了解BaseInputModule的继承结构,随后以process函数为入口,继续了解事件系统。

BaseInputModule 的继承结构

BaseInputModule抽象类

PointerInputModule抽象类 继承BaseInputModule

StandaloneInputModule类继承PointerInputModule

TouchInputModule类 继承PointerInputModule(已废弃 功能完全整合到了StandaloneInputModule)

上篇EventSytem 有说到 其主要是更新输入模块BaseInputModule 的process 函数 所以这个为输入响应入口

BaseInputModule

//	用来缓存射线投射后的取得的结果
[NonSerialized]
protected List<RaycastResult> m_RaycastResultCache = new List<RaycastResult>();

//轴向相关的数据  
private AxisEventData m_AxisEventData;

private EventSystem m_EventSystem;
private BaseEventData m_BaseEventData;

AxisEventData 的定义也比较简单 一个原始的输入方向 移动朝向的美剧

其他

  /// <summary>
    /// Event Data associated with Axis Events (Controller / Keyboard).
    /// </summary>
    public class AxisEventData : BaseEventData
    {
        /// <summary>
        /// Raw input vector associated with this event.
        /// </summary>
        public Vector2 moveVector { get; set; }

        /// <summary>
        /// MoveDirection for this event.
        /// </summary>
        public MoveDirection moveDir { get; set; }

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

通过输入参数确定轴向数据 (移动朝向 和方向枚举)

 /// <param name="deadZone">Dead zone.</param>
    protected virtual AxisEventData GetAxisEventData(float x, float y, float moveDeadZone)
    {
        if (m_AxisEventData == null)
            m_AxisEventData = new AxisEventData(eventSystem);

        m_AxisEventData.Reset();
        m_AxisEventData.moveVector = new Vector2(x, y);
        m_AxisEventData.moveDir = DetermineMoveDirection(x, y, moveDeadZone);
        return m_AxisEventData;
    }

实际上在输入模块启用的时候 是添加了一个BaseInput 脚本 ,这个脚本实际上是对以前常用的InputSystem的封装 。所有的输入触摸都是通过这里做检测。

/// <summary>
/// The current BaseInput being used by the input module.
/// </summary
public BaseInput input
{
    get
    {
        if (m_InputOverride != null)
        return m_InputOverride;

        if (m_DefaultInput == null)
        {
            var inputs = GetComponents<BaseInput>();
            foreach (var baseInput in inputs)
            {
            // We dont want to use any classes that derrive from BaseInput for default.
            if (baseInput != null && baseInput.GetType() == typeof(BaseInpu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值