仮想キーボードの作り方(UE4.13~)
World内にキーボードとディスプレイを設置して文字を入力する方法をメモ。
VRでも利用可能みたいです。
①キャラクターの設定
自分の操作するキャラクター(ここではFirstPersonCharacter)にWidgetInteractionを追加します。そこからデバッグラインが出るので違和感ない場所に移動して「詳細→Debugging→Show Debug」をオンにします。
以下の画像ではSphereの下に追加していますが、FP_Gunの下でもいいようです。
②入力の設定
FirstPersonCharacterのイベントグラフに仮想キーボードのボタンを押下する動作を割り当てたい入力イベントを出します。そして、①で追加したWidget Interactionをドラックしグラフに持っていき、そこから Press Pointer KeyとRelease Pointer Keyを追加します。Keyは両方ともLeft Mouse Buttonにします。(ここでは右クリックが左クリックとみなされ、仮想キーボードのボタンを押下したことになります。)
③ブループリントの準備
Actorとwidgetブループリントを2つずつ作成します。(KeyPadはキーボード、Displayは入力した文字、値が表示されるディスプレイです。)
④Display_WB 1
Display用のWidgetブループリント(Display_WB)を開き、Canvas PanelをText Boxに置き換え、「右クリック→Wrap with...→Size Box」をクリックします。
⑤Display_WB 2
Size BoxをDesired on Screenにし、Width overrideとHeight overrideを好きな値に設定します。
⑥Display_WB 3
Hint Textにはここに入力してほしいことを書きます。よくログイン画面に見る「パスワード」などの薄く表示される文字です。ここはなくてもかまいませんが、ないとここに何を表示させたいのか分からなくなります。
⑦KeyPad_WB 1
KeyPad用のWidgetブループリント(KeyPad_WB)を開き、Buttonにtextを親子づけして追加して、「Detail→Content→text」には送りたい文字を書きます。他にBackSpace用とEnter用のボタンも用意します。その後、全てのボタンで 「Detail→Interaction→Is Focusable」のチェックを外します。
⑧KeyPad_WB 2
KeyPad_WBのグラフに行き、全てのボタンの「OnClicked」イベントを出します。
⑨KeyPad_WB 3
String型とWidgetInteractionComponent型の2つの変数を追加します。(String型をChar To Send、WidgetInteractionComponent型をWidgetInteractionと名づけました。)
⑩KeyPad_WB 4
BackSpaceとEnter以外の「OnClicked」イベントにChar To Sendをセットしつなげ、送りたい文字をセットします。アルファベットはもちろん、数字やひらがな、カタカナ、漢字も大丈夫みたいです。
⑪KeyPad_WB 5
Send Key Charを出し、ターゲットにはWidgetInteraction、CharctersにはChar To Sendを繋げます。
⑫KeyPad_WB 6
BackSpaceの「OnClicked」イベントにPress and Release Keyをつなげ、ターゲットにWidgetInteractionを繋げ、KeyをBackSpaceにします。
⑬KeyPad_WB 7
イベントディスパーチャー(ここではEnterPressedと名付けました)を追加し、呼び出します。グラフ上までドラックしてドロップするとアクションを選べるので「呼び出す」を選択するか、右クリックで検索して出してください。
⑭Display_Actor 1
Display_Actor(Display用のアクター)を開き、Add componentからWidgetを出します。Widget Class にDisplay_WBを選択し、Draw at Desired Sizeにチェックを入れます。
モザイクをかけてますが気にしないでください。(新しく用意するのめんどくさかった)
⑮KeyPad_Actor 1
同じようにKeyPad_Actor(KeyPad用のアクター)を開き、Widget ClassにKeyPad_WBを選択します。そして、Window Focusableのチェックを外し、Draw at Desired sizeのチェックを入れます。
⑯KayPad_Actor 2
さらにAdd componentからWidget Interactionを追加し、Enable Hit Testingをオフにします。
⑰KeyPad_Actor 3
KeyPad_ActorのBegin PlayイベントにCast To KeyPad_WBを繋げ、WidgetとGet User Widget ObjectをObjectピンに繋げます。
⑱KeyPad_Actor 4
KeyPad_WBのWidgetInteractionをセットし、KeyPad_ActorのWidget Interactionを繋げます。その後、ノード検索で、EnterPressedを割り当てるを、選択するとBind Event to EnterPressedとカスタムイベントが出て来ます。
ひとつずつ、Bind Event to EnterPressedとカスタムイベントを出してもダメ。
カスタムイベントの先にはEnterを押した時にやって欲しい処理を、書きます。
⑲KeyPad_Actor 5
KeyPad_ActorにDisplay_Actor型の変数を追加します。
⑳KeyPad_Actor 6
world内にKeypadとDisplayを設置し、KeypadのTargetDisplayのところをDisplayにします。
以上です。