みつまめ杏仁

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

ちょっと変わった形のゲージをメッシュで作る《後編》

前回の続き。

f:id:hiyokosabrey:20180608002318p:plain

カーブを描いたゲージを作る場合、できるだけ細かいメッシュで作らないと、テクスチャが歪みます。細かいメッシュは頂点数が多くなるのでUV編集が地獄です。キレイに比率を維持してまっすぐなUV展開をしてくれるスクリプトでも書ければいいのですが、労力の割に使用する機会がが少なそうなのもあって、今までほとんど力業で作ってきました。

今回 Blenderのモディファイア『細分割曲面』を使ってみるとローポリからいい感じのカーブができたので作業時間が大幅に短縮できました。Mayaが手元にないので説明できないですが、Mayaでも同様の操作ができるのは確認しています。

 

さてさて

完成したメッシュにテクスチャが貼れたのでFBXの形式でエクスポートします。

FBXのエクスポートについては、過去記事を貼っておきます。 

limesode.hatenablog.com

UE4でインポートしてみました。

f:id:hiyokosabrey:20180608194123j:plain

無事エクスポートできたようなので、Blenderを落として今度はテクスチャを仕上げます。

f:id:hiyokosabrey:20180606225153p:plain

Blenderに持っていったテクスチャを本番用にします。

f:id:hiyokosabrey:20180608214046p:plain

アルファチャンネルは、上下に黒とグレーを1ピクセルずつ。

f:id:hiyokosabrey:20180608214140p:plain

右端の部分を拡大するとこんな感じ。

f:id:hiyokosabrey:20180608214338p:plain

これはポリゴンのエッジをマイルドにする効果があります。

f:id:hiyokosabrey:20180608214758j:plain

このアルファチャンネルを使った余白がないとポリゴンのエッジがクッキリでます。

f:id:hiyokosabrey:20180608215144j:plain

拡大している状態だと目立たないですが、解像度が低かったり、頂点数が少ないとエッジのクオリティが悪目立ちすることがあります。

テクスチャにアルファチャンネルが使えない場合は頂点カラーでアルファを仕込むこともあります。Blenderは頂点カラーにアルファ使えないのでちょっと工夫が必要です。

 

さてさて

テクスチャーのインポート設定ですが、デフォルトのままだとうまくいかないので変更します。

f:id:hiyokosabrey:20180608232553p:plain

ピクセルが荒れてほしくないのでリッチな User Interface2D を選択。

UIでミップマップは不要なので、 No MipMaps

 

今回テクスチャを目いっぱい使ってて、UVスクロールする範囲がテクスチャの外まではみ出しているので、タイリングメソッドを Clamp にしておく必要があります。

 

 

テクスチャをインポートできたら、マテリアルを作っていきます。

コンテンツブラウザのテクスチャアセットのアイコンの上で、右クリックしてCreate Material するとラクチンです。出来立てホヤホヤはこんな状態。

f:id:hiyokosabrey:20180608225408p:plain

UI用に設定を変更します。

f:id:hiyokosabrey:20180608230116p:plain

半透明を使用するので、Blend Mode を Translucent に、

光源計算しないので、 Shading Model を Unlit にします。

あと、忘れがちなのが、Apply Fogging。

f:id:hiyokosabrey:20180608230239p:plain

フォグもいらないので外します。

 

設定が変わると、マテリアルのピン構成が変化するのでつなぎ直します。

f:id:hiyokosabrey:20180608230534p:plain

この状態でメッシュにセットしてみます。

先にインポートしてあったメッシュのエディタを開いてセットします。

f:id:hiyokosabrey:20180608231425j:plain

こんな感じになりました。

f:id:hiyokosabrey:20180608231704j:plain

これをゲージらしく増減できるようにします。

マテリアルを以下のように組みます。

f:id:hiyokosabrey:20180608232012p:plain

左端のノードが、Scalar Parameter Value ノードです。ブループリントから値を受け取ることができます。

OneMinus(1-x)ノードで値を反転しています。これは、0 の時にゲージが満タンで、1.0 の時に空っぽになるのを逆にするためです。

AppendノードのAとBは、それぞれ UとV で、Uが水平方向、Vが垂直方向です。

 

では、ブループリントを作ります。

f:id:hiyokosabrey:20180608233932p:plain

まずは、メッシュをコンポーネントとして追加します。

緑の Add Component ボタンを押して、Static Mesh を選択します。

