上記のようにUnrealEngineのUI上でゲームコントローラーの右と左のスティックでポインタを操作してタッチ処理を行わせることができました。
2つのタッチを扱ってピンチインやピンチアウトの操作もできます。
試した環境
- UE5.3.1
- Windows11
参照サイト
-
InjectTouchInput 関数 (winuser.h) - Win32 apps | Microsoft Learn
タッチを実現するInjectTouchInputの公式説明
特にタッチ インジェクション シーケンスの図が参考にしました -
C# + InjectTouchInput でタッチをシミュレートする - Qiita
ハマりどころを参照 -
Unity で Windows のマルチタッチ操作をエミュレートできる uTouchInjection を作った - 凹みTips
C++コードを参照
作成してみたコード
以下のWindowsのウィンドウをキャプチャするWindowCapture2Dプラグインにタッチ機能を追加してみました。
サンプルプロジェクトにおいてゲームコントローラーでキャプチャしたスクリーンのタッチが行えるようにしています(キーボードでも操作できるようにしてますが、タッチをするとフォーカスが外れてうまくいかない感じです)。
以下がタッチ機能のコア部分の機能です。
ウィンドウキャプチャの機能とはあまり依存関係がないので単独でも使用できるかと思います。
https://github.com/mechamogera/WindowCapture2D/blob/master/Plugins/WindowCapture2D/Source/WindowCapture2D/Public/Touch.h
https://github.com/mechamogera/WindowCapture2D/blob/master/Plugins/WindowCapture2D/Source/WindowCapture2D/Private/Touch.cpp
https://github.com/mechamogera/WindowCapture2D/blob/master/Plugins/WindowCapture2D/Source/WindowCapture2D/Public/TouchManager.h
https://github.com/mechamogera/WindowCapture2D/blob/master/Plugins/WindowCapture2D/Source/WindowCapture2D/Private/TouchManager.cpp
InjectTouchInput関数をUnrealEngineで利用する
WinUser.hではInjectTouchInputと関係する構造体は以下の#ifの中にあります。
#if(WINVER ?= 0x0602)
UnrealEngineのデフォルトではWINVERは0x0601なのでそのままではInjectTouchInputが使えません。
How to define _WIN32_WINNT and WINVER? - Programming & Scripting / C++ - Epic Developer Community Forums
このため、上記のページを参照してプロジェクトのbuild.csに以下を追加して対応しました。
PublicDefinitions.Remove("WINVER=0x0601");
PublicDefinitions.Remove("_WIN32_WINNT=0x0601");
PublicDefinitions.Add("WINVER=0x0602");
PublicDefinitions.Add("_WIN32_WINNT=0x0602");
WindowCapture2Dプラグインでは以下の個所にあたります。
https://github.com/mechamogera/WindowCapture2D/blob/master/Plugins/WindowCapture2D/Source/WindowCapture2D/WindowCapture2D.Build.cs#L65-L68
以前はdllを用意して対応しましたがこの方が楽ではありますね(UE4で新しいWin APIを使う - Qiita参照)。
ただ、ビルド時に定義の重複で警告は出てしまいます。