使用增强输入的玩家可映射按键

科技   科技   2024-09-13 09:01   上海  


UE 5.3 带来了一些增强输入的新功能,让玩家可以比以往更轻松地将可映射的按键添加到您的游戏中。该系统目前在 Fortnite 中使用,并在 Lyra 内容样本中提供了深入的示例,因此我们在 Epic 中对其进行了尽可能好的“实战测试”。 

与往常一样,如果您有任何问题或错误报告,请随时在开发者论坛上发帖!


要求

本教程适用于增强输入https://dev.epicgames.com/community/learning/tutorials/eD13/unreal-engine-enhanced-input-in-ue5

您需要在项目中使用增强输入才能执行此操作。如果您不确定您的项目是否使用增强输入,或者您想启用它,请先参阅文档

https://docs.unrealengine.com/en-US/enhanced-input-in-unreal-engine/


虚幻引擎中的“玩家可映射键”是什么? 

“玩家可映射按键”是我们在虚幻引擎中使用的术语,用于描述允许玩家“重新映射”或“重新绑定”他们需要按下哪个按钮才能在游戏中执行某些操作。此功能对玩家有很多好处,是任何大型游戏中“预期”会出现的游戏功能之一,但在开发过程中经常被忽视。 

Fortnite 按键绑定屏幕的屏幕截图

值得庆幸的是,增强输入现在有一个“用户设置”界面,您可以利用它快速轻松地将此功能添加到您的游戏中。 


入门

首先,打开项目设置,导航至引擎 > 增强输入 > 用户设置,然后启用“启用用户设置(实验性)”复选框。在这里,您将看到两个新的类选项被启用,“用户设置类”和“默认玩家可映射按键配置文件类”。这是用户设置界面的两个核心概念。


我们建议您从一开始就为您的项目创建这两个的自定义子类,以便在整个开发过程中更轻松地重构或添加新设置。


用户设置类(UEnhancedInputUserSettings)

增强输入用户设置对象是提供的主要接口,用于执行与输入设置相关的任何操作,例如重新映射玩家的按键。这是一个对象,其中可以存储所有用户的输入相关设置,并且可以轻松在增强输入中的任何位置访问。默认情况下,它会存储来自玩家的所有按键映射,但您可以创建自己的子类来添加游戏所需的任何输入设置。一些很好的例子包括瞄准灵敏度、辅助功能设置(切换或按住按钮),甚至陀螺仪瞄准选项。玩家可以根据游戏中的输入体验自定义任何内容。

 

可以使用 C++ 或蓝图中的 GetUserSettings 函数从任何增强输入子系统访问用户设置对象。默认情况下,每个增强输入本地玩家子系统都有自己的设置对象,因此该系统支持分屏或多个本地玩家。



可映射按键配置文件(UEnhancedPlayerMappableKeyProfile)

关键配置文件代表玩家当前设置的一个实例。您一次可以“装备”一个配置文件。每个配置文件都可以通过游戏标记进行识别。如果您愿意,可以将每个配置文件视为为您的游戏提供多个不同“预设”的方式,例如“默认”和“左撇子”。这些是运行时唯一的对象,将根据需要动态创建。

对于大多数游戏来说,只需一个配置文件就足够了,然后只需让玩家重新映射他们关心的按键即可。

用户设置系统的最后一块拼图是玩家可映射按键设置类型。这是一个包含每个可重新映射输入操作信息的对象。 

将此对象视为游戏中每个可重新映射键的“定义”。您希望玩家能够重新映射的每个动作都将具有这些对象之一。在下面的示例图中,这些动作中的每一个在其关联的输入动作资产或输入映射上下文资产(向前移动、跳跃、蹲伏等)上都有一个玩家可映射设置对象的唯一定义。


您会注意到,有一个下拉菜单可供选择玩家可映射按键设置对象的类型。与该系统的其余部分一样,它是完全可自定义的,您可以轻松创建此类型的子类来存储您可能希望在每个操作中访问的任何其他数据。 

有时您希望能够将多个键映射到单个逻辑操作。例如,玩家在键盘和鼠标上的移动使用四个键,WASD。您可能希望使按 WASD 所代表的每个方向都可以重新映射。 

