1、需求:
开启插件时自动往项目设置的输入添加轴映射/操作映射
1.1、起因
不知道大家有没有新建过空项目添加第三人称包的时候或者直接新建第三人称项目的时候,会发现多了几个操作映射和轴映射,这个操作的本质是往config的EngineInput.ini文件添加内容,所以我在想有没有一种办法能够通过代码添加,一开始插件就自己加进去了
2、实现
2.1、前言
因为我是写的插件添加,所以新建一个插件,当然任意插件模板都可以,因为代码是写到启用插件模块里面的,当然如果你有其他需求可以自己选择代码存放的位置,代码功能都是一样的
2.2、准备工作
新建一个空白插件
这是新建的内容包括三个文件:test.h、test.cpp、test.Build.cs
在配置文件添加模块,这一步非常重要!!!
打开cpp可以看到如下两个函数
我们只写开启时的添加,不写删除,因为我之前写过删除但是每次关闭的时候都会崩溃,所以就不写了,如果各位感兴趣可以去查阅一下相关资料
2.3、.h头文件内容
因为我已经明确知道我要添加那几个映射了,所以新建几个布尔值来判断是否添加成功,初始值全部为false,就是未添加。这个根据大家的需求来添加设置。
class FtestModule : public IModuleInterface { public: /** IModuleInterface implementation */ virtual void StartupModule() override; virtual void ShutdownModule() override; //是否添加了这几个映射 bool bMouseX = false; bool bMouseY = false; bool bMouseWheel = false; bool bAnyKey = false; };
2.4、.cpp函数实现内容
我就直接上源码了,里面写有注释
void FDigitalTwinModule::StartupModule() { //获取输入配置 UInputSettings* InputSettings = UInputSettings::GetInputSettings(); //创建轴映射 FInputAxisKeyMapping AxisMapping; //获取所有轴映射 const TArray<FInputAxisKeyMapping>& AxisMappings = InputSettings->GetAxisMappings(); //定义操作映射 FInputAxisKeyMapping ActionMapping; //获取所有操作映射数组 const TArray<FInputActionKeyMapping>& ActionMappings = InputSettings->GetActionMappings(); if (InputSettings) { //遍历轴映射数组,检查是否存在名为"xxx"的轴映射 for (const FInputAxisKeyMapping& Mapping : AxisMappings) { if (Mapping.AxisName == "CusMouseX") { bMouseX = true; break; } } //如果已经存在轴映射 if (bMouseX) { UE_LOG(LogTemp, Warning, TEXT("CusMouse已经存在了!")); } else { //轴映射的名称 AxisMapping.AxisName = "CusMouseX"; //轴映射的按键 AxisMapping.Key = FKey("MouseX"); //添加到轴映射 InputSettings->AddAxisMapping(AxisMapping); //保存 InputSettings->SaveKeyMappings(); //log输出 UE_LOG(LogTemp, Warning, TEXT("CusMouse添加成功!")); } for (const FInputAxisKeyMapping& Mapping : InputSettings->GetAxisMappings()) { if (Mapping.AxisName == "CusMouseY") { bMouseY = true; break; } } if (bMouseY) { UE_LOG(LogTemp, Warning, TEXT("Axis mapping 'CusMouseY' already exists!")); } else { AxisMapping.AxisName = "CusMouseY"; AxisMapping.Key = FKey("MouseY"); InputSettings->AddAxisMapping(AxisMapping); // 使用输入映射工具类处理鼠标滚轮的轴事件 InputSettings->SaveKeyMappings(); } // 检查是否已存在"CusMouseWheel"的轴映射 for (const FInputAxisKeyMapping& Mapping : InputSettings->GetAxisMappings()) { if (Mapping.AxisName == "CusMouseWheel") { bMouseWheel = true; break; } } if (bMouseWheel) { UE_LOG(LogTemp, Warning, TEXT("CusMouseWheel已存在!")); } else { AxisMapping.AxisName = "CusMouseWheel"; AxisMapping.Key = FKey("MouseWheelAxis"); InputSettings->AddAxisMapping(AxisMapping); InputSettings->SaveKeyMappings(); UE_LOG(LogTemp, Warning, TEXT("CusMouseWheel添加成功!")); } //操作映射 //遍历数组查询 for (const FInputActionKeyMapping& Mapping : ActionMappings) { if (Mapping.ActionName.ToString() == "CusAnyKey") { bAnyKey = true; break; } } if (bAnyKey) { UE_LOG(LogTemp, Warning, TEXT("操作映射任意键已存在!")); } else { FInputActionKeyMapping NewMapping; NewMapping.ActionName = "CusAnyKey"; NewMapping.Key = FKey("AnyKey"); NewMapping.bShift = false; NewMapping.bCtrl = false; NewMapping.bAlt = false; NewMapping.bCmd = false; InputSettings->AddActionMapping(NewMapping); InputSettings->SaveKeyMappings(); UE_LOG(LogTemp, Warning, TEXT("操作映射任意键添加成功!")); } } }
3、测试
我们编译运行一下,看看有没有添加成功
可以看到是添加成功了的。
如果大家需要添加别的键,就把MouseX改为自己需要的键值,一般来说KeyName就是等于需要的键值名称
FKey("MouseX");
4、结语
好了,本次分享结束了,如果对您有起到帮助,麻烦点个赞吧!
最后提前祝大家新年快乐~