《UE4游戏开发》之 《快捷键设置系统》

1.UE4提供了UInputKeySelector控件,可以通过鼠标点击激活快捷键输入,然后点击键盘上按键,可以通过将设置的快捷键,显示出来
2.设置快捷键的根本思路,通过移除在InputSettings上一个AxisMap或者ActionMap,然后把新的AxisMap或者ActionMap添加进InputSettings
3. 关键性代码:

void UI_Option::RebindActionMapping(const FName KeyName, const FKey Key)
{
    
    
	if (KeyName.IsValid())
	{
    
    
		TArray<struct FInputActionKeyMapping> ActionMappings = UInputSettings::GetInputSettings()->GetActionMappings();

		for (int32 ActionIndex = 0; ActionIndex < ActionMappings.Num(); ++ActionIndex)
		{
    
    
			if (ActionMappings[ActionIndex].ActionName == KeyName)
			{
    
    
				UInputSettings::GetInputSettings()->RemoveActionMapping(ActionMappings[ActionIndex]);
				FInputActionKeyMapping ActionMap;
				ActionMap.ActionName = KeyName;
				ActionMap.Key = Key;
				UInputSettings::GetInputSettings()->AddActionMapping(ActionMap);
			}
		}
	}
	UInputSettings::GetInputSettings()->SaveKeyMappings();
	UInputSettings::GetInputSettings()->ForceRebuildKeymaps();
}

void UI_Option::RebindAxisMapping(const FName KeyName, const FKey Key)
{
    
    
	if (KeyName.IsValid())
	{
    
    
		TArray<struct FInputAxisKeyMapping> AxisMappings = UInputSettings::GetInputSettings()->GetAxisMappings();

		for (int32 AxisIndex = 0; AxisIndex < AxisMappings.Num(); ++AxisIndex)
		{
    
    
			if (AxisMappings[AxisIndex].AxisName == KeyName)
			{
    
    
				UInputSettings::GetInputSettings()->RemoveAxisMapping(AxisMappings[AxisIndex]);
				FInputAxisKeyMapping  AxisMap;
				AxisMap.AxisName = KeyName;
				AxisMap.Key = Key;
				UInputSettings::GetInputSettings()->AddAxisMapping(AxisMap);
			}
		}
	}
	UInputSettings::GetInputSettings()->SaveKeyMappings();
	UInputSettings::GetInputSettings()->ForceRebuildKeymaps();
	
}

4.整体思路:
(1)先把ue4 项目设置里Input设置的ActionName和AxisName以及他的绑定Key用一种数据结构存储起来【如果考虑组合键也要把组合键的关系存起来】
(2)在考虑存储数据结构时,要考虑按键【泛指:键盘,手柄】不能冲突,所以在重置一个功能的按键【L】时首先要把输入设置中与按键【L】相关的设置为无效的(当然,当你检测到输入按键【L】有其他功能在使用时,也可以弹提示框警告,然后拒绝重置操作,在这里讨论直接让输入生效,并且使用该快捷键的其他功能快捷键失效)
(3)在考虑数据结构时,需要存储并更新原来的ActionName或AxisName与key的绑定关系
(4)在真正保存应用修改时,执行绑定关系
(5)在考虑数据结构时,需要保存修改后的快捷键设置状态,如果把(1)-(4)考虑的数据结构,和保存数据融合在一起,则显得不够优雅,并且在使用UGameplayStatics::SaveGameToSlot进行保存时,还需要进行数据处理,因为你没必要保存重置、更新功能的方法,所以要与保存的数据进行分离,并且要支持多端输入,保存的最好是一个对应功能Key的数组
(6)功能性结构,与保存数据结构如何关联,增加一个功能如何快速增加快捷键;在考虑这个问题时,有两种方式,一种是函数式,一种是宏;使用宏调试不能正确跳转,建议使用函数式,当点保存时,把新的值写进本地,否者,重新读本地值,重新刷新界面,判定是否更改,可以对比内存值与本地值进行对比;

猜你喜欢

转载自blog.csdn.net/qq_21919621/article/details/107762032