为了支持这一点,您还可以在输入映射上下文资产内部的各个键映射上“覆盖”来自输入操作资产的数据。Lyra 中的 IMC_Default 资产就是这种情况:


如您所见,每个键映射都为其“设置行为”选择“覆盖设置”,并为每个映射指定唯一的设置。

如果愿意,您还可以选择“忽略设置”选项,以使此键映射不可由玩家重新映射。 

让我们回顾一下此属性上每个字段的摘要:



如何开始映射按键

现在我们已经概述了用于创建可重映射键的重要类和类型,让我们通过一个简短的示例来了解如何在游戏中实际使其在运行时工作。在这里,我们将介绍在运行时保存和加载设置所需了解的所有内容。 

对于此示例,我们将使用一个新的第三人称模板项目。 

首先,确保您已在项目设置中启用了玩家可映射键设置(编辑 > 项目设置 > 增强输入 > 用户设置 > 启用用户设置)

接下来,我们需要一个输入动作,我们希望玩家能够重新映射它。让我们使用模板中为我们提供的“IA_Jump”资产。此资产位于 ThirdPerson/Input/Actions/IA_Jump 下的内容文件夹中。


在“用户设置”类别下,选择一个有效的玩家可映射键设置对象类型。在此处填写“名称”属性,并添加一些独特的内容。由于这是一个简单示例,我们将仅使用“跳跃”。为其指定显示名称和类别,如“跳跃(显示)”和“移动”。您可以在此处为其指定任何您喜欢的名称。

现在是保存您的 IA_Jump 资产的好时机。

接下来,打开蓝图,将此输入映射上下文添加到增强输入本地玩家子系统。确保选中“使用设置注册”复选框。这将确保映射上下文已在我们的用户设置系统中注册。 

您可以通过两种方式注册映射上下文。

  1. 在增强输入用户设置对象上明确调用“注册输入映射上下文”

    1. 当您希望 IMC 注册设置,但它不会立即在您的游戏中激活时,这很有用。

    2. 这可能是大多数用户喜欢的方法。

  2. 添加映射上下文时设置“bNotifyUserSettings”标志

    1. 如果您有一个始终应用的“默认”映射上下文,则很有用。


以下是如何在蓝图中执行此操作的示例:

选项 1:添加输入映射上下文时勾选该标记。当您添加始终应用或在游戏开始时应用的“默认”映射上下文时,这很有用。


选项 2:如果您有一个输入映射上下文,但还不想将它应用到玩家,但希望它显示在设置屏幕中,请调用“注册输入映射上下文”。


如果您使用的是 C++ 模板,则输入映射上下文会添加到 TP_ThirdPersonCharacter.cpp 中的 ATP_ThirdPersonCharacter::SetupPlayerInputComponent 函数中。我们可以通过两种方式告诉它注册设置。 


C++
// Option 1: Explicitly add to the settings
if (UEnhancedInputUserSettings* UserSettings =  Subsystem->GetUserSettings())
{
UserSettings->RegisterInputMappingContext(DefaultMappingContext);
}
 
 
// Option 2: Set the flag to register with the settings when you add the mapping context
FModifyContextOptions Opts = {};
Opts.bNotifyUserSettings = true;
 
 
Subsystem->AddMappingContext(DefaultMappingContext, 0, Opts);

注册映射上下文意味着什么?为什么我们需要这样做? 

由于增强输入是一种动态的上下文输入系统,因此您可以随意添加和删除输入映射上下文。但是,当您构建设置系统或屏幕时,您可能希望同时看到游戏中可能重新映射的所有按键,无论该输入映射上下文是否已添加到玩家。

现在映射上下文已在用户设置中注册,我们可以从增强输入用户设置对象中查询所有玩家可重新映射的键。 

您可以获取每个按键配置文件的所有当前玩家可映射按键,如下所示:


C++
 
const UEnhancedInputLocalPlayerSubsystem* EISubsystem = InLocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>();
 
 
const UEnhancedInputUserSettings* UserSettings = EISubsystem->GetUserSettings();
 
