みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

スピンボックスも作ってみた

 前の記事でインターフェイスを作りましたが、せっかくなのでスピンボックスも作ってみることにしました。

 スライダー同様、ゲームの設定画面とかでよく見かけます。スピンボックスはGUIの1スタイルでMicrosoft Developer Networkのドキュメントに簡単な説明があります → スピンボックス

 

 ▲と▼をクリックするたびに値が1段階変化します。数値を増減させるときに便利なのですが仕組みとしてテキストなどの文字列を入れて使われることもあります。数値のみの場合は明確に区別するために、 Numeric Stepper と呼ぶこともあるようです。

f:id:hiyokosabrey:20180225110925p:plain

 テキストの場合は、序列や段階を意図した言葉選びが重要です。したがって、このUIのメリットは  選択中の状態が分かりやすい ことと、その前後の内容が予測しやすい ことにあります。なので、増減と関連性のない、前後の脈絡のないテキストを選択肢にすると、複数ある選択肢の全体が把握しづらいため一通り送って確認しないと選べないので時間がかかります。

f:id:hiyokosabrey:20180225111352p:plain

ゲームクリア後や実績解除などで、後から選択肢を追加しても画面のレイアウトに影響がないので、開発者にとっては都合のいいUI だったりします。でも途中で内容が増えても気づかないので、Newマークを付けたり、お知らせ表示を入れたりと、開発側としては結局手間がかかることに・・・。用法容量を守り正しく活用したいものです。

 このへんがデメリットとなって使いづらさにつながるので、段階や序列のないテキストを選択肢にする場合はコンボボックスやリストボックスがオススメです。もちろん表示に余裕があれば全部並べて選択させるのがベストです。ゲームのUIってほとんどが選択肢と言っても過言じゃありません。なんらかの選択をユーザーにさせてユーザーの意思を尊重しているかのようにふるまいつつ、都合の悪い選択肢なんて最初から無かったことに・・・うわやめろなにを・・・ゴフゥ・・・中断

 

 

 

 げふげふ(さてさて)、

 今回はスライダーなどと操作方法を統一するために ↑ ↓ キーで項目を選んで、←→キーで内容の切り替えを行うようにします。レイアウトはスライダーと同じように並べるので↓のようになります。

f:id:hiyokosabrey:20180225104855p:plain

新しくWidgetを用意してもいいですが、スライダーWidgetと共通の部分が多いので複製します。

 

 

UMG

f:id:hiyokosabrey:20180225185602p:plain

不要なパーツを消してテキストブロックに置き換えます。

テキストブロックは is Variable にチェックを付けるのを忘れないように。

 

 

Widgetブループリント

必要な変数を用意します。複数の選択肢を扱うので、その個数を保持する integer型の変数と、受け取った選択肢用の Text型の配列変数です。

f:id:hiyokosabrey:20180225190516p:plain

値を受け取る初期設定用の関数 initValue は ↓ のように変更します。

f:id:hiyokosabrey:20180225205556p:plain

 

 値を見た目に反映する関数 updateValue の中身は受け取った配列の中身を取り出すだけなので、 ↓ のようになります。

f:id:hiyokosabrey:20180225204654p:plain

配列のエラーチェックをする場合は IS VALID INDEX ノードが便利です。

f:id:hiyokosabrey:20180225205155p:plain

 

値をアイテムの数だけでループするようにするので、rangeCheck マクロを編集します。

f:id:hiyokosabrey:20180225210010p:plain

 

これでコンパイルしてエラーが出なければ完成。

 

制御用Widget

キャンバスにできたスピンボックスのWidgetを追加します。

f:id:hiyokosabrey:20180225210528p:plain

初期化の関数に追加します。

f:id:hiyokosabrey:20180225210727p:plain

選択肢用のアイテムはここで、Make Arrayノードで渡します。

 

アクティブなWidgetを切り替える関数にも追加します。Switch on Int ノードをAdd pinして割り込ませます。

f:id:hiyokosabrey:20180225210917p:plain

 以上です。メンバーが一つ追加になったのにこの簡単さ。これもインターフェイスのおかげです。

さっそく再生してみましょう。

f:id:hiyokosabrey:20180225212445g:plain

 

これでどんなセッティング画面が来ても対応できそうな気がしてきました。

あと必要そうな処理としては、制御用Widgetに値を返すようにしたり、変更内容をリアルタイムに反映したいときのために イベントディスパッチャーを用意したりすれば完璧な予感。

なんかUIって、表のグラフィックデザインにスポットが当たりがちですが、実際はこういった地味な内部処理が頑張ってたりするんですよね~ とか呟いてみたり。

コンポーネントとして用意されているので、わざわざイチから起こさなくても・・・

という声が聞こえてきそうですが、やっぱり仕組みを知ることで、次の新しいUIが生まれてくる気がするんですよ。

 

今回インターフェイスは使い回したので説明はしてませんが、汎用的なやつが一つあれば結構いろんなUIパーツに適用できるのでおすすめです。

 

というわけで今回はこの辺で。ツッコミとかリクエストとかあればコメントください。

ではでは

ステキなBPインターフェイスライフを!