序言

UE4.25版本

本章看一下UE的 “类鼠标”输入处理(其实就是鼠标和触摸的输入,我也没找到专门的术语来代指,英文UE用的是PointerXXX),主要是按下、移动、抬起等相关的的处理。

输入处理

大致的代码流&堆栈

  • FWindowsApplication 是平台层的,处理Windows事件
  • FSlateApplication 是引擎层的核心处理
  • XXXViewport 逐渐过渡到用户层

从玩家操作到引擎处理的大概过程

  • 其中RoutePointerXXXEvent中的XXX可能是Down/Moved/Up

以Moved事件处理举例事件路由

RoutePointerMoveEvent函数

  • 通知Slate用户事件的开始/完成,以及状态
  • 检查和处理拖拽
  • 检查上一次的事件中一组Slate,对比当前的处理Enter/Leave等逻辑
  • 检查有没有捕获的Slate路径,有的话处理捕获的否则处理当前位置的(二选一)

当前位置SlatePath的获取

所谓SlatePath主要是其一组Slate,这里就是当前(鼠标)位置下,一层层中的Slate。如上图当前位置Slate路径所示,引擎用了类似空间分割的方法,把屏幕分为若干格子,只检查当前位置所在的格子中的slate以优化性能。遍历这些Slate把有效的按照顺序加入数组。

Route函数遍历和事件的“消费”

Route函数

传入的lambda举例

SButton消费输入事件举例

其实这里就是拿到一个Slate路径里的一组Slate一个个的试,如果那一次被处理了,遍历随即结束,用我的话说就是被“消费”了(对应玩家输入事件的生产)。遍历策略如上图示。

其他

UI点击穿透BUG的排查

SButton那里示例了ButtonDown的处理,当没有选择DownAndUp这个Method类型枚举时,没有捕获这个Slate,当拖动手指到其他地方时,Moved事件处理时没有捕获的Slate导致计算当前位置的,响应了移动摄像机的处理,导致UI穿透的错觉。处理方式也很简单,处理摄像机逻辑那块如果没有Start事件进来,Moved事件为不合法不处理。

玩家输入堆栈的异步处理

Viewport得到输入联动到玩家输入时,UPlayerInput::TouchInput方法得到输入不会立刻处理,而是放在堆栈里面等待Tick处理。

Tick时调用UPlayerInput::ProcessInputStack分发给各个模块的委托进行处理。

输入的堆栈

处理时的堆栈

以滑动手势为例

Slate输入相关的一些概念

聚焦(Focus)

SetFocus是UWidget类里面的方法,最终会调用到FSlateApplication的SetUserFocus方法。SetFoucs顾名思义,就是设置聚焦,当widget获得聚焦或失去聚焦时会触发相关事件 --知乎 日耀水鸡

捕获(Capture)

上面有提到,就是在某些时候(按下Start)锁定某个Slate,方便后续一些操作(如拖拽)使用

模拟触摸(Faking Touch)

在ue4里,鼠标点击和Touch(移动设备的触屏)是两种不同的操作。为了在编辑器下模拟Touch,通常会勾选ProjectSettings里的UseMouseForTouch。这个情况下要想判断是真正的Touch还是模拟的Touch,可以调用FSlateApplication的IsFakingTouchEvents --知乎 日耀水鸡

SlateUser

上面有提到。具体来说,SlateUser代表一个Slate系统的用户,在多用户或多触摸输入的情况下,SlateUser的概念尤为重要。例如,在一个多触摸设备上,可能有多个触摸点同时与屏幕进行交互,这时就需要有多个SlateUser来分别处理每个触摸点的事件。

系统合成事件(Syntetic)

在上述FSlateApplication::RoutePointerMoveEvent中,多次判断了bIsSynthetic是否时合成事件。这里的合成事件是指系统自动产生的事件。例如,当一个Widget被销毁或隐藏时,系统可能会自动产生一个鼠标移动事件,以确保其他Widget能正确地接收到鼠标离开的事件。

