UE APlayerController玩家控制器 是如何取得系统所发的系统按下按键信息的?Windows平台

首先我们需要知道

存储按键信息的是 

UPlayerInput类中的   TMap<FKey,FKeyState> KeyStateMap;  变量

应该是这里  我经过从 Windows窗口中的消息处理函数中

进行追踪

所封的消息函数:

LRESULT CALLBACK FWindowsApplication::AppWndProc(HWND hwnd, uint32 msg, WPARAM wParam, LPARAM lParam)
{
    return WindowsApplication_WndProc( hwnd, msg, wParam, lParam );
}

位置:

EpicGames\UE_5.2\Engine\Source\Runtime\ApplicationCore\Private\Windows\WindowsApplication.cpp   922行

最终传入 WindowsApplication->ProcessMessage( hwnd, msg, wParam, lParam );

FWindowsApplication::ProcessMessage( HWND hwnd, uint32 msg, WPARAM wParam, LPARAM lParam ) 函数中进行消息处理

而 WindowsApplication 变量 感觉是全局变量 没看到类作用域

经过寻找 WM_KEYDOWN  系统消息宏

我们发现 UE是统一进入DeferMessage()函数中进行处理的

FWindowsApplication::DeferMessage

( TSharedPtr<FWindowsWindow>& NativeWindow, HWND InHWnd, uint32 InMessage, WPARAM InWParam, LPARAM InLParam, int32 MouseX, int32 MouseY, uint32 RawInputFlags )

我按一个按键时  进入的是else 分支

ProcessDeferredMessage 函数

然后进入 MessageHandler->OnKeyDown( ActualKey, CharCode, bIsRepeat )函数

这是个虚构函数 跳转到此处 

FSlateApplication::OnKeyDown( const int32 KeyCode, const uint32 CharacterCode, const bool IsRepeat ) 

 

后进入FSlateApplication::ProcessKeyDownEvent( const FKeyEvent& InKeyEvent ) 函数中

在该处进入

