【UE5】PS4 / PS5 のコントローラーを使う

### 追記

UE 5.4 でリリースされた Game Input というプラグインを使えば、より簡単に実装できるかもしれない。

https://dev.epicgames.com/community/learning/tutorials/EpZ4/unreal-engine-game-input-for-windows-experimental-release-notes

# 概要

UE5 は標準で DirectInput のコントローラーに対応していないが、その中で PS4 / PS5 のコントローラーである DUALSHOCK 4 / DualSense に対応させる方法を説明する。

# 方法

## 1. Windows RawInput プラグインを有効化する

編集 > プラグイン > "raw" と検索 > Windows RawInput のチェックボックスにチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/24343fa0-7296-43d5-39d6-092a5b3a0b8b.png)

## 2. Raw Input の設定を追加する

プロジェクトの Config フォルダ内にある `DefaultInput.ini` に以下のテキストを追加し、エディタを再起動する。

```DefaultInput.ini
[/Script/RawInput.RawInputSettings]
+DeviceConfigurations=(VendorID="0x054C",ProductID="0x05C4",AxisProperties=((Key=Gamepad_RightY,bInverted=True,bGamepadStick=True),(Key=Gamepad_RightX,bGamepadStick=True),(Key=Gamepad_LeftY,bInverted=True,bGamepadStick=True),(Key=Gamepad_LeftX,bGamepadStick=True),(Key=Gamepad_Special_Left_X,Offset=-1.142857),(bEnabled=False,Key=GenericUSBController_Axis6),(Key=Gamepad_RightTriggerAxis),(Key=Gamepad_LeftTriggerAxis)),ButtonProperties=((Key=Gamepad_FaceButton_Left),(Key=Gamepad_FaceButton_Bottom),(Key=Gamepad_FaceButton_Right),(Key=Gamepad_FaceButton_Top),(Key=Gamepad_LeftShoulder),(Key=Gamepad_RightShoulder),(Key=Gamepad_LeftTrigger),(Key=Gamepad_RightTrigger),(Key=Gamepad_Special_Left),(Key=Gamepad_Special_Right),(Key=Gamepad_LeftThumbstick),(Key=Gamepad_RightThumbstick),(Key=GenericUSBController_Button13),(Key=GenericUSBController_Button14),(bEnabled=False,Key=GenericUSBController_Button15),(bEnabled=False,Key=GenericUSBController_Button16),(bEnabled=False,Key=GenericUSBController_Button17),(bEnabled=False,Key=GenericUSBController_Button18),(bEnabled=False,Key=GenericUSBController_Button19),(bEnabled=False,Key=GenericUSBController_Button20)))
+DeviceConfigurations=(VendorID="0x054C",ProductID="0x09CC",AxisProperties=((Key=Gamepad_RightY,bInverted=True,bGamepadStick=True),(Key=Gamepad_RightX,bGamepadStick=True),(Key=Gamepad_LeftY,bInverted=True,bGamepadStick=True),(Key=Gamepad_LeftX,bGamepadStick=True),(Key=Gamepad_Special_Left_X,Offset=-1.142857),(bEnabled=False,Key=GenericUSBController_Axis6),(Key=Gamepad_RightTriggerAxis),(Key=Gamepad_LeftTriggerAxis)),ButtonProperties=((Key=Gamepad_FaceButton_Left),(Key=Gamepad_FaceButton_Bottom),(Key=Gamepad_FaceButton_Right),(Key=Gamepad_FaceButton_Top),(Key=Gamepad_LeftShoulder),(Key=Gamepad_RightShoulder),(Key=Gamepad_LeftTrigger),(Key=Gamepad_RightTrigger),(Key=Gamepad_Special_Left),(Key=Gamepad_Special_Right),(Key=Gamepad_LeftThumbstick),(Key=Gamepad_RightThumbstick),(Key=GenericUSBController_Button13),(Key=GenericUSBController_Button14),(bEnabled=False,Key=GenericUSBController_Button15),(bEnabled=False,Key=GenericUSBController_Button16),(bEnabled=False,Key=GenericUSBController_Button17),(bEnabled=False,Key=GenericUSBController_Button18),(bEnabled=False,Key=GenericUSBController_Button19),(bEnabled=False,Key=GenericUSBController_Button20)))
+DeviceConfigurations=(VendorID="0x054C",ProductID="0x0CE6",AxisProperties=((Key=Gamepad_RightTriggerAxis),(Key=Gamepad_LeftTriggerAxis),(Key=Gamepad_RightY,bInverted=True,bGamepadStick=True),(Key=Gamepad_RightX,bGamepadStick=True),(Key=Gamepad_LeftY,bInverted=True,bGamepadStick=True),(Key=Gamepad_LeftX,bGamepadStick=True),(bEnabled=False,Key=GenericUSBController_Axis7),(Key=Gamepad_Special_Left_X,Offset=-1.142857)),ButtonProperties=((Key=Gamepad_FaceButton_Left),(Key=Gamepad_FaceButton_Bottom),(Key=Gamepad_FaceButton_Right),(Key=Gamepad_FaceButton_Top),(Key=Gamepad_LeftShoulder),(Key=Gamepad_RightShoulder),(Key=Gamepad_LeftTrigger),(Key=Gamepad_RightTrigger),(Key=Gamepad_Special_Left),(Key=Gamepad_Special_Right),(Key=Gamepad_LeftThumbstick),(Key=Gamepad_RightThumbstick),(Key=GenericUSBController_Button13),(Key=GenericUSBController_Button14),(bEnabled=False,Key=GenericUSBController_Button15),(bEnabled=False,Key=GenericUSBController_Button16),(bEnabled=False,Key=GenericUSBController_Button17),(bEnabled=False,Key=GenericUSBController_Button18),(bEnabled=False,Key=GenericUSBController_Button19),(bEnabled=False,Key=GenericUSBController_Button20)))
bRegisterDefaultDevice=True
```

