Open9

UE4/5_UINavigationメモ

資料

必読記事

https://okawari-hakumai.hatenablog.com/entry/2020/04/29/011906

マーケットプレイスのリンク

https://www.unrealengine.com/marketplace/ja/product/uinavigation
ディスコードのリンクとかが貼ってあるのでこちらも載せておきます。

開発者のyoutubeチャンネル

https://www.youtube.com/user/goncasmage/videos
チュートリアルとか置いてある。どういうことができるのかざっくりと知ることができる。

サンプルやドキュメントの場所

コンテンツブラウザの表示オプションで”プラグインコンテンツを表示”にチェック。すると、
/UINavigation コンテンツ/Docs にUINavDocsがあるので、ノードの使い方がそこに載っている。

学習コストを極端に下げたい! なら有料教材があるぞ!

https://www.unrealengine.com/marketplace/en-US/product/ui-navigation-simple-pack
UINavigationにはサンプルとして、すでに組みあがっているものがある。しかもめちゃくちゃ面倒なオプション機能部分が実装されている。
学習に少しだけ時間が必要なUINavigationだけど、学習コストを下げたい場合は、この有料教材はとても使えそうだ。
後日購入。
有料アセットを眺めると、自分がUINavigationを全然使いこなせていないことがわかる。
絶対に買うべきアセット。

中身の説明

UINavWidgetで用意されている変数。
例として、
Append Navigation Grid 1D でメニューボタンを追加
Append Navigation Grid 1D で戻るボタンを追加
とやると、Navigation Grid変数に要素が二つ格納されている。

このNavigation Grid 変数を使えば、動的にEdge Navigationの変更が可能になる。


Append Navigationの実行後でも、Set member in Grid をいじればEdge Navigationの変更が可能。
Append Navigationした要素がNavigation Grid に格納された何番目の要素なのかを意識する必要がある。

あのUINavButtonに飛びたいんだ!


Navigation Grid 変数の要素を分解すると、First Buttonなんて項目があったりする。

UINav Button 変数

UINavWidgetで用意されている変数。Append Navigation Grid 1D や Append Collectionなどにより追加された全てのUINav Buttonが格納されている。

AppendNavigationは不要?

以前は、ReadyForSetupイベントでAppendNavigation関数を呼んでいたが、Navigation Grid Auto-Appendingという機能がサポートされ、AppendNavigation関数を呼ばなくてもNavigationが機能するようになった。

ただし「UIN_」プレフィックスが必要


ただし、Navigation Grid Auto-Appendingを機能させるためには、UINavWidgetをラップしている Vertical/Horizontal/Uniform Grid などに 「UIN_」 プレフィックスを追加(名前の最初に)する必要がある。

別のGridに飛びたい場合

AppendNavigation関数を使わないのなら、Edge Navigationはどこから設定するかというと、
以下のように、SetEdgeNavigation 関数を使用してグリッドの EdgeNavigation を更新できる。

UINavのエラー

UINav Button の必須のウィジェット バインディング"NavButton"が見つかりません。

ウィジェット 内にUINavButtonを追加し、なおかつ名前をNavButtonとすればエラーが消えます。

UINavWidget(親)が、UINavCollection(子)を所持している場合

UINavWidget(親)からAppend Collectionノードを実行する際にはUINavCollection(子)内のUINavComponentやButtonの配置が終わっていなきゃいけない。
Event Constructは子Widgetの方が早く実行されるので、親から子にデータを渡し、動的にUINavButtonを追加する時など注意が必要。

確認ダイアログなど行いたい場合

UINavPromptWidget

UINavWidgetは、プレイヤーがアクションを決定する前に確認のプロンプトとして機能します(例:セーブファイルの上書き、変更したオプションの破棄など)。
UINavWidgetは、追加したUINavPromptWidgetが決定したとき(すなわち、オプションが選択されたとき)、"<UINavPromptWidgetBPName>_Decided "というカスタムイベントを作成して通知されるようになり、Integerパラメータに選択したオプションのインデックスを持たせることも可能になりました。このIndexは、選択するオプションが2つしかない場合、通常boolに変換することができます。

KeyBind関連

