#memo

indiedev太郎

UE4でキーコンフィグの実装

https://i.gyazo.com/3d68bfaae030d93bef5c22e40bde44da.gif

前回キーマッピング操作系関数をBPに公開したので、ついでにキーコンフィグも作っていく
miyahuji111.hatenablog.com

ここで作った関数に追加で、現在どのキーが割り当てられているのか取得する関数が必要

.h

UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Input")
static void GetCurrentActionMapping(const FName actionName, FKey& key);

UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Input")
static void GetCurrentAxisMapping(const FName actionName, const float scale, FKey& key);

.cpp

void UBlueprintFunctionLibrary1::GetCurrentActionMapping(const FName actionName, FKey& key)
{
	const TArray<struct FInputActionKeyMapping> ActionMappings= GetMutableDefault<UInputSettings>()->ActionMappings;

	for (int32 ActionIndex = ActionMappings.Num() - 1; ActionIndex >= 0; --ActionIndex)
	{
		if (ActionMappings[ActionIndex].ActionName == actionName)
		{
			key = ActionMappings[ActionIndex].Key;
			break;
		}
	}
}

// AxisMappingはscale 1.0 -1.0二つ割り当てられてる可能性があるのでScaleの一致が必要
void UBlueprintFunctionLibrary1::GetCurrentAxisMapping(const FName actionName, const float scale, FKey& key)
{
	const TArray<struct FInputAxisKeyMapping> AxisMappings = GetMutableDefault<UInputSettings>()->AxisMappings;

	for (int32 AxisIndex = AxisMappings.Num() - 1; AxisIndex >= 0; --AxisIndex)
	{
		const FInputAxisKeyMapping& KeyMapping = AxisMappings[AxisIndex];
		if (AxisMappings[AxisIndex].AxisName == actionName
			&& AxisMappings[AxisIndex].Scale == scale)
		{
			key = AxisMappings[AxisIndex].Key;
			break;
		}
	}
}

あとはWidgetのキーイベントでわちゃわちゃ適当にやる、本当に適当なので参考にしないでください
Widgetのテキストバインドの部分もそのままこの関数が使えるし、ゲーム内の字幕とかでも使える

https://i.gyazo.com/14c7756f041453b00c73d7e8b14d27f8.png

重複判定とかデフォルトに戻すとかは、まあ多分いろんな方法でできると思うので、これをたたき台にしていく


参考
Unreal Engine | UPlayerInput
Unreal Engine | FInputActionKeyMapping
Unreal Engine | FInputAxisKeyMapping
UE4 UMGで入力を取得する - GameProgrammar's Night