みつまめ杏仁

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

UI ボタンでカメラを切り替える《前編》

突然ですが、ブループリントのタイムラインノードってものすごく便利なのです。

f:id:hiyokosabrey:20190418232904p:plain

UMGには専用のタイムラインが装備されていますが、UMG以外でUIのインタラクションを表現する際に利用します。

ただトラックに直接的な値のKeyを打ってしまうと、とたんに汎用性が無くなってしまいます。

先日のぷちコン第11回でも使った方法なんですが、ちょっと扱い方を工夫するだけで汎用性が高くなってさらに調整がラクになる方法があるので記事にしておくことにします。

 

賢明な読者諸兄はすぐに気づかれるかと思いますが、種明かしをするとこれです。

 

f:id:hiyokosabrey:20190417213555p:plain
 

タイムラインノードから出てくる値は、0.0 ~ 1.0 のみ

 この1個のタイムラインを値を煮るなり焼くなりして使い回すのです。

 

掛け算したり、

f:id:hiyokosabrey:20190417214708p:plain

↑この場合、0.0 ~ 5000.0 の値でアニメーションします。

 

また 0.5から引き算して、2倍すると、 -1.0 ~ 1.0 の値のアニメーションが可能。

f:id:hiyokosabrey:20190417215237p:plain

 

しかも、カーブを調整すれば好みのイージングも作れます。

f:id:hiyokosabrey:20190417214336p:plainf:id:hiyokosabrey:20190417214343p:plain

 変に計算が増えると処理への負荷が無視できなくなりますが、ほどほどに、汎用的に使えるカーブを効率よく使えば、調整にかかる時間が減るのでおススメです。

 

さらにこれを便利に活用するためのノードが、Lerp 系のノード

f:id:hiyokosabrey:20190418233447p:plain

 

扱う型専用にいくつか用意されているようです。

入力ピンの Alpha に 0 ~ 1.0 の数値を入れることで 同じく入力ピン A と B の2つの違う値についてその途中の値を取り出すことができます。例えば、Alphaに 0.5 と入れると、A と B のちょうど中間の値がReturnValueから取り出せます。0 だと A に、1 だと B に近い値になります。

 

Vector や Color のような複数の値を持っている場合で、同時にアニメーションさせる場合にとても効果的なのです。

 

ちなみに Lerp は Linear Interpolate の略で、 漢字で書くと「線形補間」です。

ですがタイムラインのカーブを使えば、変化量が線形じゃなくなります。

 

今回この仕組みを使って、UIのメニューに合わせてカメラを切り替えるのをやってみます。

 

切り替えUIメニュー

まずメニュー用のWidgetから。メニューといっても簡単に四角いボタン的なものが並んでいるだけのものです。

そのボタン的なものは、さくっと簡単に UMG の Button というコンポーネントで作ることにします。まず Button を左のリストから探してキャンバスに 配置します

f:id:hiyokosabrey:20190608111755p:plain

 Anchor は ストレッチ(親要素に合わせて最大まで拡大)でドーンとスクリーンサイズに。Anchor を変えただけでは変化しないのでパラメータを変えます。

Button の Slot(Canvas Panel Slot) は ↓ こんな感じ。

f:id:hiyokosabrey:20190419234722p:plain

 

中にTextBlockを子供として持たせます。

f:id:hiyokosabrey:20190419234037p:plain

TextBlockは ↓ こんな感じ

f:id:hiyokosabrey:20190419235053p:plain

階層構造は↓下のようになってます。

f:id:hiyokosabrey:20190419234201p:plain

 

ここで、クリックイベントを作成します。

配置した Button のDetails(詳細)パネルの下の方に緑色のボタンが並んでいるので、

On Clicked のボタンをクリックします。

f:id:hiyokosabrey:20190419235431p:plain

 強制的に編集モードがGraphモードに切り替わります。

f:id:hiyokosabrey:20190420003037p:plain

イベントノードが置かれていますが、一旦置いておきます。

 