プレイヤーがInputBoxボタンを選択すると、そのボタンはテキストをPressKeyText変数(デフォルトは「Press a Key」)の値に変更し、プレイヤーが次に押すキーが既存のキーの代わりとして使用されます。

例外: プレーヤーが次のキーを押した場合、そのキーは既存のキーに置き換えられます。
- その列の制限に従わない場合(例えば、その列がMouseとKeyboardのキーに制限されている時にGamepadキーを押した場合)。
- KeyBlacklist配列に含まれている。
- 他のリバインド可能な入力がすでに使用されており、入力グループが衝突している。
の場合、ボタンは元のキーに戻り、プレイヤーはメニューのナビゲーションを続けることができます。

プラグインは既存の入力に新しいキーを追加することをサポートしています (これは複雑なセットアップを持つ入力に関しては限界があります)。InputBoxからのボタンが何らかの理由で入力のキーを見つけられなかった場合、EmptyKeyText変数で指定されたテキストが表示されます(デフォルトは「Unbound」)。

キーバインドをデフォルト状態にリセット

ノード:Reset Key Mapping
このプラグインは、キーバインドをデフォルトの状態にリセットすることもサポートしています。これをサポートするには、Project Settings -> Plugins -> UI Navigation で、すべてのリバインド可能な Input Contexts をそれぞれのデフォルト状態にマッピングする必要があります(単に、希望のデフォルトマッピングを持つ Input Context を複製するだけです)。

注意

プラグインは、再バインドを許可する各アクションのキーの数がInputRestrictionsの数を超えないことを前提としています(例えば、InputRestrictionsを2つ選んだ場合、デフォルトでは再バインドできるアクションのいずれかに関連する3つの異なるキーを持ってはいけません。) 。これは、プレイヤーがアクションを別のアクションで使用されている可能性のあるキーにリバインドする可能性があり、そのキーが入力コンテナで表示されていないことが原因です。
このプラグインは、マルチキー(Shift + Cなど)への入力のリバインドをサポートしていません。

VR入力はゲームパッドの入力として扱われることに注意してください。

ナビゲーションを追加する UINavInputContainerをButton Navigationsグラフに正しく追加するには、Append Navigation Grid 2D 関数を使用し、KeysPerInputをDimension X、NumberOfActionsをDimension Yとして指定します。

UINavInputContainer

UMGメニューにこれらのいずれかを追加して、入力リバインドの機能を追加します。PanelWidget要素(Verticalパネル、Horizontalパネルなど)を持っている必要があります。
パネル内部には、UINavInputBoxes が追加されます。既存のInputBoxウィジェットブルーペイントはお好みで編集でき、その中のUINavInputComponentsも編集可能です。UINavInputComponentは、UINavComponentにImage要素を追加したものです。

UINav Input Container -> Input Restrictions

各入力カラムで、どの入力形式を受け付けるかを表します。この配列のサイズは、各アクションがいくつの異なるリバインド可能なキーを持てるかを表します。size が 0 の場合は、"None" という制限が追加されます。size が 3 より大きい場合は、配列の残りの部分は削除されます。

UINav Input Container -> Key Whitelist / Key Blacklist

プレーヤーに使用させたいキー、またはプレーヤーにリバインドのために使用させたくないキー(例:Esc、Windowsキーなど)のみを追加してください。BlacklistはWhitelistが空の場合のみ使用されます。

UINav Input Container -> Tatget Column

この入力コンテナにナビゲートする際に、どのカラムに移動するかを示す。

UINav PCComponent -> Gamepad Key Icon Data / Gamepad Key Name Data / Keyboard Mouse Key Icon Data / Keyboard Mouse Key Name Data

オプション。キーの希望するアイコンまたは名前を含むデータテーブルを追加します。アイコン・データテーブルでキーが見つからない場合、プラグインはネーム・データ・テーブルでキーを探します。Nameデータ・テーブルでキーが見つからない場合、キーのデフォルトのFNameを使用します。

キーバインド (Enhanced Input 版)

UINav Input Container -> Enhanced Inputs