この設定はプロジェクト設定の「Raw 入力」という項目でも変更が可能。
終わり！

# 対応表

| コントローラー | Input Key |
|:-:|:-:|
| 左スティック | ゲームパッド左サムスティック |
| 右スティック | ゲームパッド右サムスティック |
| 十字キー | タッチパッドボタンX軸 |
| SHARE ボタン | ゲームパッド特別仕様の左 |
| OPTIONS ボタン | ゲームパッド特別仕様の右 |
| × | ゲームパッドAボタン |
| ○ | ゲームパッドBボタン |
| □ | ゲームパッドXボタン |
| △ | ゲームパッドYボタン　 |
| L1 | ゲームパッド左ショルダー |
| R1 | ゲームパッド右ショルダー|
| L2 | ゲームパッド左トリガー |
| R2 | ゲームパッド右トリガー |
| L3 | ゲームパッド左サムスティックボタン |
| R3 | ゲームパッド左サムスティックボタン |
| PS ボタン | GenericUSBControllerボタン13 |
| タッチパッドボタン | GenericUSBControllerボタン14 |

十字キーはなぜか4つのボタンではなく1つの軸として認識されるため、以下のようなブループリントで対応する必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/c84ce0c2-69a0-3ce8-340e-ec41d3bc4b32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/658501a9-da2c-37ae-c0d8-c11c45694450.png)

マクロのコピペ用テキストはこちら。

