【UE4】MRTK-Unrealを触ってみた

この記事はHoloLens Advent Calendar 2020の15日目の記事となります。

qiita.com

 

内容は自作アプリを作りながら、先月行われたUnrealFestにて紹介されていたMRTK-Unrealについてまとめておこうと思います。

 

www.youtube.com

触ってない機能については後日加筆修正を加えていく予定です。

 

機能の一覧に関しては下記の公式ドキュメントをご覧ください。

github.com

 

今回の環境はUE4.25+MRTK for Unreal 0.10.0になります。

 

MRTKforUnrealの導入方法ですが、EpicGamesLauncherのマーケットプレイスから、Mixed Reality UX Toolsを探して、エンジンにインストールするだけです。

f:id:shiratori00:20201214192302p:plain

 

一応Hololens2の開発導入やコアモジュールの解説を過去に記事にしているので、そちらもご覧ください。

shiratori1221.hatenablog.com

 

マニピュレータに関しては上記の記事で説明しているので省略します。

 

ハンドメニュー

一番汎用的で使いやすいメニューだと思います。

まず、親クラスを作成します。名前はBP_HandMenuActorとします。

コンポーネントにUxtPalmUpConstraintを追加します。これは、手の平などを検知し、追従する機能をアクターに追加するコンポーネントです。

f:id:shiratori00:20201214195150p:plain

プロパティに関して軽く羅列すると、

MaxPalmAngle : 手のひらとして認識する円錐の最大角度

RequireFlatHand : 手の平坦度条件を使用する?

Hand:どちらの手(もしくは両手)を認識した際に追従するか

Zone:追従する場所。手を中心として上下左右どこか

OffsetMode:位置の補正。手の平の回転を優先するのか、カメラの向きを優先するのか

RotationMode:向きの補正。何もしないか、手のひらの回転に追従するか、カメラへ常に向き続けるか。基本的にLook at Camera

GoalMargin:Zoneの位置からのマージン

MoveOwingActor:手にくっついて自身のアクターの位置を動かすか。基本的にTrue

LocationLerpTime:追従する際のアニメーションの位置補正にかかるディレイ時間。大きくすればするほど追従する動きが鈍く遅くなる

RotationLerpTime:追従する際のアニメーションの回転補正にかかるディレイ時間。大きくすればするほど追従する動きが鈍く遅くなる

 

使えるイベントは以下の通りです。ただ、基本的にはOnConstraintActivatedとOnConstraintDeactivatedの二つだけでいいと思います。

OnConstraintActivated : 手のひらを認識したとき

OnConstraintDeactivated : 手のひらをロストしたとき

OnBeginTracking : 手のひらのトラッキングを開始したとき。何が違うのかはよくわかりませんでした。

OnEndTracking : 手のひらのトラッキングが終了したとき。何が違うのかはよくわかりませんでした。

残りの二つはUE4コンポーネントの標準的なイベントなので割愛します。

 

実際ハンドメニューで押すことのできるボタンに関しては、UxtUIElementとUxtPressableButtonActorで実装します。

UxtUIElementは子要素のUIのVisbleの管理を行います。

UxtPressableButtonActorはMRTKが用意しているUI要素の一つで、標準的なボタンの実装がされているクラスになります。

f:id:shiratori00:20201215052132p:plain

使用する際にはUxtUIElementのchildActorで設定をします。

設定できる要素を軽くまとめます。

Millimeter Size : ボタンの大きさの設定

IsPlated : 背景的な青い部分を表示するかどうか

Icon Brush : アイコンの設定。あらかじめ用意されたアイコンに加えて独自のアイコンを追加することも可能

Label : アイコンの下に表示する文字列。標準で設定されているフォントだと、日本語は使用不可

LabelTextBrush : Labelの設定。文字色やサイズ、使用するフォントなどはここから変更をする。

ButtonBrush : ボタンの見た目に関しての設定。スタティックメッシュやマテリアルの設定。押したときのアニメーションや音に関しての設定がまとめられています。

 

これ以下の部分はあんまり触らないので割愛。

 

次はボタンへのイベントのバインドについて説明します。

それぞれのボタンのイベントに関してですが、今回の実装の仕方であると、childActorからUxtPressableButtonComponentを取得し、ButtonPressedイベントにバインドします。

f:id:shiratori00:20201215060639p:plain

もう一つの方法としては、MRTKのボタンクラスを継承したブループリントクラスを作成し、それぞれのクラス内でイベント処理を実装して、それをChildActorとする方法です。

ボタンの種類に関しては通常の押下ボタン・トグル・チェックボックスラジオボタン・スイッチが用意されています。

f:id:shiratori00:20201215061004p:plain

UxtPressableButtonActorの場合は以下の通りになります。

f:id:shiratori00:20201215061135p:plain

コンポーネントに関しては特に先ほどの説明と変わりがないので割愛します。

イベント実装に関しては、ルートコンポーネントであるButtonComponentにイベントがあるのでそれぞれ必要なイベントを実装してください。

基本的にはPressedかReleasedあたりのみの利用になると思います。

 

次は手のひらを認識/ロストしたときにUI要素の表示/非表示を切り替える処理を実装します。

f:id:shiratori00:20201215061621p:plain

ここではロスト時に非表示にしていますが、複雑なハンドメニューの場合は、非表示にせずにするとよいと思います。

あとはレベル上にハンドメニューのActorを配置orプレイ開始時などにSpawnActorなどをすればハンドメニューが機能します。

 

UMGの利用

UE4のUI機能であるUMGを利用することも可能です。利用方法は3DWidgetの実装にUxtWidgetコンポーネントを追加するだけです。

f:id:shiratori00:20201215062359p:plain

基本的に2DのUIを触るので、タッチやファービームで動作します。スライダーなどは少し操作に手間取る部分がありました。

また、汎用マニピュレータのアクターなどとの干渉もあったりで使う際には注意が必要です。

使う利点としては、UMGアニメーションが利用できるところなどでしょうか。

基本的にはUI要素はMRTK側で大体用意されているので、UMGを積極的に利用する必要性は薄い気はします。

 

 

明日は@t-shoさんの記事となります。