リバインドできるようにしたい入力コンテキストを追加し、それぞれについて、リバインドできるようにしたいその入力コンテキストのすべてのアクションを追加します。
それぞれのアクションデータには、入力アクションへの参照と、その軸、正か負かの情報を含める必要があります。デジタル(バイナリ)入力の場合、最後の2つの値はデフォルトのままにしておきます。ただし、移動や回転に使う軸の場合は、その線がX軸、Y軸、Z軸のいずれであるか、また正または負の線であるかを指定する必要があります。(UINavOptionsMenuWKeybindsを見て、これがどのように設定されたかを見てください)。

その上、それぞれのInput ContextはInput Groupsを示さなければなりません。Input Groupsは整数の配列で、どのInput Contextsが同じキーを使えるか使えないかを示します(同じコンテキストで使われているからです)。もしプレイヤーが同じグループ内の他の入力が使っているキーに入力をリバインドしようとすると、そのキーは受け入れられません。しかし、衝突している入力が別のグループに属している場合は、そのキーは受け入れられます。-1の値は、Input Contextが「グローバル」であり、入力グループに関係なく、他の入力がそれに関連するキーを使ってはいけないことを示します。

キーバインドのリセット

Default Input Contexts

The Key is the Input Context and the Value is essentially a duplicate of that Input Context with its default values
Because when you rebind the keys, they will be applied on your Input Context in the Key, and the Value one will remain untouched, and its values will be fetched and applied to the Input Context in the Key when you reset the inputs to their default state

KeyとValueに指定するInput Mapping Contextは同一構成でなければなりません。
Keyで指定したInput Mapping Contextを複製し、そのファイルをValueに設定すれば大丈夫です。
Keyは書き換えられても大丈夫なInput Mapping Contextを指定し、Valueはデフォルト設定用のInput Mapping Contextを指定します。

設定方法

  1. ProjectSettings --> User Interface (inside "Engine" category) --> and set Render Focus Rule to "Never".

  2. A or B
    A. Legacy Input
    このプラグインのContentフォルダにあるUINavInput.iniを開き、そのファイル内のすべてのActionMappingsを、プロジェクトのConfigフォルダにあるDefaultInput.iniファイルにコピーします。プロジェクトにこのiniファイルがない場合は、入力アクションを追加するだけで、そのファイルが生成されます。この後、エディタを再起動すると、変更が反映されます。(念のため、以前のDefaultInput.iniファイルをバックアップしておいてください!)
    B. Enhanced Input
    Project Settings -> Plugins -> UI Navigationに移動し、Enhanced Input ContextプロパティをIC_UINavに、Enhanced Input ActionsをUINavEnhancedInputsActionsに設定します。これらは、UIナビゲーションに使用するInput Contextと、個々のUINav Input Actionのリファレンスを指定します。

  3. 3.1 or 3.2
    3.1.1 - GameModeをUINavGameModeに変更する(プラグインコンテンツフォルダに含まれています)。
    3.1.2 - ゲームをプレイする
    or
    3.2.1 - 新規にプレイヤーコントローラーを作成するか、既存のものを使用する。
    3.2.2 - どちらか。
    a - その親をPlayerControllerからUINavControllerに変更する。
    b - 既存のプレイヤーコントローラにUINavPCComponentを追加し、UINavPCReceiverインターフェイスを追加する。
    3.2.3 - この新しいUINavControllerがGameModeによって使用されていることを確認する。
    3.2.4 - 新しいUserWidgetを作成し、その親をUINavWidgetに変更します。
    3.2.5 - このブループリントに示されるようにウィジェットをセットアップします。
    3.2.6 - PlayerControllerを使用して、UINavPCブループリントのようにUINavWidgetをビューポートに追加します。

TheSelector

選択されているNavButtonの応じて位置を変えてくれる。
「TheSelector」という名前にしなければならない。


4つのナビゲーションモード(このウィジェットのクラスデフォルトをご覧ください)。

ボタンの状態。このモードでは、UINavButtonsのスタイルが変更されます(NormalとHoveredの間)。

セレクタ。このモードでは、セレクタ(ユーザが作成するUserWidget)を使用して、現在選択されているボタンの位置まで移動します。
               を使用します。セレクタは、ウィジェットの階層になければならず、"TheSelector "と呼ばれなければなりません。
               はCollapsedであってはなりません。
               (その他のオプションは、クラスデフォルトのUINavigationSelectorセクションを参照してください。)