// Send out key down events.
if ( !Reply.IsEventHandled() )
{
    Reply = FEventRouter::RouteAlongFocusPath(this, FEventRouter::FBubblePolicy(EventPath), InKeyEvent, [] (const FArrangedWidget& SomeWidgetGettingEvent, const FKeyEvent& Event)

由于是个Lambda函数的回调 该函数返回 FReply 类型 这个语法我还不知道 我只知道一个尾置返回 我们追踪到这个位置使用了Lambda函数 425行

最后运行了Lambda函数中的

const FReply TempReply = SomeWidgetGettingEvent.Widget->OnKeyDown(SomeWidgetGettingEvent.Geometry, Event);

然后到

再到

FSceneViewport::OnKeyDown( const FGeometry& InGeometry, const FKeyEvent& InKeyEvent )

函数

再进入

ViewportClient->InputKey(FInputKeyEventArgs(this, InKeyEvent.GetInputDeviceId(), Key, InKeyEvent.IsRepeat() ? IE_Repeat : IE_Pressed, 1.0f, false) 函数

进入了UGameViewportClient::InputKey(const FInputKeyEventArgs& InEventArgs)

在664行  我们终于见到了熟悉的东西 

TargetPlayer->PlayerController

ULocalPlayer::PlayerController 玩家控制器变量

从该变量去调用了 

bool APlayerController::InputKey(const FInputKeyParams& Params)

看这是断点信息  参数传入了一个有按键信息的类型

比如这里 我按了M键

在该函数中 

这一行 进行了  UPlayerInput::InputKey(const FInputKeyParams& Params) 函数的调用

玩家输入类中在此处进行将 Key 存储 到 KeyStateMap 变量中

我们注意到函数里有很多这样的语句

FKeyState& KeyState = KeyStateMap.FindOrAdd(Params.Key);

至于处理输入的地方是

UPlayerInput中的 ProcessInputStack()虚构函数  

virtual void ProcessInputStack(const TArray<UInputComponent*>& InputComponentStack, const float DeltaTime, const bool bGamePaused);

当然UPlayerInput 中的ProcessInputStack()函数处理的是UE旧的输入方式  操作映射和轴映射

UE新的增强型输入 所对应的 处理玩家输入类是 UEnhancedPlayerInput

在UEnhancedPlayerInput中有全新的ProcessInputStack 重写的虚函数

virtual void ProcessInputStack(const TArray<UInputComponent*>& InputComponentStack, const float DeltaTime, const bool bGamePaused) override;

来进行处理新的增强型输入逻辑

总结:

按键信息是保存到 UPlayerInput :: KeyStateMap 变量中

这个信息

通过APlayerController :: InputKey 函数调用 UPlayerInput :: InputKey 函数中

进行储存  

有错误请佬们指正  我是个学习UE的萌新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433102.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

确保 Active Directory 的安全性

Active Directory 是 Microsoft 的专有服务&#xff0c;使管理员能够管理和访问网络资源。它有助于存储和组织有关各种对象的信息&#xff0c;例如网络资源、共享文件夹、文件和用户。它还处理用户和域之间的交互。AD 在验证用户身份方面发挥着重要作用。 获得对 AD 的初始访问…

DAY11_(简易版)VUEElement综合案例

目录 1 VUE1.1 概述1.1.1 Vue js文件下载 1.2 快速入门1.3 Vue 指令1.3.1 v-bind & v-model 指令1.3.2 v-on 指令1.3.3 条件判断指令1.3.4 v-for 指令 1.4 生命周期1.5 案例1.5.1 需求1.5.2 查询所有功能1.5.3 添加功能 2 Element2.0 element-ui js和css和字体图标下载2.1 …

深度学习模型:GAN(生成对抗网络)

简述 生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;简称GAN&#xff09;是一种深度学习模型&#xff0c;由Ian Goodfellow于2014年提出。它的主要目标是生成与真实数据分布相似的新数据。GAN在许多领域都取得了显著的成功&#xff0c;如图像生成…

js中字符串string,遍历json/Object【匹配url、邮箱、电话,版本号,千位分割,判断回文】

目录 正则 合法的URL 邮箱、电话 字符串方法 千位分割&#xff1a;num.slice(render, len).match(/\d{3}/g).join(,) 版本号比较 判断回文 json/Object 遍历 自身属性 for...inhasOwnProperty(key) Object.获取数组(obj)&#xff1a;Object.keys&#xff0c;Object…

ps缺少msvcp140.dll要怎么办?多种解决msvcp140.dll的方法分享

当您在尝试打开Adobe Photoshop时&#xff0c;如果遭遇一个典型的错误&#xff1a;“程序无法启动&#xff0c;因缺少MSVCP140.dll文件”&#xff0c;请放心&#xff0c;这并不少见&#xff0c;许多Photoshop用户都可能曾面临过这种情况。处理这个问题实际上是相当简单的。接下…

Vulnhub靶场DC-5

本机192.168.223.128 目标192.168.223.133 主机发现 nmap -sP 192.168.223.1/24 端口扫描nmap -sV -A -p- 192.168.223.133 开放了 80 111 47089三个端口 先进入web界面看一下 contact界面好像有留言功能&#xff0c;尝试一下xss <script>alert(111)</script&…

已解决:安卓,怎么优雅接入科大讯飞语音评测功能?

写在前面&#xff1a; 网上关于讯飞接入的博客都很少&#xff0c;按说讯飞都是业界翘楚&#xff0c;不知为何&#xff0c;很少搜索到精品&#xff0c;一搜就是一个要求开会员的博客&#xff0c;我也是醉了。讯飞提供的文档也是不清晰&#xff0c;我是摸着石头过河&#xff0c;…

CSS如何设置谷歌浏览器字体小于12px

第一种方法 在浏览器的设置中修改&#xff0c;不过只能修改自己的浏览器字体大小&#xff0c;用户的不行 点击设置 找到自定义字体 修改字体大小 第二种方法 使用2D转换 scale() 当我们想设置字体大小为6px的时候 大家要记住&#xff0c;只能在块盒与行块盒中设置&#xf…

LeetCode.42. 接雨水

题目 题目链接 分析 读完本题以及结合题目给出的图我们可以很直观的看到&#xff0c;这道题目是让我们求形成凹槽的面积。 我们可以针对每一个数字形成凹槽的面积进行计算&#xff0c;然后相加数组每一个数字形成凹槽的面积即可。 那么问题来了&#xff0c;怎么知道一个数…

500行Python代码构建的AI搜索工具!

一个500行Python代码构建的AI搜索工具&#xff0c;而且还会开源&#xff0c;试了一下麻雀虽小该有的都有。 后端是Mixtral-8x7b 模型&#xff0c;托管在 LeptonAI 上&#xff0c;输出速度能达到每秒大约200个 token&#xff0c;用的搜索引擎是 Bing 的搜索 API。 作者还写了一…

Spring: alibaba代码规范校验工具checkstyle

文章目录 一、idea配置checkstyle插件二、激活CheckStyle三、配置自动格式化功能 一、idea配置checkstyle插件 下载 Intellij IDEA Checkstyle 插件&#xff1a;File -> setting -> plugin通过关键字CheckStyle-IDEA搜索并安装。 安裝完成后重启idea 二、激活CheckSty…

海康实时监控预览视频流接入web

我们采取的方案是后端获取视频流返回给前端&#xff0c;然后前端播放 海康开放平台海康威视合作生态致力打造一个能力开放体系、两个生态圈&#xff0c;Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上&#xff0c;…