for (const TPair<FGameplayTag, TObjectPtr<UEnhancedPlayerMappableKeyProfile>>& ProfilePair : UserSettings->GetAllSavedKeyProfiles())
{
const FGameplayTag& ProfileName = ProfilePair.Key;
const TObjectPtr<UEnhancedPlayerMappableKeyProfile>& Profile = ProfilePair.Value;
 
 
for (const TPair<FName, FKeyMappingRow>& RowPair : Profile->GetPlayerMappingRows())
{
                  // Use FKeyMappingRow to generate your UI!
}
}

或者在蓝图中:

获取当前密钥配置文件的辅助函数:


然后我们可以循环所有可供重新映射的键,如下所示:


重新映射键

现在映射已注册,我们能够查询所有映射,让我们看一个如何实际重新映射按键的简单示例。这通常由向玩家展示的一些 UI 驱动,您会在其中提示他们输入他们想要重新映射到的按键。


C++

FMapPlayerKeyArgs Args = {};
Args.MappingName = ActionMappingName;
Args.Slot = EPlayerMappableKeySlot::First;
Args.NewKey = NewKey;
// If you want to, you can additionally specify this mapping to only be applied to a certain hardware device or key profile
//Args.ProfileId =
//Args.HardwareDeviceId =


if (UEnhancedInputUserSettings* Settings = GetUserSettings())
{
FGameplayTagContainer FailureReason;
Settings->MapPlayerKey(Args, FailureReason);
}


如您所见,您只需调用“MapPlayerKey”函数并传入一些关于 您想要更改的映射名称的参数,例如插槽、要映射到的新键等等。

取消映射(重置)密钥是相同的,但是您调用“UnmapPlayerKey”! 


保存设置

一旦你的玩家修改了设置,你也需要保存它们。你可以用两种主要方式来保存它们。 


“简单”的方式

第一种方式是“内置”方式,这种方式对于单人游戏或小规模游戏来说更简单。您只需在增强输入用户设置中调用“保存设置”功能即可。这会将您的设置保存到名为“EnhancedInputUserSettings.sav”的 SaveGame 插槽文件中。


您可以在项目的“Saved/SaveGames”文件夹中找到它

您也可以按照预期从 C++ 调用此函数。 


自定义实现(C++)

第二种方法是更“高级”的方法,对于任何具有某种云存储或自定义在线设置配置文件解决方案的游戏来说,这种方法都很有用。您可以在 EnhancedInput 用户设置对象上调用“Serialize”函数,并将此数据序列化到任何 FArchive 上。我们可以在这里为您提供一些“防护措施”,但总体而言,这种方法的实现对于每个游戏来说都是非常定制的,具体取决于您决定使用的后端服务。 

您可能遇到的唯一“陷阱”是增强输入用户设置与其关联的 ULocalPlayer 共享生命周期,因此您需要确保在保存和加载设置时增强输入本地玩家子系统可用。 

对于任何大型标题或以任何方式将这些设置保存到云端的任何内容,这都是推荐的解决方案。 


Lyra 示例

Lyra 当前已设置为使用此新系统并附带示例!在GitHub上查看具体示例,或从Epic Games Launcher

 https://github.com/EpicGames/UnrealEngine/blob/ue5-main/Samples/Games/Lyra/Source/LyraGame/Settings/CustomSettings/LyraSettingKeyboardInput.cpp下载内容!它提供了有关如何根据按键映射生成动态 UI、重新映射玩家按键等的示例。 


近期焦点

时隔五年,Tim再临上海,首波议题公布!
Unreal Fest Shanghai 2024 | 虚幻引擎技术开放日,开票啦!
通过游戏动画示例项目获取500多种免费动画
UOD Awards 2024 作品征集,启动!
虚幻引擎5.4现已发布
GDC 2024:来自State of Unreal的重大新闻
欢迎来到全新的虚幻引擎网站

扫描下方二维码,关注后点击菜单栏按钮“更多内容”并选择“联系我们”获得更多虚幻引擎的授权合作方式和技术支持
长按屏幕选择“识别二维码”关注虚幻引擎
“虚幻引擎”微信公众账号是Epic Games旗下Unreal Engine的中文官方微信频道,在这里我们与大家一起分享关于虚幻引擎的开发经验与最新活动。

虚幻引擎
Epic Games 旗下 Unreal Engine 虚幻引擎官方订阅号
 最新文章