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

这篇具有很好参考价值的文章主要介绍了UE5.2 LyraDemo源码阅读笔记(五)输入系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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的圆柱体人移动操作:
UE5.2 LyraDemo源码阅读笔记(五)输入系统,ue5,笔记,java
IA:
1、配置
这个编辑器里启动场景的Experience蓝图是B_LyraDefaultExperience,所生成的简单圆柱体角色数据来自里面的DefaultPawnData变量,指向数据资产SimplePawnData,IA则就配置在SimplePawnData的InputConfig变量指向的数据资产InputData_SimplePawn。所以,这个默认圆柱体角色的IA配置就在这
UE5.2 LyraDemo源码阅读笔记(五)输入系统,ue5,笔记,java
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则是来自插件的配置,稍后提到):
UE5.2 LyraDemo源码阅读笔记(五)输入系统,ue5,笔记,java
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:
UE5.2 LyraDemo源码阅读笔记(五)输入系统,ue5,笔记,java
PMI里携带了IMC,配置在插件ShooterCore里:
UE5.2 LyraDemo源码阅读笔记(五)输入系统,ue5,笔记,java
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)。文章来源地址https://www.toymoban.com/news/detail-663702.html

到了这里,关于UE5.2 LyraDemo源码阅读笔记(五)输入系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【UE】UE5 学习笔记

    快捷键 快捷键 描述 F 定位关一卡对象:双击游戏对象名字或选游戏对象名字 鼠标中键 移动视野 alt+鼠标左键移 旋转视野 滑动鼠标滚轮 缩放视野 alt+鼠标右键拖动鼠标 缩放视野 鼠标左键移动鼠标 前后漫游 WASD+鼠标右键 自由漫游 漫游时滑动鼠标滚轮 调节漫游速度 选中要克隆

    2023年04月14日
    浏览(36)
  • UE5 引擎源码版

    视频:https://www.bilibili.com/video/BV19F411H7CH/ 打开Epic主页,连接Github 进入Github仓库 会提示邀请你加入Epic Team,确认之后,在Epic 仓库里面就可以看到源码仓库了 仓库链接 切换分支 下载源码,确保解压路径没有空格和特殊字符 或者直接去右侧找Release包 再或者直接git clone 运行

    2024年02月11日
    浏览(24)
  • 【UE5 Mass AI】UE5技术演示视频中的MassAI笔记

    在虚幻引擎中,Mass Framework是面向数据的一种框架设计,而MassAI则是一个具体的用例。 Mass Framework可以分为三部分:MassEntity,MassGameplay,MassAI。 1. Mass Entity MassEntity是一种面向数据的框架,该框架有两部分,一为片段(Fragment),非常小的数据结构,会连续的储存在内存中;另为

    2023年04月17日
    浏览(38)
  • 【UE5】如何在UE5.1中创建级联粒子系统

    1. 可以先新建一个actor蓝图,然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中,点击“模板”一项中的下拉框,然后点击“Cascade粒子系统(旧版)” 然后就可以选择在哪个路径下创建级联粒子系统了

    2024年02月06日
    浏览(25)
  • UE5 CommonUI初学笔记

    跟着油管的一个直播视频学习入门的( https://www.youtube.com/watch?v=TTB5y-03SnEt=7903s https://www.youtube.com/watch?v=TTB5y-03SnEt=7903s ),但是由于是直播所以有些混乱并且有些许错误。在这里修正一下错误并记下笔记以供以后查阅。 在看完教学后,觉得CommonUI的优势主要是跨平台开发,以及

    2024年02月08日
    浏览(31)
  • UE5引擎源码小记 —反射信息注册过程

    最近看了看反射相关的知识,用不说一点人话的方式来说,反射是程序在运行中能够动态获取修改或调用自身属性的东西。 一开始我是觉得反射用处好像不大,后续查了下一些反射的使用环境,发现我格局小了,我觉得用处不大的原因是我从c++的角度来考虑使用反射,在c+

    2024年02月15日
    浏览(26)
  • 玩转UE4/UE5动画系统:UE5的运行时(动态)重定向治好了我的精神内耗

    本文参考了油管UP主:AngelV的教程 UE5中新的动画资源的(静态)重定向方法比UE4好用很多,但这种静态的重定向方式依然很让人头疼,因为我们需要对于每一个需要的动画资源为每一个目标骨架生成一套资源备份。尽管个过程并不复杂,但对于诸如老王这种对资源管理有“洁

    2023年04月19日
    浏览(37)
  • UE5 Chaos破碎系统学习2

    本文继续从实用性的角度学习Chaos破碎系统,因为破碎的许多操作需要力场,比较麻烦,因此本文打算绕过力场实现一些效果: 制作Chaos破碎效果时,会在编辑器下看不见材质,我们可以选择GeometryCollectionComponent组件并勾掉Show Bone Colors以显示材质效果: 勾选前后效果: 使用

    2024年02月08日
    浏览(32)
  • UE5内置浏览器插件WebUI简易使用笔记

    之前的项目中为了提高效率,避免使用UE功能不完善的UMG系统,使用了WebUI插件,在UI中内嵌浏览器来展示网页。用Vue框架配合插件制作网页还是比UMG要快很多的,毕竟UE的UI制作插件比较少。 首先在UMG中创建一个新UI,拉一个新的面板,然后在里面加一个WebInterface组件。 之后

    2024年02月04日
    浏览(43)
  • UE5 C++学习笔记 常用宏的再次理解

    1.随意创建一个类,他都有UCLASS()。GENERATED_BODY()这样的默认的宏。 UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject. (告诉引擎我是从远古大帝UObject中,继承而来,我们是一家人,只是我进化了其他功能) GENERATED_BODY()表示我们不直接使用父类的构造函数,如果我

    2024年01月20日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包