⛈️

【UE5】C++でInputMappingContextのアセットを作る

2024/12/07に公開

概要

この記事は一人アドベントカレンダー by ダリアの7日目の記事です。

今回はC++でInputMappingContextにあらかじめキーを設定した状態でアセットを作成するようにし。AnyButtonなど大量のキーを設定できないか試した所上手く行ったのでそれをまとめた記事です。
イメージとしてはこういうのを想定してます。

こういう大量にキー設定が必要だけど手入力するのは大変だから少しでも楽にしたいという方の助けになれば幸いです。

環境

UE5.4.4

やり方

モジュールの追加

まず、Build.csに今回使うモジュールを追加します。

PrivateDependencyModuleNames.AddRange(
new string[]
{
    "CoreUObject",
    "Engine",
    "Slate",
    "SlateCore",
    "InputCore",
+   "EnhancedInput",
+   "InputCore",
+   "UnrealEd",
}
);

次にInputMappingContextを作る関数を作ります。
今回はBlueprintFunctionLibraryで関数を作ります。

#pragma once

#include "CoreMinimal.h"
#include "InputAction.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MappingContextExampleFunctionLibrary.generated.h"

UCLASS()
class MappingContextExample UMappingContextExampleFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
	UFUNCTION(BlueprintCallable)
	static void CreateInputMappingContext(UInputAction* InputAction);
};

#include "InputMappingContext.h"
#include "AssetToolsModule.h"
#include "Factories/DataAssetFactory.h"
#include "UObject/SavePackage.h"
#include "KeyConfigSystemFunctionLibrary.h"

void UMappingContextExampleFunctionLibrary::CreateInputMappingContext(UInputAction* InputAction)
{
    //データアセットを作る
    UDataAssetFactory* factory = NewObject<UDataAssetFactory>(UDataAssetFactory::StaticClass());
    factory->DataAssetClass = UInputMappingContext::StaticClass();
    IAssetTools& AssetTool = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
    UObject* IMCAsset = AssetTool.CreateAsset("IMC_TestForCpp","/Game/",UPrimaryDataAsset::StaticClass(),factory); //Contentフォルダ直下に作成して保存してますが適宜変えていただければ幸いです
    
    //必要であれば設定した状態で保存する
    UInputMappingContext* IMC = Cast<UInputMappingContext>(IMCAsset);
    if(IMC)
    {
        //最初からキーが入っていて欲しい方はMapKey関数の第二引数に欲しいキーを入れる
        IMC->MapKey(InputAction,EKeys::A);                          //例:キーボードのAを紐づける
        IMC->MapKey(InputAction,EKeys::Gamepad_FaceButton_Right);   //例:ゲームパッドのXboxで言うBボタンと紐づける
    
        //更新したのでアセットを保存する
        auto Package = IMCAsset->GetPackage();
        FSavePackageArgs SaveArgs = FSavePackageArgs();
        SaveArgs.SaveFlags = RF_Public | RF_Standalone;
        UPackage::Save(Package,IMCAsset, *FPackageName::LongPackageNameToFilename(Package->GetFName().ToString(), FPackageName::GetAssetPackageExtension()),SaveArgs);
    }
}

次に作った関数を呼ぶようにします。
自分の場合はEditorUtilityWidgetを作成してボタンを押した時に作った関数を呼ぶようにしてす。

関数を呼んだら指定した場所にInputMappingContextのアセットが作成されていれば成功です。

Discussion