UIの操作について

RPGってUIを開いて操作することが多いですよね。
バトルではコマンドを選択し、場合によってはアイテムやスキルを選択したり。
フィールドではキャンプを開いてステータスやアイテム、武器のアレコレ。
キャンプのトップメニュー

これらの操作をウィジェット毎に組み込めれば楽で、実際OnKey系の関数を使えばいけるんですがこれってキー決め打ちなので、プロジェクト設定のインプットのActionMappingsなどで設定したキーは受けることができないんですよね。

ということでインターフェース!

以前から何度もインターフェースについて調べてみたものの意味がわからなかったのですが、とあるサイトに、インターフェースは投げっぱなしジャーマンだと。
なるほど!そういうことなのか!

簡単にその方法を書いてみます。

まず、ブループリントインターフェース(ここではTestIFという名前を付けました)を作って、マイブループリントに関数を追加します。
右上。ここではTestA、TestB、TestCを追加


適当にウィジェットを作っておいて、
(ここでは適当にテキストボックスを追加)
ドカンと真ん中にテキストボックスを配置

次にキーインプットに対して関数を呼び出します。
ここではTPSテンプレートを使ったので、ThirdPersonCharacterのBPのイベントグラフに記述します。
まずWidgetの変数を追加(ここでは変数名をWidgetにしました)、適当なタイミング(ここではBegin Play)でウィジェットを作ってWidget変数にセット。
アクションマッピングで定義しておいたTestA、TestB、TestC(ここではキーボードの1,2,3にしました、もちろんActionMappingsで設定した入力でもOK)がインプットされたとき、Widgetの変数からそれぞれTestA、TestB、TestCの関数(ターゲットはTestIF)を呼び出す処理を作成。
インプットに対してそれぞれ関数を呼び出し

先ほど作ったウィジェットのイベントグラフで
クラスの設定ボタンを押して、インターフェースのところの実装インターフェースにTestIFを追加(ココ重要)、
イベントグラフ内にイベントを追加(右クリックのメニューの中にちゃんとTestA、TestB、TestCがあります。)
イベントを追加

ここではあえてTestAとTestBのイベントしか追加していません。
キー3(TestC)を押しても何も起こらず、キー1(TestA)、キー2(TestB)を押したときだけウィジェットのテキストボックスの表示が変わるようになります。
つまりキーインプットは投げっぱなしジャーマンで、受ける側は必要な入力だけイベントを作ればOKということなんですね。
便利!

さらに便利なのはCreateWidgetする時に、変数化する際はReturnValueから線を引っ張って変数に昇格とやりがちですがここではそうせず、事前にWidget変数(WidgetのObjectReference)を追加しておき、CreateWidget時にこの変数にRetuenValueをセットしておきました。
そうすると別のウィジェットを作った時も、同様にキーインプットを受けることができるんです!
つまり、ここの例で言うと、
さらに別のWidgetを作る
ThirdPersonCharacterのBPでその別のWidgetをCreateWidgetして、作っておいたWidget変数に代入
作ったWidgetでTestA、TestB、TestCの好きなイベントを追加して自由に処理を書ける

便利!

これのおかげでキーインプットのイベントの先に、どのウィジェットが開かれてるか調べてそれぞれに対応した記述をするなんてことをしないでもOKになりました。
やった!





コメント

このブログの人気の投稿

フィールド⇔バトルについて

Level Streaming完全に理解した(わかってない)

最低限のサウンド再生について