環境
UE 4.10.0
Visual Studio 2015
概要
Unreal Engine 4 を触ってみて動作を確認する
入力周り考察(1)の続き
http://qiita.com/maprog/items/56c8e6d91b81c74e8f07
本文
入力管理クラスの確認
アプリケーションで管理している(はず)の入力を管理している場所を探していた所
FSlateApplication クラスを見つけた。このクラスは、各種プラットフォーム毎
に実装しなければならないアプリケーションのフレームワークを抽象化したクラス
のようだ。
メンバ関数を確認してみると PollGameDeviceState という関数がある。察するに
これが各種入力デバイスを、各種プラットフォームの API から取得する関数だと
思われる。という事は、このクラスが各種プラットフォームの入力データを管理して
いる可能性は高い。幸いにしてこのクラスはシングルトンなのでアプリケーション側
からアクセスは簡単にできる。
FSlateApplication にアクセスしてみる
とりあえず、インスタンスにアクセスして、コンパイルしてみる
[コード]
※ SlateApplication.h をインクルードする事
const FSlateApplication& rApp = FSlateApplication::Get();
すると、リンクエラーが発生する。
Visual Studio 2015 Express だからか、リンクエラーのメッセージが文字化け
していてはっきりしないが、リンクエラーなのでモジュールが見えていないのだろう。
いつものようにライブラリを追加するのか?と思ったが UE4 のビルドシステムは通常
のアプリケーションと違う為、確認が必要だと思い再び調査を開始
UE4 のビルドシステム
UE4 のビルドシステムは、どうなっているのだろうか?
コードのホットリロードに対応している事から、エディタで作成したコードはモジュール
化されている事は明白だ。windows の場合は dll として出力されている。
dll 出力の際に、いくつかのビルドシステムが連携している。
とりあえず Build.cs を確認してみると、以下のコードがあった。
[コード]
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
上記コードでは、モジュール作成の際に依存関係を持つモジュールをリンクするものだと
推察される。FSlateApplication にアクセスする場合、ここにモジュールを追加すれば
参照できるに違いない。コードを以下のように修正して、プロジェクトをリビルドしてみた。
[コード]
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Slate" });
PrivateDependencyModuleNames.AddRange(new string[] { });
無事、リンクエラーを回避できた。
マウスカーソルの値を取得する
ようやく本題に戻る。
FSlateApplication クラスからマウスカーソルの座標をログとして表示する関数を作成して
みた。アウトプットログにマウスのスクリーン座標が表示されるはず。
[コード]
void Func()
{
const FSlateApplication& rApp = FSlateApplication::Get();
FVector2D pos = rApp.GetCursorPos();
UE_LOG(LogTemp, Warning, TEXT("cursor pos : %f %f"), pos.X, pos.Y);
}
まとめ
FSlateApplication クラスはアプリケーションを抽象化したクラス。
アクセスするには Build.cs に "Slate" モジュールを追加する必要がある。
シングルトンなので、アクセスできれば後は必要な関数を呼び出すだけで良いようだ。