UE5.2 LyraDemo源码阅读笔记(五)输入系统

news2024/9/24 9:25:52

Lyra里使用了增强输入系统,首先知道增强输入系统里的三个类型配置。

一、Input Actions (IA):
输入操作带来的变量,与玩家的输入组件绑定,回调里驱动玩家行为。

二、InputMappingContext(IMC):
表示一套按键输入配置,让按键与IA绑定,从而使用按键携带的变量驱动IA生效。
IMC上确定哪个按键驱动哪个IA,比如键盘Q是隐射使用技能一的IA还是技能二的IA。

三、UPlayerMappableInputConfig(PMI):
对IMC进行配置,进一步模块化。
PMI是跟硬件设备挂钩的配置,PMI里携带IMC,比如输入设备是PC键盘还是手柄类型的PMI,游戏根据硬件设备驱动生效对应的PMI。

所以,看懂Lyra的IA、IMC、PMI配置在哪里、在哪来生效大概就看懂他的输入系统了。

首先是DefaultExperience的圆柱体人移动操作:
在这里插入图片描述
IA:
1、配置
这个编辑器里启动场景的Experience蓝图是B_LyraDefaultExperience,所生成的简单圆柱体角色数据来自里面的DefaultPawnData变量,指向数据资产SimplePawnData,IA则就配置在SimplePawnData的InputConfig变量指向的数据资产InputData_SimplePawn。所以,这个默认圆柱体角色的IA配置就在这
在这里插入图片描述
2、绑定:
IA的绑定是在Experience加载完成后初始化调用下来开始初始化的在:
ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputComponent)里初始化。

void ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputComponent)
{
	...
	//Ability类功能绑定
	// Add the key mappings that may have been set by the player
	LyraIC->AddInputMappings(InputConfig, Subsystem);

	//基础移动功能绑定
	// This is where we actually bind and input action to a gameplay tag, which means that Gameplay Ability Blueprints will
	// be triggered directly by these input actions Triggered events. 
	TArray<uint32> BindHandles;
	LyraIC->BindAbilityActions(InputConfig, this, &ThisClass::Input_AbilityInputTagPressed, &ThisClass::Input_AbilityInputTagReleased, /*out*/ BindHandles);

	LyraIC->BindNativeAction(InputConfig, LyraGameplayTags::InputTag_Move, ETriggerEvent::Triggered, this, &ThisClass::Input_Move, /*bLogIfNotFound=*/ false);
	LyraIC->BindNativeAction(InputConfig, LyraGameplayTags::InputTag_Look_Mouse, ETriggerEvent::Triggered, this, &ThisClass::Input_LookMouse, /*bLogIfNotFound=*/ false);
	LyraIC->BindNativeAction(InputConfig, LyraGameplayTags::InputTag_Look_Stick, ETriggerEvent::Triggered, this, &ThisClass::Input_LookStick, /*bLogIfNotFound=*/ false);
	LyraIC->BindNativeAction(InputConfig, LyraGameplayTags::InputTag_Crouch, ETriggerEvent::Triggered, this, &ThisClass::Input_Crouch, /*bLogIfNotFound=*/ false);
	LyraIC->BindNativeAction(InputConfig, LyraGameplayTags::InputTag_AutoRun, ETriggerEvent::Triggered, this, &ThisClass::Input_AutoRun, /*bLogIfNotFound=*/ false);
	...
}

IMC:
配置:
编辑器里默认起始场景的圆柱体玩家的IMC配置在蓝图B_SimpleHeroPawn的LyraHero组件的变量DefaultInputConfigs上。(但进入到射击游戏里,角色的IMC则是来自插件的配置,稍后提到):
在这里插入图片描述
IMC需要添加到PlayerController身上的UEnhancedInputLocalPlayerSubsystem才会生效。
IMC的添加地方和IA同在一个方法里,ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputComponent)

void ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputComponent)
{
	// Register any default input configs with the settings so that they will be applied to the player during AddInputMappings
	for (const FMappableConfigPair& Pair : DefaultInputConfigs)
	{
		if (Pair.bShouldActivateAutomatically && Pair.CanBeActivated())
		{
			FModifyContextOptions Options = {};
			Options.bIgnoreAllPressedKeysUntilRelease = false;
			// Actually add the config to the local player							
			Subsystem->AddPlayerMappableConfig(Pair.Config.LoadSynchronous(), Options);	
		}
	}
}

走到这里是可以通过键盘操作玩家移动了。

从上面的for知道,DefaultInputConfigs变量里配置的IMC如果是空的话是没有添加到SubSystem的,射击游戏里的角色就没有配置,它们的IMC是通过插件方式来添加的,这么说了还有另外一个地方会调用Subsystem->AddPlayerMappableConfig(Pair.Config.LoadSynchronous(), Options)。