f:id:hiyokosabrey:20180608234215p:plain

そのままだと空っぽなので、

Detailsタブから、作ったメッシュをセットします。

f:id:hiyokosabrey:20180609074235p:plain

マテリアルをここで付けることもできます。

今回は Dynamic  Material Instance にするので、マテリアルの有無は無視できます。

 

グラフのタブを Constuction Script に切り替えて、以下のようにつなぎます。

f:id:hiyokosabrey:20180609075340p:plain

上図は Dynamic化するマテリアルを直接セットしてますが、すでにメッシュにマテリアルがセットされている場合はGet Material ノードを使うこともできます。

 

ちなみに Dynamic Material Instance の語順が気になるところですが、公式のドキュメントには括弧書きで MID としているので、右端の変数名 は MIDで始めてます。

以下キャプチャして抜粋。

f:id:hiyokosabrey:20180609080345p:plain

Instanced Materials | Unreal Engine

 

グラフのタブを EventGraph にして、新しく Float型の変数を2つ用意します。

一つはカスタムイベントにつないで、外から受け取るようにします。

f:id:hiyokosabrey:20180609082533p:plain

このブループリントでは「UI表示」が主な仕事としているので、ゲージの長さを計算するようなものはありません。値を受け取って素直に表示するだけにします。

ひとまず受け取る値は 0.0 ~ 1.0 を想定。1.0=100%で満タンという仕様です。

 

ゲーム開発ではゲームバランスの調整が理由で体力の上限はよく変動します。成長要素があればプレイ中に変動します。なので、そのあたりはゲームシステムの方でプログラマに集約、管理してもらうのが無難です。

 

で、受け取った値をゲージに反映する部分はこうなります。

f:id:hiyokosabrey:20180609083815p:plain

素直に反映するだけだと面白くないので動きを入れてます。簡単なイージングです。

 

処理負荷的に渋い顔されたら、さっきのカスタムイベントでこうすればOKです。

f:id:hiyokosabrey:20180609084033p:plain

 

ブループリントは完成です。

ワールドで確認します。簡単な方法は ゲージのBPをワールドにドロップして直接置いてしまう方法です。UIなので実際には誰かに Spawn してもらう方法になるかと思います。

今回は直接置きました。

f:id:hiyokosabrey:20180609084814j:plain

 

レベルブループリントを開いて編集します。エディタのBlueprintsボタンから選択。

f:id:hiyokosabrey:20180609085149j:plain

 

ワールドアウトライナからゲージのBPをドラッグ&ドロップします。

f:id:hiyokosabrey:20180609085421p:plain

 

この青いピンからドラッグして、中のカスタムイベントを探します。

f:id:hiyokosabrey:20180609085715p:plain

検索フォームで、call ってすると、関数とイベントを候補として絞り込むことができます。実はエンジンの言語設定を英語にしている最大の理由がこれです。検索キーワードを1個覚えるだけです。

日本語環境だとこれができないので結構ストレスに感じるのは私だけ?

f:id:hiyokosabrey:20180609090446p:plain

f:id:hiyokosabrey:20180609090921p:plain

ショートカットキーも使うからいちいち入力モード切り替えるの面倒だし・・・

 

で、関数を取り出してつないだら、Input ノードをつなぎます。

f:id:hiyokosabrey:20180609090906p:plain

Random Float in Range ノードは処理が走るたびに、指定した範囲で乱数を発生させてくれます。

 

コンパイルして、再生してみましょう。

f:id:hiyokosabrey:20180609091425j:plain

しーん・・・

カメラに映るように調整したはずなのに・・・。

実はこれ変数の初期値が 0.0 になっているからです。

ゲージが満タンから開始するには、変数に初期値を入れておきます。

いろんな入れ方があるのですが今回は、レベルBPの方で入れることにします。

f:id:hiyokosabrey:20180609091847p:plain

再生してみると、

f:id:hiyokosabrey:20180609091959j:plain

ちゃんと出てきました。

スペースキーを叩いてみましょう。

f:id:hiyokosabrey:20180609092605g:plain

うまくいったようです。

30fpsでGIF化したのでちょっとぎこちないけど、実際はもう少し滑らかに動きます。

 

以上で完成、といっても毎度のことながら、モックアップ的な作りですみません。

《後編》はここまでにしようと思いますが、このままだとちょっと物足りないので、次回《おまけ編》を書こうと思います。

 

ではでは

ステキなゲージライフを!