UE源码分析:Slate 类鼠标输入处理的更多相关文章

  1. Struts2 源码分析——DefaultActionInvocation类的执行action

    本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...

  2. Struts2 源码分析——Result类实例

    本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容 ...

  3. tornado框架源码分析---Application类之debug参数

    先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A ...

  4. LinqToDB 源码分析——DataContext类

    LinqToDB框架是一个轻量级的ORM框架.当然,功能上来讲一定比不上Entity Framework的强大.但是在使用上总让笔者感觉有一点Entity Framework的影子.笔者想过可能的原因 ...

  5. yii2 源码分析Action类分析 (六)

    Action类是控制器的基类, <?php namespace yii\base; use Yii; /** * Action是所有控制器动作类的基类,它继承组件类 * * 动作提供了重用动作方 ...

  6. yii2 源码分析 model类分析 (五)

    模型类是数据模型的基类.此类继承了组件类,实现了3个接口 先介绍一下模型类前面的大量注释说了什么: * 模型类是数据模型的基类.此类继承了组件类,实现了3个接口 * 实现了IteratorAggreg ...

  7. yii2 源码分析 object类分析 (一)

    转载请注明链接http://www.cnblogs.com/liuwanqiu/p/6737327.html yii2基本上所有的类都是继承的object类,下面就来分析一下object类吧 obje ...

  8. yii2 源码分析Behavior类分析 (四)

    Behavior类是所有事件类的基类,它继承自object类 Behavior类的前面注释描述大概意思: * Behavior类是所有事件类的基类 * * 一个行为可以用来增强现有组件的功能,而不需要 ...

  9. yii2 源码分析Event类分析 (三)

    转载请注明链接:http://www.cnblogs.com/liuwanqiu/p/6739880.html Event是所有事件的基类,它继承Object类 Event类上面的注释的大致意思: * ...

  10. yii2 源码分析 Component类分析 (二)

    转载请注明链接http://www.cnblogs.com/liuwanqiu/p/6739538.html 组件(component),是Yii框架的基类,实现了属性.事件.行为三类功能,它集成自o ...

随机推荐

  1. [Pytorch框架] 2.1.4 数据的加载和预处理

    文章目录 PyTorch 基础 :数据的加载和预处理 Dataset Dataloader torchvision 包 torchvision.datasets torchvision.models ...

  2. 用Aspose-Java免费实现 PDF、Word、Excel、Word互相转换并将转换过得文件上传OSS,返回转换后的文件路径

    嘿嘿嘿.嘿嘿,俺又回来了! github代码地址 https://github.com/Tom-shushu/work-study 接口文档有道云 https://note.youdao.com/s/ ...

  3. C++ Primer 5th 阅读笔记:前言

    机器效率和编程效率 Its focus, and that of its programming community, has widened from looking mostly at machi ...

  4. CentOS 8 部署 ELK 8.7真的是方便呀

    之前装过一次 ELK 7.7,相比之下装 8.7可方便太多了~ CentOS版本 CentOS-8.5.2111-x86_64-dvd1 JAVA ELK会自己使用内置版本的JDK ElasticSe ...

  5. 2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢。 返回先手赢还是后手赢。

    2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢. 返回先手赢还是后手赢. ...

  6. TokenObtainPairView

    TokenObtainPairView是由Django REST framework的SimpleJWT库提供的视图.它用于生成JSON Web Token(JWT)

  7. vue全家桶进阶之路43:Vue3 Element Plus el-form表单组件

    在 Element Plus 中,el-form 是一个表单组件,用于创建表单以便用户填写和提交数据.它提供了许多内置的验证规则和验证方法,使表单验证更加容易. 使用 el-form 组件,您可以将表 ...

  8. 在DevExpress中使用BandedGridView表格实现多行表头的处理

    在之前较早随笔中介绍过实现多行表头的处理,通过手工创建字段以及映射数据源字段属性的方式实现,有些客户反映是否可以通过代码方式更方便的创建对应的处理操作,因此本篇随笔继续探讨这个多行表头的处理的操作,使 ...

  9. MySQL uuid及其相关的一些简单性能测试

    运维同事导入一批大约500万左右的数据,耗时较久.他使用的是纯SQL导入,主键使用的是UUID,因为业务原因没有使用自增ID. 因为是内网,不能远程访问. 通过沟通,大致觉得有两个原因,一是因为UUI ...

  10. R 数据可视化 : 热图

    本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组. 在生物信息领域我们常常使用 R 语言对数据可视化.在对数据可视化的时候,我 ...