```:Gamepad D-pad
BPGraph(GraphName="Gamepad D-pad",GraphType=GT_Macro,OriginalBlueprint=LevelScriptBlueprint'"/Game/ThirdPerson/Maps/ThirdPersonMap.ThirdPersonMap:PersistentLevel.ThirdPersonMap"',NodesString="Begin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name=\"K2Node_Tunnel_0\"\r\n   bCanHaveOutputs=True\r\n   MetaData=(Category=NSLOCTEXT(\"KismetSchema\", \"Default\", \"Default\"))\r\n   NodePosY=112\r\n   NodeGuid=F48B47494769A5D1A726538BB63C2E80\r\n   CustomProperties Pin (PinId=2DD0B5004D798448EAB01AAD607044F6,PinName=\"Execute\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SwitchInteger_0 DF04DDB14E8C4334D1CD36B1310824A6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=6103CBDA4F74F199895072B7DA5E07F9,PinName=\"AxisValue\",Direction=\"EGPD_Output\",PinType.PinCategory=\"real\",PinType.PinSubCategory=\"double\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_PromotableOperator_0 7366A3F340215CB28DD96B8AA387713A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties UserDefinedPin (PinName=\"Execute\",PinType=(PinCategory=\"exec\"),DesiredPinDirection=EGPD_Output)\r\n   CustomProperties UserDefinedPin (PinName=\"AxisValue\",PinType=(PinCategory=\"real\",PinSubCategory=\"double\"),DesiredPinDirection=EGPD_Output)\r\nEnd Object\r\nBegin Object Class=/Script/BlueprintGraph.K2Node_Tunnel Name=\"K2Node_Tunnel_2\"\r\n   bCanHaveInputs=True\r\n   NodePosX=799\r\n   NodeGuid=77C3EB09449A32CB37DE31B9F16A1FB5\r\n   CustomProperties Pin (PinId=F6E31BC84CCBC4D216FF2E84509C83C5,PinName=\"Up\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 0FBA77E94450094E726A5EB9E8A524A9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=AF7E530D4A1B1316E9AAA7A927A9DE50,PinName=\"Down\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 88789EAA4B8339346E21838D2C78EAAB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=775F79E34EB422430FA40AA732B9E273,PinName=\"Right\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 029FFFED4FCC512E34C9A48A22DAF54D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=46F4B0AF4A07E923C50CE7B503FA01F9,PinName=\"Left\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 60CB643B455BD680ED213DAD42991D02,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties UserDefinedPin (PinName=\"Up\",PinType=(PinCategory=\"exec\"),DesiredPinDirection=EGPD_Input)\r\n   CustomProperties UserDefinedPin (PinName=\"Down\",PinType=(PinCategory=\"exec\"),DesiredPinDirection=EGPD_Input)\r\n   CustomProperties UserDefinedPin (PinName=\"Right\",PinType=(PinCategory=\"exec\"),DesiredPinDirection=EGPD_Input)\r\n   CustomProperties UserDefinedPin (PinName=\"Left\",PinType=(PinCategory=\"exec\"),DesiredPinDirection=EGPD_Input)\r\nEnd Object\r\nBegin Object Class=/Script/BlueprintGraph.K2Node_SwitchInteger Name=\"K2Node_SwitchInteger_0\"\r\n   bHasDefaultPin=False\r\n   NodePosX=202\r\n   NodePosY=112\r\n   NodeGuid=BBC1BF7147DB082DFF3ACA9F53F3A0AA\r\n   CustomProperties Pin (PinId=DF04DDB14E8C4334D1CD36B1310824A6,PinName=\"execute\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_0 2DD0B5004D798448EAB01AAD607044F6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=7A7BD8F44872CE2300F160B55277BF14,PinName=\"Selection\",PinType.PinCategory=\"int\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue=\"0\",AutogeneratedDefaultValue=\"0\",LinkedTo=(K2Node_CallFunction_2 8E9129624E678943A201B282A69D1928,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=491F434345CDE8E0333D26A0040F305C,PinName=\"NotEqual_IntInt\",PinType.PinCategory=\"object\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=Class\'\"/Script/Engine.KismetMathLibrary\"\',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject=\"/Script/Engine.Default__KismetMathLibrary\",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=True,bDefaultValueIsReadOnly=True,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=6EFD834E4FC43B927D6DEBAB072E65B1,PinName=\"0\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 3B47E6EF4A69304711D9359407E47588,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=FBF66ECC49B465CC899EC08FC306D4F3,PinName=\"1\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=B32868E64630ECD3107AB5B201403FB4,PinName=\"2\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 38369A5A4296BC7E3F1D799ECAC6310A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=47479CD040B31818887880BAB06EAE46,PinName=\"3\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=159A306E47AC2F0593704DA523C57C22,PinName=\"4\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 D6F9D32E4E5C5DB91BBD088046840387,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=188E1A2845609DC1E1878D9CACDF3676,PinName=\"5\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=2E4FF5ED4909B48567B7F6B7B76D82A0,PinName=\"6\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 253FDB584E5CD589905B619F5C6F55D6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=518712034FCCB974DE762D93D8C11BEC,PinName=\"7\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=2227949D462C6F215B5EED86C80E12DC,PinName=\"8\",Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_DoOnceMultiInput_1 AC9759824DD5DD6D350D8F99CCEAC77C,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\nEnd Object\r\nBegin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name=\"K2Node_CallFunction_2\"\r\n   bIsPureFunc=True\r\n   FunctionReference=(MemberParent=Class\'\"/Script/Engine.KismetMathLibrary\"\',MemberName=\"Round\")\r\n   NodePosX=202\r\n   NodePosY=450\r\n   NodeGuid=B00B63494C6E6A256821AA9D229F5EAF\r\n   CustomProperties Pin (PinId=72D15923470ACE62B53823B40C759335,PinName=\"self\",PinFriendlyName=NSLOCTEXT(\"K2Node\", \"Target\", \"Target\"),PinToolTip=\"Target\\nKismet Math Library オブジェクト参照\",PinType.PinCategory=\"object\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=Class\'\"/Script/Engine.KismetMathLibrary\"\',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject=\"/Script/Engine.Default__KismetMathLibrary\",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=5CD6D3BE452CDFFF21A83DA3602DABE1,PinName=\"A\",PinToolTip=\"A\\n浮動小数点数 (倍精度)\",PinType.PinCategory=\"real\",PinType.PinSubCategory=\"double\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue=\"0.0\",AutogeneratedDefaultValue=\"0.0\",LinkedTo=(K2Node_PromotableOperator_0 024C932241D8E1B730973C98386CA2D4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=8E9129624E678943A201B282A69D1928,PinName=\"ReturnValue\",PinToolTip=\"Return Value\\nInteger\\n\\nAを最も近い整数に丸めます(例:-1.6は-2、1.6は2になります)\",Direction=\"EGPD_Output\",PinType.PinCategory=\"int\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue=\"0\",AutogeneratedDefaultValue=\"0\",LinkedTo=(K2Node_SwitchInteger_0 7A7BD8F44872CE2300F160B55277BF14,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\nEnd Object\r\nBegin Object Class=/Script/BlueprintGraph.K2Node_DoOnceMultiInput Name=\"K2Node_DoOnceMultiInput_1\"\r\n   NumAdditionalInputs=3\r\n   NodePosX=505\r\n   NodePosY=84\r\n   NodeGuid=7B5FBC73424485576BC2A4BA85FA1944\r\n   CustomProperties Pin (PinId=38369A5A4296BC7E3F1D799ECAC6310A,PinName=\"A In\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"344CD8654AF3F78F729EA9B94B32C6C7\", \"A\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiIn\", \"In\")),PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SwitchInteger_0 B32868E64630ECD3107AB5B201403FB4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=60CB643B455BD680ED213DAD42991D02,PinName=\"A Out\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"F13FDF8B40068F5C3BFEE09B84387524\", \"A\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiOut\", \"Out\")),Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_2 46F4B0AF4A07E923C50CE7B503FA01F9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=3B47E6EF4A69304711D9359407E47588,PinName=\"Reset In\",PinFriendlyName=NSLOCTEXT(\"K2Node\", \"DoOnceResetIn\", \"Reset In\"),PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SwitchInteger_0 6EFD834E4FC43B927D6DEBAB072E65B1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=180766C646D222CD0DCEE58BB7B6CCFF,PinName=\"Reset Out\",PinFriendlyName=NSLOCTEXT(\"K2Node\", \"DoOnceResetOut\", \"Reset Out\"),Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=D6F9D32E4E5C5DB91BBD088046840387,PinName=\"B In\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"4A43493B4C880155C1C49D9922D5E437\", \"B\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiIn\", \"In\")),PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SwitchInteger_0 159A306E47AC2F0593704DA523C57C22,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=88789EAA4B8339346E21838D2C78EAAB,PinName=\"B Out\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"47BBA00942DB7131583CE1B8F1A21BE6\", \"B\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiOut\", \"Out\")),Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_2 AF7E530D4A1B1316E9AAA7A927A9DE50,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=253FDB584E5CD589905B619F5C6F55D6,PinName=\"C In\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"E2D7F25A402F5424258B72832C963E57\", \"C\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiIn\", \"In\")),PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SwitchInteger_0 2E4FF5ED4909B48567B7F6B7B76D82A0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=029FFFED4FCC512E34C9A48A22DAF54D,PinName=\"C Out\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"A48AFBB04BA2BD4FFED5F18BE25BB627\", \"C\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiOut\", \"Out\")),Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_2 775F79E34EB422430FA40AA732B9E273,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=AC9759824DD5DD6D350D8F99CCEAC77C,PinName=\"D In\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"CCFA60AC44365DF640B2458B72FC45DF\", \"D\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiIn\", \"In\")),PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SwitchInteger_0 2227949D462C6F215B5EED86C80E12DC,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=0FBA77E94450094E726A5EB9E8A524A9,PinName=\"D Out\",PinFriendlyName=LOCGEN_FORMAT_NAMED(NSLOCTEXT(\"K2Node\", \"DoOnceMultiInputPinName\", \"{Identifier} {Direction}\"), \"Identifier\", NSLOCTEXT(\"\", \"EE51249140FDE58F422AFCA6695478C9\", \"D\"), \"Direction\", NSLOCTEXT(\"K2Node\", \"DoOnceMultiOut\", \"Out\")),Direction=\"EGPD_Output\",PinType.PinCategory=\"exec\",PinType.PinSubCategory=\"\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_2 F6E31BC84CCBC4D216FF2E84509C83C5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\nEnd Object\r\nBegin Object Class=/Script/BlueprintGraph.K2Node_PromotableOperator Name=\"K2Node_PromotableOperator_0\"\r\n   bIsPureFunc=True\r\n   FunctionReference=(MemberParent=Class\'\"/Script/Engine.KismetMathLibrary\"\',MemberName=\"Multiply_DoubleDouble\")\r\n   NodePosX=202\r\n   NodePosY=532\r\n   NodeGuid=A365305443A3ECE662ECA3A1B37942FC\r\n   CustomProperties Pin (PinId=7366A3F340215CB28DD96B8AA387713A,PinName=\"A\",PinToolTip=\"A\\n浮動小数点数 (倍精度)\",PinType.PinCategory=\"real\",PinType.PinSubCategory=\"double\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Tunnel_0 6103CBDA4F74F199895072B7DA5E07F9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=EA135C5A4707FF78016F29A499E60613,PinName=\"B\",PinToolTip=\"B\\n浮動小数点数 (倍精度)\",PinType.PinCategory=\"real\",PinType.PinSubCategory=\"double\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue=\"-7.000000\",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\n   CustomProperties Pin (PinId=024C932241D8E1B730973C98386CA2D4,PinName=\"ReturnValue\",PinToolTip=\"Return Value\\n浮動小数点数 (倍精度)\\n\\n乗算 (A * B)\",Direction=\"EGPD_Output\",PinType.PinCategory=\"real\",PinType.PinSubCategory=\"double\",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_2 5CD6D3BE452CDFFF21A83DA3602DABE1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)\r\nEnd Object\r\n")
```

# 問題点

上記で述べたように、十字キーの入力が特殊になってしまう。
また、DUALSHOCK 4 や DualSense を含む複数のコントローラーの接続には対応していない。
これらの問題は XInput のコントローラーを使用するか、WM Input Manager という有料プラグインを導入することで解決できる。

https://www.unrealengine.com/marketplace/ja/product/wm-input-manager