Integer型の変数をひとつ追加します。

f:id:hiyokosabrey:20190420003738p:plain

自身が何番目のボタン番号かを受け取っておくためのものです。

 

次にカスタムイベントを用意します。

Inputピンに、Integer型とText型を追加して、作っておいた 変数 と TextBlock にそれぞれつなぎます。

f:id:hiyokosabrey:20190420004111p:plain

 

次はイベントディスパッチャーを用意します。

f:id:hiyokosabrey:20190420004632p:plain

Inputsのところで+ ボタンを押してInteger型のピンを追加します。

このイベントディスパッチャーを、On Clicked イベントにつなぎます。

イベントディスパッチャーをグラフにドロップすると小さなコンテキストメニューがポップするので、 Call を選択します。

f:id:hiyokosabrey:20190420005034p:plain

f:id:hiyokosabrey:20190420005134p:plain

クリックされたら、自分が持たされているボタン番号を返す仕組みです。

コンパイルして保存します。これでボタンWidgetは完成です。

f:id:hiyokosabrey:20190608112158p:plain

 

 

ボタンWidgetを配置するWidget

次にボタンを並べるための親になるWidgetブループリントを用意します。

キャンバスに HorizontalPanel をひとつ配置します。

f:id:hiyokosabrey:20190420005733p:plain

Slotはこんな感じ。

f:id:hiyokosabrey:20190420010124p:plain

このHorozontalPanelに、先に作ってあったボタンのWidgetを追加します。

既に作成済みのWidgetブループリントはアセットになっているので、

UserCreated カテゴリで探すと見つかるはずです。

それを Hierarchey パネルの HorizontalBox 以下にドロップします。

とりあえずカメラを5台置く予定なのでその数ぶん追加します。

f:id:hiyokosabrey:20190420010933p:plain

追加したらそのまま、まとめて選択状態にします。

f:id:hiyokosabrey:20190420015453p:plain

レイアウトの設定を変更します。

Size が 初期状態でAuto になってるのを Fill に切り替えます。

f:id:hiyokosabrey:20190420015626p:plain

HorizontalPanelにぴっちり並んでくれるはず。

f:id:hiyokosabrey:20190420015842p:plain


キャンバスはこのくらいで。

 

グラフの方を編集します。

まずは並べたボタンたちを一旦配列にします。配列にした方がForEachLoopが使えるのでこ後でちょっとラクができます。

ざっくりですが手順をGIFにしてみました。

f:id:hiyokosabrey:20190421092553g:plain


次にボタンのラベルをテキスト型の配列で用意します。

f:id:hiyokosabrey:20190421170012p:plain

一度コンパイルすると、DefaultValue(初期値)がセットできるようになります。

 

ここで ForEachLoopの出番です。

f:id:hiyokosabrey:20190421202616p:plain

右端のノードは、イベントディスパッチャーが存在することが前提で、そのイベントディスパッチャーにBind(バインド:紐づけ)することが可能になります。そうすることで、ボタンのWidgetからイベントディスパッチャー経由で通知を受け取ることができます。要するにボタンが押されたら、カスタムイベントが実行されます。

 カスタムイベントにはとりあえず今は何もつなげないで、コンパイルしてみます。

すると、キャンバスが変化します。

f:id:hiyokosabrey:20190421203109p:plain

Event Pre Cnstruct につないだ処理は、Play していなくてもコンパイルした時点で、キャンバスに配置したものに影響を与えることができます。


 Widgetは一旦ここまでにします。

 

 

 

カメラの設置

次はカメラとステージを 用意します。

準備としてレベルに、カッコイ風景とカッコイイオブジェクトを設置します。

 

f:id:hiyokosabrey:20190423011937j:plain


レベルに直接カメラを5台配置。アングルを決めます。Field Of View(視野角)も調整します。

 

前編はここまで。

後編は、メインカメラの作成と制御を作っていきます。タイムラインは後編で登場します。

 

ではでは