UE源码分析:Slate 类鼠标输入处理

这篇具有很好参考价值的文章主要介绍了UE源码分析:Slate 类鼠标输入处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序言

UE4.25版本
本章看一下UE的Slate响应鼠标/触摸的处理,主要是按下、移动、抬起等相关。

输入处理

大致的代码流&堆栈

UE源码分析:Slate 类鼠标输入处理

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

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

UE源码分析:Slate 类鼠标输入处理

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

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

UE源码分析:Slate 类鼠标输入处理

RoutePointerMoveEvent函数

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

当前位置SlatePath的获取

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

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

Route函数
UE源码分析:Slate 类鼠标输入处理

传入的lambda举例
UE源码分析:Slate 类鼠标输入处理

SButton消费输入事件举例
UE源码分析:Slate 类鼠标输入处理

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

其他

UI点击穿透BUG的排查

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

玩家输入堆栈的异步处理

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

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

输入的堆栈
UE源码分析:Slate 类鼠标输入处理

处理时的堆栈
以滑动手势为例
UE源码分析:Slate 类鼠标输入处理

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能正确地接收到鼠标离开的事件。文章来源地址https://www.toymoban.com/news/detail-617444.html

到了这里,关于UE源码分析:Slate 类鼠标输入处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4\UE5显示鼠标并自定义的鼠标样式

    UE4UE5中动态修改自定义的鼠标样式. 一,首先在UE场景中显示鼠标 二,创建Wedget  命名为UI_MyCursorStyle 三,在新创建的UI里设置自定义的鼠标样式图片 搜索鼠标,鼠标样式图片应有尽有  四,在Wedget里创建image  五,接着启动场景里更改鼠标样式 效果如下:  分享工程,有需要可

    2024年02月11日
    浏览(30)
  • 【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

     在UE4/UE5中,引擎有它自己的一套框架体系,虚幻就是基于这一个框架体系来实现的。其中就有PlayerController(玩家控制器),玩家控制器中就有对鼠标的一系列设置,包括显示鼠标,允许点击事件等。  1.创建PlayerController,命名为MyPlayerController 2.打开MyPlayerController,勾选参数

    2024年02月10日
    浏览(51)
  • UE4 在游戏运行时显示或隐藏鼠标

    在关卡蓝图中进行如下设置,当按下“Tab”键时显示鼠标,按第二次隐藏,以此类推: 如果希望显示鼠标的同时还能够触发点击事件,就添加如下两个节点 然后就可以在蓝图中编辑静态网格体的点击事件:

    2024年02月11日
    浏览(27)
  • UE4中实现鼠标拖动游戏中的物体

    一、显示鼠标光标、启用鼠标点击事件         可以在关卡蓝图中或者游戏模式中加入下面代码  二、点击物体进入选中状态  三、根据通道获取命中结果          通过这个函数可以获取当前鼠标光标下接触的actor,重新设定actor位置即可。这里可以将类型转换去掉,就可

    2024年02月11日
    浏览(40)
  • UE4 添加按键输入事件 并在蓝图中使用按键输入节点

    选择Edit/ProjectSettings/Engine/Input 在bindings中可以选择添加ActionMappings或则AxisMappings ActionMappings:按键事件,有按下和抬起两个事件,需要分别用两个键触发 AxisMappings:输入事件,返回值为float,对于键盘,值为0和1 ,对于摇杆为0-1 新建一个事件 : 点击ActionMappings或AxisMappings后的

    2024年01月20日
    浏览(26)
  • 【SA8295P 源码分析】25 - QNX Ethernet MAC 驱动 之 emac_isr_thread_handler 中断处理函数源码分析

    【源码分析】 因为一些原因,本文需要移除, 对于已经购买的兄弟,不用担心,不是跑路, 我会继续持续提供技术支持, 有什么模块想学习的,或者有什么问题有疑问的, 请私聊我,我们 +VX 沟通技术问题,一起学习,一起进步 接下来,我一一私聊已经购买的兄弟添加V

    2024年02月11日
    浏览(27)
  • UE5 C++ Slate独立程序的打包方法

     在源码版安装目录内找到已编译通过的xxx.exe,(EngineBinariesWin64xxx.exe),在需要的位置新建文件夹,拷贝源码版Engine内的Binaries、Content、Shaders文件夹到目标文件夹内,将xxx.exe放入对应位置,删除目标文件夹内Binaries、Content、Shaders中多余的文件夹,运行xxx.exe测试

    2024年01月23日
    浏览(31)
  • 【UE4】 通过按钮点击实现摄像机的切换 并通过鼠标控制新摄像机的旋转

    首先创建了4个Actor蓝图类 每个蓝图类内只拥有一个摄像机组件 将每个actor蓝图类摆放到场景的合适位置 在关卡蓝图中创建自定义事件,当该事件触发时切换摄像机 创建一个控件蓝图,在控件蓝图中创建如下5个按钮,并创建点击事件。按钮分别表示车上的4个镜头和车外自由

    2023年04月09日
    浏览(32)
  • epic商城下载,ue4报错处理

     如果你在epic商城下载游戏或者ue引擎出现了这样的报错,那么不必惊慌,这是epic官方的问题,最近访问了别的社区,有不少的伙伴出现了这样的情况,这是由于epic官方更新了16.0出现的bug,下载老版本启动器即可解决,亲测有效,链接放在下面(版本为14.2.1)https://pan.baid

    2024年02月19日
    浏览(21)
  • UE4_UE5源码编译及发布LinuxServer

    :::tip 情景内容 需要开发专用服务器 需要将Server发到云端Linux系统主机 需要关闭SSH,服务一直启用 需要使用UE4 ::: :::danger UE5.1补充内容 准备UE5.1 源码 准备VS2022 准备Linux交叉编译器-v20版本 ::: 1. Visual Studio 2019 1.1 下载 Visual Studio :::warning UE4 编译源码可以使用 VS2022 ,但就此博客

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包