UE5でパスワードシステムを作った備忘録

目的

UnrealEngine5で、プレイヤーにパスワードを入力させて、入力内容の正誤判定を行うシステムを作りたかった。

こういうやつ。

前提

以前作成した会話システムを一部流用している。
具体的には、会話できるかどうかのマーク表示(下画像参照)と、会話開始に使うキー入力イベントがそれにあたる。

このアクタの実装方法は、
UE5で会話システムを作った備忘録HD2D風-その3(リンク)
の前半部分に示した。上記リンクのBPI_InteractableNPC_BaseIA_Interactプレイヤーブループリントの設定は必須。


素材集め

好みのウィンドウ素材があればそれを使ってもいいかも。
今回は
空想曲線 さん
からメッセージウィンドウ素材を使用した。

また、プレイヤーはいつも通りの
やさぐれひよこ置き場 さん
からダウンロードしたひよこレディさんを使用した。


下準備

パスワードを表示させるアクタを作成しておく。前提で流用していると示した部分のひとつがこれ。
作成済みのNPC_Baseの子ブループリントを作成する。

今回はNPC_passwordと名付ける。
親ブループリントであるNPC_Baseには、プレイヤーと合わせるためにpaperZDを用いたspriteが設定されていたが(下画像)、

会話NPCとは明確に異なるオブジェクトであることを視覚的に示すため、3Dのキューブオブジェクトを追加した。

補足

スプライトオブジェクトは画像を設定せず、念のため残しておいた。もしかしたら消してもいいのかもしれない。

 


こんな感じになった。


パスワード入力用ウィジェットの作成

コンテンツドロワー上で右クリックして、ウィジェットブループリントを新規作成する。

ここでは名前をtestWidgetとする。
これを開いてデザイナータブを開き、構成要素を配置する。
必須である構成要素は

  • Text Box
  • Button

の二つ。
今回はCanvasパネル等を使って次のように配置した。

TextBoxの名前はPasswordboxと、ボタンの名前はBtn_Enterと変更してある。

Passwordboxについて設定する。
まずIs Valiableに必ずチェックを入れる

詳細タブ、アピアランスから背景画像、マウスホバー時画像、クリックして入力を開始したときの画像をそれぞれ設定できる。
今回はすべて同じ画像を入れた。

また、よく入力場所で見る「何らかしらの例文が元から入っているけど、マウスクリックして何か入力しようとすると消える文章」も設定できる。
これはコンテンツのHint Textから設定できる。
今回はPasswordと入力した。

ボタンについて設定する。
まずIs Valiableに必ずチェックを入れる

ボタンウィジェットは色等以外これといって編集はしない。
こだわろうと思えばいくらでもこだわれるところなので、お好みで。
ボタンの子オブジェクトとしてテキストを配置した。
これはユーザの入力確定意思を明らかにするためのものなので、分かりやすく「>>Enter」とでもしておく。


入力確定ボタンを押した際の挙動の設定

入力確定ボタンを押した際の動きについて設定する。
グラフモードに切り替え、変数からBtn_Enterを選択し、詳細タブのイベントからOn Releasedを選んでグラフに追加する。

続いて、変数からPasswordboxをGetで呼び出す。ここからリンクを伸ばして、GetText(Text Box)を接続する。
Return Valueからリンクを伸ばし、Equal, Case Insensitive(Text)を接続する。==とマークが記載されたノードであればOK。
この左下ピンからリンクを伸ばし、テキストをフォーマットノードを接続する。
ここのフォーマット欄に正解となるパスワードを好きに入力する。

最初に配置したOn Releasedノードからリンクを伸ばして、ブランチノードを配置する。
Conditionピンと==ノードの右側ピンとを接続する。


ここまででこうなっていればヨシ。

ブランチのTrueピンの先を作成する。
今回はパスワードが正解だった場合に、レベル(マップ)を移動する仕組みを作る。
Trueピンの先にOpen Level(by Name)を接続する。Level Nameには移動先レベルの名前を入力する。特に指定ながければ移動先レベルに設定されているPlayerStartの位置に移動する。

ここからリンクを伸ばして、Remove from Parentを接続する。これでパスワード入力ウィジェットを画面から消去する。
続いて右クリックでGet Player Controllerを呼び出す。ここからリンクを伸ばし、Set Input Mode Game Onlyを接続する。これとRemove from Parentも接続する。

Falseピンの先は特に何も起こさないので、RemoveFromParentノードとSet Input Mode Game Onlyの組み合わせを付ける。


こんな感じになっていればヨシ。
一部ノードは個人的に追加したもの。以下補足参照。

補足

プレイヤーのブループリントにおいて、話しかけるキーを押した場合選択肢の選択のためにマウスカーソルを表示する制御を行った。
マウスカーソルを再び消したい場合は「GetPlayerController」と「Set Show Mouse Cursor」の組み合わせを追加して、チェックを外してもいいと思う。
自分はおまじないがてらもう一度Show Mouse Cursorにチェックを入れた。


ウィジェット表示ブループリントの作成

NPC_Passwordのイベントグラフを開く。
グラフ上を右クリックして、イベントInteractを呼び出す。

ここからリンクを伸ばして、Set Interact Instigatorを接続する。

POINT

この二つのノードがうまく出なかった場合は、
会話システム構築の過程で作成した、BPI_Interactable(ブループリントインタフェース)がうまく設定できていない可能性が高い。要確認。

セットノードからリンクを伸ばして、Create Widgetノードを接続する。Classに作成したパスワード入力ウィジェットを選ぶ。ここではTest Widgetである。
ここからさらにリンクを伸ばして、Add to Viewportノードを接続する。
ターゲットにはウィジェット作成ノードのReturnValueを接続する。


こうなっていればヨシ。


テスト

NPC_passwordをレベル上に配置してテストプレイする。

正解/不正解したらそれらに対応した音を鳴らしたり、フェードインフェードアウトを導入したり、追加でできることは多そう。


まとめ

以上。お疲れさまでした。