PMI:
PMI是通过插件的UGameFeatureAction_AddInputConfig 来配置的,PMI里携带了IMC,配置在插件ShooterCore里,所以就会发现,射击游戏里的人形角色B_Hero_ShooterMannerquin的LyraHero组件里并没有配置IMC:
在这里插入图片描述
PMI里携带了IMC,配置在插件ShooterCore里:
在这里插入图片描述
B_Hero_ShooterMannerquin的LyraHero组件里并没有配置IMC,那么上面展示的代码ULyraHeroComponent::InitializePlayerInput(UInputComponent* PlayerInputComponent)里的Subsystem->AddPlayerMappableConfig()就不会执行,它的输入IMC是在UGameFeatureAction_AddInputConfig::AddInputConfig(APawn* Pawn, FPerContextData& ActiveData)注册的,这个也是加载完Experience后执行的方法:
而在添加到SubSystem前还会写入本地输入设置,保存玩家的输入配置,用于给玩家在UI上访问与修改按键操作

bool FMappableConfigPair::RegisterPair(const FMappableConfigPair& Pair)
{
	ULyraAssetManager& AssetManager = ULyraAssetManager::Get();

	if (ULyraSettingsLocal* Settings = ULyraSettingsLocal::Get())
	{
		// Register the pair with the settings, but do not activate it yet
		if (const UPlayerMappableInputConfig* LoadedConfig = AssetManager.GetAsset(Pair.Config))
		{
			Settings->RegisterInputConfig(Pair.Type, LoadedConfig, false);
			return true;
		}	
	}
	
	return false;
}

写入SubSystem

void UGameFeatureAction_AddInputConfig::AddInputConfig(APawn* Pawn, FPerContextData& ActiveData)
{
	...
	for (const FMappableConfigPair& Pair : InputConfigs)
	{
		if (Pair.bShouldActivateAutomatically && Pair.CanBeActivated())
		{
			Subsystem->AddPlayerMappableConfig(Pair.Config.LoadSynchronous(), Options);
		}
	}
	...
}

玩家更改键位输入的方法是:ULyraSettingsLocal::AddOrUpdateCustomKeyboardBindings(const FName MappingName, const FKey NewKey, ULyraLocalPlayer* LocalPlayer)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量删除文件名中特定文字的方法

怎么批量删除文件名中特定文字&#xff1f;作为一个上班族&#xff0c;在电脑上进行批量文件名称的修改是一个非常常见的事情。如果你有大量的图片、视频、音乐和其他文件&#xff0c;希望批量删除文件名中的特定文字&#xff0c;那么不妨看看下面的介绍&#xff0c;并尝试使用…

制定设备维护管理计划时需要考虑的不同维护策略

在现代企业运营中&#xff0c;保障关键资产的稳定运行对于实现高效生产和客户满意度至关重要。然而&#xff0c;如何制定适合企业的设备维护管理计划却是一个需要深入思考和策划的重要问题。不同类型的维护策略可以满足不同的运营需求和预算限制。在本文中&#xff0c;我们将探…

142亿亿次/秒?长安汽车与百度达成战略合作,推动智能低碳出行

8月17日&#xff0c;重庆长安汽车股份有限公司与百度正式达成战略合作协议&#xff0c;双方将在多个领域展开深度合作&#xff0c;包括云计算、人工智能、大数据和物联网。这一合作旨在推动长安汽车向智能低碳的出行科技公司转型。 据悉&#xff0c;双方还共同建立了长安汽车智…

时序数据库influxdb笔记

官方资料 https://docs.influxdata.com/influxdb/v2.7/install/?tLinux https://www.influxdata.com/influxdb/ 安装 1、linux平台下 1&#xff09;下载 2&#xff09;解压 3&#xff09;添加账户&#xff08; adduser influx&#xff09; 4&#xff09;设置目录权限 5…

NodeJs导出PDF

&#xff08;优于别人&#xff0c;并不高贵&#xff0c;真正的高贵应该是优于过去的自己。——海明威&#xff09; 场景 根据订单参数生成账单PDF 结果 示例代码 /* eslint-disable no-unused-vars */ /* eslint-disable no-undef */ /* eslint-disable complexity */ const…

忘记LockSupport怎么用了?那我们举个有趣的小例子,永远记住它!

概述 LockSupport是一个非常方便实用的线程阻塞工具&#xff0c;它可以在线程内任意位置让线程阻塞。和Thread.suspend()相比&#xff0c;它弥补了由于resume()在前发生&#xff0c;导致线程无法继续执行的情况。和Object.wait()方法相比&#xff0c;它不需要先获得某个对象的…

用easyui DataGrid编辑树形资料

easyui显示编辑树形资料有TreeGrid元件&#xff0c;但是这个元件的vue版本和react版本没有分页功能。virtual scroll功能也表现不佳。 我用DataGrid来处理。要解决的问题点&#xff1a; &#xff08;1&#xff09;如何显示成树形。即&#xff0c;子节点如何有缩进。 先计算好…