Text Color: このモードは、各ボタンの直接の子であるText要素の色を変更します。
                  (その他のオプションは、クラスデフォルトのUINavigationTextセクションを参照してください。)

アニメーション このモードでは、UINavAnimations配列にあるWidgetAnimationsを使用してボタン間を移動します。

また、Class DefaultsのUseLeftThumbstickAsMouseをtrueに設定すると、ゲームパッドを使ってマウスを動かすことができます。

これらの任意の組み合わせを使用するか、NavigateToイベント(右の説明)を使用して独自のイベントを作成することができます。

Should Force Navigation プロパティを false に設定すると、マウスを使用しているときに、視覚的なナビゲーションキュー(ボタンのスタイル、テキストの色など)がウィジェットで強制されなくなります。キーボードやゲームパッドでキーを押すと、マウス使用に戻るまで、現在のボタンの状態が再び強制されます。

ナビゲーション入力(入力を参照または修正するために、プロジェクト設定 -> 入力に移動します)。

MenuUp, MenuDown, MenuLeft, MenuRight - メニューを各方向にナビゲートする。
MenuSelect - 現在ナビゲートされているオプションを選択します。
MenuReturn - 前のウィジェット/メニューに戻ります。

UINavButtonの可視性をCollapsedまたはHiddenに変更するか、そのボタンを無効にすると、プラグインはナビゲーション中にそのボタンをスキップし、ナビゲートする有効なボタンが見つかるまで同じ方向にナビゲートしつづけます。TheSelectorのvisibilityをこれらのいずれかに変更すると、ナビゲーション中に無視されます。

このプラグインに付属するサンプルを見て、その機能を完全に理解するようにしてください!

重要:ナビゲーションを行うには、デフォルトの要素(ボタン、スライダーなど)の代わりに、UINav要素(UINavButtons / UINavOptionBoxes / UINavComponents)を使用します。

注意事項 構築時に、ウィジェットはウィジェット階層のすべての要素を上から下へ調べ、すべてのUINav要素を探します。最初のものは属性インデックス0、2番目は属性インデックス1、...となります。
これを上書きしたい場合は、DesignerタブでUINavButtonのButtonIndexを編集します(これを行う場合は、ウィジェット内のすべてのボタンに対して行い、0から<このウィジェット内のUINavButtonsの数> - 1までで一意になるようにします)。

UINavWidgetで何かが正しく設定されていない場合、通常Debug Messageが画面に表示され、何が欠けているかが通知されます。

UINavWidgetが画面に追加されたときにエディタがクラッシュし、その原因がわからない場合、これらが正しいかどうか検証してください。

  • 正しいイベントで正しい関数を呼び出しているか(Youtubeのチュートリアルをご覧ください)。

  • すべてのUINav要素には、関連するグリッドがあります。

  • AppendNavigationGrid関数に与えられるDimensionは、-1か0より大きく、希望するUINav要素の数に一致します。

  • UINavOptionBoxのデフォルトのオプションのインデックスは有効でなければなりません(つまり、Name配列の長さ、またはMaxRange - MinRangeより小さく、少なくとも0でなければなりません)。

  • UseTextColorがtrueの場合、すべてのUINavButtonsはその直接の子としてテキストを持たなければならず、UINavComponentsのNavText要素はnullであってはいけません。

  • もし、解決できない場合は、Visual Studioからプロジェクトを実行し、エディタがクラッシュしたときにデバッグしてみてください。

Enhanced Inputに移行する。

Project Settings -> Plugins -> UI Navigationに移動し、Enhanced Input ContextプロパティをIC_UINavに、Enhanced Input ActionsをUINavEnhancedInputsActionsに設定します。これにより、UI Navigationに使用するInput Contextと、個々のUINav Input Actionの参照が指定されます。

Input Rebindingを設定したい場合は、このウィジェットの右側にあるEnhanced Input Rebindingのセクションを確認してください。

MenuReturnさせたくない場合

デフォルトでは、EscキーやBボタンを押すとウィジェットが閉じるようになっているかと思います。
便利なデフォルト機能ですが、スタート画面とか特定の画面では発動してほしくない機能です。

Set Allow Return Input を使う


これでスタート画面でEscキーを押しても、ウィジェットが閉じなくなりました。

ログインするとコメントできます