精准无误的公文材料:感谢爱校对软件

在公文处理的过程中&#xff0c;无论是机构还是企业&#xff0c;我们都追求精准无误的结果。在这个信息化、智能化不断发展的时代&#xff0c;爱校对软件以其卓越的性能和优质的服务&#xff0c;赢得了大家的广泛好评。 首先&#xff0c;爱校对软件采用了最新的自然语言处理和…

深入了解msfconsole功能详解

一、前言 正如上篇文章所述&#xff0c;刚开始接触msf&#xff0c;单纯是为了分析某些漏洞&#xff0c;然后在msf中查找相应漏洞软件版本&#xff0c;系统版本的exp便于漏洞分析&#xff0c;同时进行偶尔的exp修改&#xff0c;这就是初期对于msf的使用&#xff0c;以至于我认为…

ai写真制作让你的照片焕发异彩

最近&#xff0c;越来越多的人开始使用ai写真应用程序来美化他们的照片。这些应用程序使用人工智能技术来将人们的照片变成更有艺术感的写真照&#xff0c;是人们的照片看起来更加生动、自然。今天&#xff0c;我将通过几幅生动的ai写真照片&#xff0c;来带你深入探索ai写真ap…

高等数学教材重难点题型总结(三)微分中值定理和导数的应用

第三章&#xff0c;微分中值定理的证明题等&#xff0c;非常重要&#xff0c;需要牢牢掌握 1.证明中值定理对某函数在给定区间上的正确性 2.与中值定理有关的证明题 3.微分中值定理应用于求证不等式 4.洛必达法则求极限 5.洛必达的经典错误反例 6.按某项实现多项式幂展开 7.求带…

外卖订餐系统源码:数字化餐饮新篇章

在当今数字化时代&#xff0c;外卖订餐系统源码成为餐饮行业的一颗明星&#xff0c;为餐厅和顾客提供了无与伦比的便捷体验。在本文中&#xff0c;我们将一起探索一个简单的外卖订餐系统源码示例&#xff0c;了解它是如何将美食带到您的门口的。 # 导入所需模块 import time#…

影响力再度提升,Smartbi多次蝉联Gartner、IDC等权威认可

近期&#xff0c;思迈特软件捷报频传&#xff0c;Smartbi凭借技术创新实力和产品能力&#xff0c;成功入选Gartner中国增强数据分析代表厂商及自助分析代表厂商&#xff0c;同时&#xff0c;连续三年蝉联“IDC中国FinTech 50”榜单。 Part.1 再次被Gartner提名 Smartbi深度融…

实现动画的连续展示 JAVA

目录 1、前言&#xff1a;2、图片的展示以及自动关闭&#xff1a;3、动画的连续展示&#xff1a; 1、前言&#xff1a; 要实现动画的流畅展示需要在能展示图片的基础上对图片进行关闭&#xff0c;再切换下一张图片&#xff0c;这要关闭窗口&#xff0c;与延时函数以及while函数…

FreeModbus——移植(三)

参考自&#xff1a;手把手教你移植FreeModbus到STM32【看评论区引导&#xff0c;领取全套资料包】_freemodbus移植_HQYJ520的博客-CSDN博客 1.准备源码 1.这里用到串口进行传输&#xff0c;所以我没拷贝一个正常的串口工程&#xff08;我用的是正点原子f4库函数版本&#xff…

C++之map的emplace与pair插入键值对用例(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【Python】解决 pip 开了网络代理之后无法安装包的问题

问题描述 开了网络代理之后&#xff0c;python 的 pip 就无法安装包了&#xff0c;报如下错误&#xff1a; $ pip install netsm Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, sta…

爬虫逆向实战(二)--某某观察城市排行榜

一、数据接口分析 主页地址&#xff1a;某某观察 1、抓包 通过抓包可以发现数据接口是multi 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无cookie是否加密&#xff1f; 无响应数据是否加密&#xff1f; 通过查看“响应”板块可以…

Web菜鸟教程 - Springboot接入认证授权模块

网络安全的重要性不言而喻&#xff0c;如今早已不是以前随便弄个http请求就能爬到数据的时代&#xff0c;而作为一个架构师&#xff0c;网络安全必须在产品开发之初就考虑好。因为在产品开发的后期&#xff0c;一方面是客户增多&#xff0c;压力变大&#xff0c;可供利用的时间…

指针作为函数参数间接赋值成立的三个条件,例程,内存调用模型

#include <stdio.h> #include <stdlib.h> int config_read(char * filep, char *** p, int * len) { printf(“config file name is :%s\n”, filep); char ** tempP (char**)malloc(sizeof(char *)*10); for(int i 0; i<10; i) {tempP[i] (char *)malloc(2…