みつまめ杏仁

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

UMGのフォントをアレンジ

f:id:hiyokosabrey:20160827205227p:plain

UE4で扱えるフォントは大きく分けて2種類あります。これは実装方法によって分けられています。ひとつは Runtime(ランタイム)と呼ばれるもので、これはTrueTypeFontやOpenTypeFontでおなじみのアウトライン情報をメモリに埋め込んで利用します。文字の量が膨大になっても容量は少なくて済み、またどんなサイズでもキレイに表示できるのでコスパ的にセリフや字幕、説明用のテキスト表示に最適です。

もう一つが、Offline (オフライン)と呼ばれているもので、これは昔からある手法で、文字をラスタライズ(ビットマップ化)してテクスチャにします。後からPhotoshopなどでドット修正できたりフチドリやエフェクトを乗せることができるので使い勝手がいいのですが、最大の欠点は、文字サイズが固定なのと、文字量が増えるとテクスチャ容量が大変なことになるという点です。最近の多言語対応や、テキストチャットなど考えると、漢字だけでも20,000文字越えるので、Runtime のありがたみをしみじみと味わっている今日この頃です。

 

さてさて

現状 UMGで扱うことのできるフォントは、Runtime(ランタイムフォント)しか使えないようですので、今回はこのランタイムの文字で遊んでみました。

このランタイムフォントは、ラスタライズされていない状態でメモリに載っているので、テクスチャのよう加工方法が使えません。テキストブロックをビューポートに描いた時点ではじめてラスタライズされるからです。えー じゃぁグラデーションは?

ということでDetailsタブをいろいろ調べてみると、どうやらマテリアルが使えるようです。ニヤリ。

 

まず↓のようなテキストブロックをキャンバスに置きます。

f:id:hiyokosabrey:20160827205325p:plain

UMGでは斜体が簡単に掛けられるのでイイですよね。

で、マテリアルを作るのですがその前にテクスチャを2枚。

f:id:hiyokosabrey:20160827205933p:plain  16x128 の24bit Targa

f:id:hiyokosabrey:20160827205939p:plain  64x64 24bit Targa

それぞれインポートします。

64x64の方は Opacity につなぐので、sRGBを切って Grayscale(sRGBを切るとマテリアル内ではLinearGrayscale) にします。

このテクスチャを使ってマテリアルを作っていきます。

f:id:hiyokosabrey:20160827210658p:plain

緑のノードは、ScalarParameterValue ノードです。 ブループリントから触れるようにしたり、マテリアルインスタンスから触れるようにするためのノードです。 とりあえずパラメータ名 を "param" にしました。パラメータ名をセットすると、ノード名のように表示されます。フェードインすさせるので初期値は 0.0 がいいのですが、このあと作業しづらいので、いったん 1.0 にしておきます。

UMGで使うので、右端のマテリアルドメイン(マテリアル属性)はUser Interface を選択します。

マテリアル完成です。Apply してSaveしたらウィンドウを閉じてOK。

 

ここでUMGに戻って、さっきキャンバスに置いたテキストブロックにセットします。

エディタウィンドウ右のDetailsタブにある Appearance > Font の中です。

f:id:hiyokosabrey:20160827205720p:plain

このままでは何も変化しないので、アニメーションを作ります。

適当にこのテキストブロックがフェードインしてくるのを用意します。

f:id:hiyokosabrey:20160827211828p:plain

1秒かけてアルファを 0.0 から 1.0に 上げています。

このアニメーションを再生するようにします。

エディタをGraphモードにして、Event Construct ノードにつなぎます。

f:id:hiyokosabrey:20160827212208p:plain

Event Construct ノードはビューポートに描かれたタイミングで処理が流れてくるイベントです。

この辺で、いったんコンパイルして保存します。

レベルブループリントで以下のようにノードをつなぎます。

Create Widget ノード に Add to Viewport ノードです。Class のところに上で作ったWidgetをセットします。

f:id:hiyokosabrey:20160827212848p:plain

Playして確認してみると、

f:id:hiyokosabrey:20160827220106g:plain

まぁフツーですね。

このアルファを使ったフェードインを、マテリアルに仕込んだパラメータに渡します。

 以前にこの方法を紹介していたので貼っておきます。

limesode.hatenablog.com

マテリアルを操作するためには DynamicMaterial を作ってやる必要があります。過去記事では Image パーツから Get Dynamic Materialノードで進めていますが、同じ方法で テキストブロックのマテリアルからDynamicMaterialが作れないことが判明。困った。

・・・

イロイロ調べた結果、なんとかその方法が見つかりました。

まずブループリント(Widget以外)でやるのと同じように、先に Create Dynamic Material Instance します。(Play Animationノードはひとまず除けておきます)

f:id:hiyokosabrey:20160827221931p:plain

Parent のところにUMG用に作ったマテリアルをセットしておきます。

キャンバスに置いたテキストブロックは変数化して使うので、Designerモードで Is Variableのチェックボックスにチェックを付けます。

f:id:hiyokosabrey:20160827223006p:plain

再び編集モードをGraphに戻すと、テキストブロックがエディタ左の Variables の中に並んでいるはずです。これをグラフにドラッグ&ドロップします。

そこから、下のようにノードをつないでいきます。出力ピンからドラッグして、"get font" とか、"break" 、"make" とかで検索すると速く見つけられます。

f:id:hiyokosabrey:20160827223420p:plain

これで、ようやくテキストブロックに Dynamic Material が、セットできました。

最後に、よけておいたPlay Animatonノードをつないでやります。

f:id:hiyokosabrey:20160827224545p:plain

Event Construct はこれで完成。

次に Event Tickです。

アニメーションのアルファ値を拾ってDynamicMaterialに渡します。

f:id:hiyokosabrey:20160827224640p:plain

 なぜか Get Color and Opacity ノードから、直接 Break LinearColor ノードが取り出せないので、いったん Break SlateColor しています。

 

完成です。

再生してみましょう。

f:id:hiyokosabrey:20160827230323g:plain

Opacityのアニメーションを改造すると、もっといろんなバリエーションが楽しめそうです。

 

グラデーションもテクスチャを使わない方法があります。

f:id:hiyokosabrey:20160827230651p:plain

 

UMGのRuntimeフォントをアレンジできれば結構オリジナリティも出せて、リッチに見えるので、ネタを思いついたらまた紹介しようと思います。

 

ではでは

今回はこの辺で

 

マテリアルで目パチ

キャラ絵の目パチ(まばたき)は口パクのようにセリフと連動することはありませんが、キャラが生きていることを表現するために必要な演出です。

その目パチの間隔をランダムで制御しようとするとそれなりにノードを組む必要があります。かといってタイムラインで制御しようとすると、他のアニメーションとバッティングするかもしれません。特に制御する必要がないけどそれなりに動いていてほしいのが目パチです。

そこで、マテリアルを使って目パチアニメーションを仕込んでみます。

 

まず2枚のテクスチャを用意します。

f:id:hiyokosabrey:20160821203425p:plain   f:id:hiyokosabrey:20160821203431p:plain

ほんとは動く部分だけを切り出して重ねた方がいいのですが、位置合わせが面倒だったのでちょっと贅沢な作りでいきます。

 

つぎにタイムラインに相当するテクスチャを用意します。

f:id:hiyokosabrey:20160821203805p:plain

128x8 のMaskテクスチャです。白と黒の2色のみです。

小さくても十分なので、キャラ絵のテクスチャにすき間があったらそこに入れることでキャラ固有のパターンが用意できますが、今回は別テクスチャにしています。

 

白黒2階調のテクスチャなので、フォーマットをMaskにします。

最初に Photoshopで 24bit の Targa形式で書き出して、インポート設定を以下のようにします。設定を変更したら Reimport ボタンを押してから Save します。

f:id:hiyokosabrey:20160821204613p:plain

 

テクスチャが用意できたのでマテリアルを作ります。

コンテンツブラウザから、3つのテクスチャノードをドラッグ&ドロップして並べます。それぞれを if ノードにつなぎます。

f:id:hiyokosabrey:20160821205303p:plain

次にアニメーションさせるために Panner ノードとサイズを調整する Tex Coordinate ノードをつなぎます。

f:id:hiyokosabrey:20160821205744p:plain

マスクテクスチャの解像度と白い部分の幅とでベストな値が変わります。

 

もうひとつ、if ノードの Bのピンにつなぐために  Constant ノードを用意します。

数字の1キーを押しながらクリックすると取り出せます。とりあえず 0.5 としておきます。

f:id:hiyokosabrey:20160821210248p:plain

では合体!

f:id:hiyokosabrey:20160821210423p:plain

完成です。

f:id:hiyokosabrey:20160821211913g:plain

 

 

マスクテクスチャの白い部分の間隔をいじればタイミングが調整できます。

f:id:hiyokosabrey:20160821203805p:plain

これも一つのタイムラインです。

テクスチャなんで容量は無駄に食いますが、プログラム的にややこしいことを一切していないのと、デザイナーが調整しやすいことがメリットではないでしょうか。

 

あと、if ノードのピンが1つ空いているので、もう1枚 絵入れて3パターンにすることもできます。

 

ではでは

今回はこの辺で

 

 

 

 

 

円形ゲージのアレンジとテクスチャの節約

UE4はマテリアルで円形のゲージが簡単につくれます。公式のドキュメントに載ってるので、ここで紹介しなくてもいいかな~とか思ってたんですが、購読してるブログ、ぼっちプログラマのメモにあった

pafuhana1213.hatenablog.com

を見てて、ちょっと試してみたくなったのでそのメモです。

 

同じようにカギを握るこの VectorToRadialValue ノードさんですが、

f:id:hiyokosabrey:20160811041208p:plain

せっかく面白そうな出力が3つあるので全部使ってみました。

で、できたのがこれ。

f:id:hiyokosabrey:20160811044028p:plain

ゲージの増減は、Vector Converted to Angle の出力ピンをValueStep ノードのMaskOffset値で調整して行います。

そこはあちこちで紹介されているのと当ブログでよくお世話になってるので、ここではスルーします。

 

ゲージの色がただの単色だと見た目にしょぼく見えるので、グラデーションをのせたくなったりします。そこで以下のようなテクスチャを作ることになると思います。

f:id:hiyokosabrey:20160811050900p:plain  f:id:hiyokosabrey:20160811051056p:plain

狭い範囲にたくさんの色が入ってきて、テクスチャの圧縮がかかるとノイズがでます。

かといって大きくすると容量がもったいない感じです。

そこで使うのが、RadialCordinateの出力ピンです。

f:id:hiyokosabrey:20160811050301p:plain

使ったテクスチャは 128x16 です。

f:id:hiyokosabrey:20160811044118p:plain  RGB

 

これを使うと、テクスチャが安く作れて、グラデーションの調整が捗ります。

しかも境界のハッキリしたゲージの場合、アンチエイリアス用の中間色を入れやすいので、Photoshopのグラデーションツールに時間をかけなくても済みます。

解像度が気になる場合は、そのまま横方向に伸ばすだけなのでコスパ的においしいはず。

 

次にリングの形にするためにアルファマスクを使うのが一般的?だと思います。そうすると、大きくなるとその分大きなマスクテクスチャが必要になって、なんかもったいない感じのテクスチャが生まれます。

f:id:hiyokosabrey:20160811045819p:plain

これもRadialCordinate の出力ピンで解決できます。

f:id:hiyokosabrey:20160811051946p:plain

上のグラデーションテクスチャのアルファチャンネルに入れておくだけなので結果的にテクスチャが1枚で済みます。

 

f:id:hiyokosabrey:20160811044213p:plain Alpha

 

左端の StaticBool ノードは、テクスチャを丸くする際の方向を決めるスイッチです。

リングの太さの調整は白い部分の幅と位置を調整するだけなので、テクスチャを更新するだけでいろいろ見た目が調整できるようになります。

 

これで完成してしまったのですが、

一応 3つ目の出力ピン Linear Distance を使ってみます。

中央から放射状にグラデーションで出力しているようなので、そこを取り出すために、if ノードを使ってみました。

f:id:hiyokosabrey:20160811053239p:plain

これ最初見たとき、「なんじゃこりゃ」と思ってたんですが使ってみると以外に便利ですね。

 ようするに、AとBの値を比較した結果3つに分岐することになります。「AはB以上」なのか「AとBが同じ」なのか「AはB未満」なのか、です。

で、その該当するピンに値をつなげておくと、その分岐にもとづいて流れます。

よく使われるのが、セルシェーダー(アニメ塗りみたいになるやつ)とかデプス(深度)比較です。

f:id:hiyokosabrey:20160811095220p:plain

f:id:hiyokosabrey:20160811094520p:plain f:id:hiyokosabrey:20160811094525p:plain

これを利用して、グラデーションからリングを作ります。

 

 まず大きめの●を作ります。B のピンを 0.75 にしました。

f:id:hiyokosabrey:20160811184120p:plain

小さめの●を 0.6 で作って引き算します。

f:id:hiyokosabrey:20160811184604p:plain

全部つなぐと、

f:id:hiyokosabrey:20160811185044p:plain

 この方法だと、テクスチャに依存しないのでどんな大きさでも作れますが、その代わりエッジのジャギーが気になります。

f:id:hiyokosabrey:20160811185234p:plain

 

そこで最後に、リングを作るもう一つの方法を試しました。

前回の記事でも登場した、GeneratedBand ノードです。

ちょっと調整が微妙なんですが、いい感じです。

f:id:hiyokosabrey:20160811190029p:plain

f:id:hiyokosabrey:20160811190200p:plain

この方法も、どんなに大きなリングでも大丈夫です。

 

一応テクスチャでリングを描いた場合のも載せておきます。

f:id:hiyokosabrey:20160811190720p:plain

最初に載せた3つのゲージはこのように作られたものでした。

 

マテリアル属性が User Interface の場合ですが処理の比較です。

f:id:hiyokosabrey:20160811191146p:plain  f:id:hiyokosabrey:20160811191156p:plain

左側が、if ノードと、GeneratedBand ノードで作った場合。

右側が テクスチャだけで作った場合です。

instructions は 「命令」だと思うので、テクスチャだけで作った方がほんの少し軽そうです。

 

というわけで、今回はこの辺にしておきます

ではでは

素敵なゲージライフを

あのニュゥーって伸びながら出てくるヤツ

スーファミとかメガドライブの頃かな、昔のゲームでよく見かけた気がするんだけど、あのニュゥーって伸びながら絵が出来上がっていくやつをマテリアルで再現してみた。

f:id:hiyokosabrey:20160807193613p:plain

 

ちょっと大きいので全体図を のパートに分けて紹介します。

f:id:hiyokosabrey:20160807195104p:plain

 

まずは から。

まとめのとこなので、Add(加算)とMultiply(乗算)ばかりです。

f:id:hiyokosabrey:20160807195630p:plain

つぎにとなりの

f:id:hiyokosabrey:20160807200129p:plain

ここでテクスチャをつなぎます。上下に2つ並んでいるのは同じテクスチャサンプルノードなので複製してOK。UVの切り出しが違うので2つに分けています。

下のValueStepLinearGradientノードは、正常な部分伸びてる部分を分けるために使います。

次に 正常な部分の

f:id:hiyokosabrey:20160807201315p:plain

伸ばす部分を切り出すために1ピクセル分をテクスチャサイズで割っています。

 

最後に引き伸ばす部分の

f:id:hiyokosabrey:20160807201859p:plain

扱う値がUVなので 2Vector にするために、 AppendVectorノードをつないでいます。

確認のために、サインカーブを生成してつないでいますが、実際にはScalarParameterノードにして、タイムラインなどブループリント経由で数値を渡すことになるかと思います。

f:id:hiyokosabrey:20160807202531p:plain

できあがりです。

 

f:id:hiyokosabrey:20160807202858p:plain

f:id:hiyokosabrey:20160807202908p:plain

f:id:hiyokosabrey:20160807202913p:plain

 

テクスチャの大きさで絵が切れるので、端っこがスパッと切れるのが気になる場合は、

グラデーションで端っこがふわっと黒くなるテクスチャを作ってOpacityに掛けてあげればいいと思います。UVの切り出し方向と移動の方向を変えると、タテ方向や逆方向も可能です。

 

ではでは今回はこの辺で。

 

 

 

 

 

マテリアルで棒グラフを作る

カラフルな棒グラフをマテリアルで作ってみたら以外に簡単にできたのでメモ。

↓どこかで見たことがあると思いますが、UE4で再現してみました。

f:id:hiyokosabrey:20160730125451p:plain

割合の計算はしないタイプで、パラメータをそのまま追加していきます。

 

マテリアルのみでテクスチャーは使いません。

ということで、まずマテリアルファンクションを作ります。

作り方を書いてるので過去記事貼っておきます。

limesode.hatenablog.com

マテリアルファンクションを作っておくと、繰り返す処理をするときや、いつもの同じ処理をさせるときに手数が減ってラクできます。

今回はこんな感じ。

f:id:hiyokosabrey:20160730152458p:plain

赤いノードがたくさんありますが、入力を受け取るのはInputと付いたノードで3つあります。

まんなか辺りにドカンといるのが、今回のキモとなる GeneratedBand ノードです。

band で検索すると見つかります。

f:id:hiyokosabrey:20160730153114p:plain

2つとも パラメータ入力ピン に Offset を持っています。~OffsetBands の方はスペルが複数形なのと、中に Bands というスカラー型の入力ピンを持っている程度の違いしかないのですが、ノード名にOffset が入っている理由がいまひとつぴんとこないです。

さてさて今回は GeneratedBand の方を使います。

f:id:hiyokosabrey:20160730154711p:plain

(カッコ)の中の文字は受け取る値の型を表しています。

S ・・・ Scalar (スカラーベクター型と違って値が単品)

B ・・・ Boolean (ブーリアン型  True か False の2つの値のみ)

V2 ・・・ Vectorベクタースカラーの値が2つ合わさった状態 UVとか)

V3 ・・・ Vectorベクタースカラーの値が3つ合わさった状態 RGBとかXYZ

V4 ・・・ Vectorベクタースカラーの値が4つ合わさった状態 RGBAとか)

ピンの色がグレーなのは、初期値がセットされているので何もつながなくても大丈夫。という意味です。

 

各ピンの値がどう働くのか調べてみました。

f:id:hiyokosabrey:20160730160336p:plain

 

f:id:hiyokosabrey:20160730161053p:plain

この値を入力するのは、Static Bool ノードを使います。

f:id:hiyokosabrey:20160730161135p:plain

 

f:id:hiyokosabrey:20160730161820p:plain

Offset の値でバンドの移動させる方向と移動する量が指定できます。

Compareの値によっては移動量に気を付ける必要があります。

 

f:id:hiyokosabrey:20160730162825p:plain

 

f:id:hiyokosabrey:20160730162431p:plain

今回は横方向のゲージで左端から増えていって、境界をクッキリさせたいので、いくつか固定値にしています。

 

Direction Switch ・・・ false

Compare ・・・ 0.0

Sharpness ・・・ 1.0

 

幅と位置、カラーが変動するのでそれを入力値用のノードをつないでいます。

このマテリアルファンクションの設定で Expose Library というのがあるのでチェックを付けて保存します。(付けておくとノード検索できるようになり便利です)

f:id:hiyokosabrey:20160730163413p:plain

 

マテリアルファンクションができたので、普通のマテリアルを作ります。

さっき作ったマテリアルファンクションを取り出して、

f:id:hiyokosabrey:20160730163956p:plain

ConstantV3 ノードで『色』を、ScalarParameterノードで『幅』をつなぎます。

次のカラーのために Subtract(引き算)ノードを取り出します。

このセットをまるっと複製してつないでいきます。なんか編み物みたいな感じ。

f:id:hiyokosabrey:20160730164823p:plain

とりあえず 8色分つなぐとこんな感じ

f:id:hiyokosabrey:20160730165248p:plain

これをトーナメント表のように Add ノードを使って足し算していきます。

f:id:hiyokosabrey:20160730165613p:plain

最終的にこうなりました。

f:id:hiyokosabrey:20160730165630p:plain

簡単にUMGで表示するので、マテリアルドメインを UserInterface に変えています。

スタティックメッシュやスプライトの場合は Surfaceのままで大丈夫です。

スカラーパラメータのパラメータ名はすべて違う名前にしないと誤作動するのでご注意。

これでマテリアルは完成です。

 

実験するために Widgetを用意します。キャンバスにImageパーツをドラッグ&ドロップしたら、適当なサイズにします。

f:id:hiyokosabrey:20160730170028p:plain

このパーツに、作ったマテリアルをセットします。

Detailsタブの Appearance > Brush > Image からセットできます。

f:id:hiyokosabrey:20160730170241p:plain

コンテンツブラウザでマテリアルをフォーカス(ハイライト)しておいて、白い矢印を押すとラクちんです。

 

次に、編集モードを Graphに変えて、Widgetブループリントを編集します。

Float型の配列変数を用意します。グラフに初めから置かれているEventConstruct ノードにつないで、マテリアルに渡す値を8色分設定します。

f:id:hiyokosabrey:20160730170545p:plain

 ここでダイナミックマテリアルインスタンスを作っておきます。

キャンバスに置いたImageパーツが エディタ左の Variables 欄に並んでいるはずなので、グラフにドラッグ&ドロップしたら Get Dynamic Material ノードをつないで ReturnValue ピンの上で右クリックします。Promote to Variable を選択すると変数が追加されるので良い感じにリネームします。

 

次に値を反映するための関数を用意します。

Float型の配列を受け取れるようにします。

f:id:hiyokosabrey:20160730171643p:plain

その受け取った配列から Getノードで一つづつ値を取り出しては Set Scalar Parameterノードに渡していきます。

f:id:hiyokosabrey:20160730171505p:plain

 

最終的にこんな感じ。

f:id:hiyokosabrey:20160730171930p:plain

関数ができました。

 

とりあえずさくっと実験表示してみたいので、最初のEventConstructの続きにつなぎます。

f:id:hiyokosabrey:20160730172312p:plain

Widgetはこれで完成です。

 

あとは、いつものようにレベルブループリントからビューポートに追加するだけです。

f:id:hiyokosabrey:20160730175328p:plain

合計値が 1.0を越えないようにいろいろ値を入れてみると楽しいです。

f:id:hiyokosabrey:20160730175926p:plain

 

UMGでスケールアニメーションをあらかじめ用意しておいて、値を渡すと内容が変わるタイミングでアニメーションを再生すると、けっこうリッチな感じになるのでオススメです。

 

今回はこの辺で。

 

素敵なゲージライフを

 

 

ゲージの長さに合わせてカラーを変える

Lerp を使うと、AとB2つを線形補間して途中地点の値を拾うことができます。

似たようなやり方で、ちょっと変わったゲージの作り方を紹介します。

 

まずグラデーションでカラフルにしたテクスチャを作ります。

f:id:hiyokosabrey:20160728231044p:plain

サイズは小さくていいので 256x16です。

このテクスチャをインポートする際は、ピクセルが荒れないように Compression SettingsUserInterface2D(RGBA) にします。あと、X-axis Tiling MethodClampにします。Clampはタイリングしないという意味です。

f:id:hiyokosabrey:20160728231636p:plain

インポートしたテクスチャアセットから Create Material します。

マテリアルは下のようにつなぎます。

f:id:hiyokosabrey:20160728232118p:plain

左上の赤いノード TexCoordinate の設定値を変更します。Detailタブから変更できます。UTiling の値を 0.0001 にします。テクスチャの大きさがヨコ256pxなので、1ピクセルの大きさは、1/256で 0.00390625 になります。それよりも小さい数字にしています。

f:id:hiyokosabrey:20160728232423p:plain

Value と書かれたノードは、Scalar Parameterノードです。

f:id:hiyokosabrey:20160728233040p:plain

パラメータ名は、あとでWidgetブループリントから触ります。

ゲージが満タンからスタートするので、初期値は 1.0 をセットしておきます。

溜まっていく方のゲージだと 0.0スタートです。

線形グラデーションを生成する LinearGradient と 2階調化する ValueStep ノードは、直線型のゲージを作るときにのド定番です。

マテリアルはこれで完成です。Saveして閉じます。

 

マテリアルができたら、次はWidgetです。コンテンツブラウザの右クリックメニュー、

User Interface から Widget Blueprint を作成して編集します。

Imageパーツをキャンバスにドラッグ&ドロップします。適当な大きさにしたら、

f:id:hiyokosabrey:20160728234032p:plain

作ったマテリアルをセットします。

DetailsタブにAppearance という項目を探します。中に Brush > Image という設定項目があるのでここにセットします。

f:id:hiyokosabrey:20160728234440p:plain

 

次はブループリントです。

編集モードを、Designer から Graph に切り替えます。

最初から置かれている Event Constructionノードに以下のようにつなぎます。

f:id:hiyokosabrey:20160728235312p:plain

右端は、Get Dynamic MaterialノードのReturnValueから、Promote to Variable して変数化したノードです。

次にゲージの長さを変えるための関数を用意します。

上で変数化したものから Set Scalar Parameter Value ノードを取り出してつなぎます。

f:id:hiyokosabrey:20160729044700p:plain

パラメータ名のところに、マテリアルを作ったときのScalar Parameterノードに設定した名前を間違えないように入力しておきます。大文字小文字は区別されません。

出来上がりです。コンパイルして問題なければ保存します。

 

確認するためにレベルブループリントを編集します。

まずは画面に表示するところ。

f:id:hiyokosabrey:20160729045645p:plain

Float型の変数を一つ用意します。それをEvent Begin PlayノードにSetでつないで初期値を入力しています。変数の初期値はDetailsタブでできますが、あえてノードで指定しておく方が、ブループリントの構造が分りやすくなって便利です。

このFloat型の変数を使ってキー操作で増えたり減ったりする部分を作ります。

f:id:hiyokosabrey:20160729050433p:plain

最後にゲージの長さを変える関数を呼び出しでつないで完成です。

関数は Create WidgetノードのReturn Value から取り出します。

f:id:hiyokosabrey:20160729050809p:plain

完成です。

Playしてみましょう。

f:id:hiyokosabrey:20160729051616p:plain

ゲージの長さに合わせてカラーが変化します。

グラデーションテクスチャの内容次第なので、調整してみてください。

 

ではでは

素敵なゲージライフを

 

 

 

 

 

 

ラバランプ風のゲージ

スプラトゥーンのフェス楽しかったです。もうないのかと思うとさみしい。開発スタッフおつかれさまです。

で、そのスプラトゥーンのバトル結果ゲージをつくってみようと思い立ってそれっぽくなったのでメモ。

今回はマテリアルがメインです

 

まずはテクスチャ。

シームレスなパターンなのですが、ぼかしが強いのでちょっとだけ工夫します。

Photoshopで 1024x512のテクスチャに大小の●を描きます。この段階でハミ出さない無いように注意しながらいい感じに配置します。

f:id:hiyokosabrey:20160724115907p:plain

これをタテ2倍にします。拡大ではなくコピーで。

f:id:hiyokosabrey:20160724120056p:plain

これをぼかします。

f:id:hiyokosabrey:20160724120145p:plain

これを カンバスサイズ 1024x512 で真ん中をだけを残せば出来上がり。

f:id:hiyokosabrey:20160724120406p:plain

これを24bitのTarga形式で書き出します。

 

UE4のインポート設定は以下。

f:id:hiyokosabrey:20160724120828p:plain

テクスチャをもう一枚用意します。1024*512です。

f:id:hiyokosabrey:20160724121010p:plain

ゲージごときにでかいテクスチャですが、RGBAフルで持ってないので512KBです。

圧縮するとノイズ(ゴミ)が出るので非圧縮でグレースケール(輝度情報のみ)なのです。まだサイズを小さくできますが説明が増えるので、今回はこのサイズでいきます。

 

できたテクスチャアセットからマテリアルを作成します。

右クリックから Create Material が便利。

 上の操作だと一つ目は最初からつながれてます。TextureSampleノードにエラーが出てたら、設定 Sampler Type を LinearGrayscale に変更します。

f:id:hiyokosabrey:20160724192911p:plain

そこにもう一つのテクスチャアセットをドラッグ&ドロップします。

 

この2つのテクスチャに必要なノードをつないでいきます。

f:id:hiyokosabrey:20160724212315p:plain

Addすると、1.0以上の値になる部分がでてくるのでクランプしています。

TextureCoordinateノードのTiling値は、●が正円になるように見た目で調整します。

 

次にこのグレーのモヤモヤした状態を2階調化します。

上のクランプした値を ValueStep ノードの Gadient ピンにつないで、

Mask ピン には、サインカーブを調整しながらつなぎます。

f:id:hiyokosabrey:20160724202601p:plain

基本の部分はだいたい完成です。

ラバランプっぽくするためにリニアグラデーションを加算しておきます。

f:id:hiyokosabrey:20160724203217p:plain

 

ここでいったんこの部分はここまでにしておいて、カラーの部分を作っていきます。

f:id:hiyokosabrey:20160724203906p:plain

ここに、ゲージの割合を調整する部分をつなぎます。

f:id:hiyokosabrey:20160724204442p:plain

LinearGradientValueStep は棒ゲージを作る際はとても便利な組み合わせです。

OneMinus ノード(1-x) で白黒反転です。

 

最期の仕上げにテクスチャと合体です。

f:id:hiyokosabrey:20160724205455p:plain

全体にだいぶ大きくなりました。

f:id:hiyokosabrey:20160724205517p:plain

マテリアルエディタのプレビューではこんな感じです。

f:id:hiyokosabrey:20160724205634p:plain

かなり もにゅ~ って感じになりました。

マテリアル完成です。

 

あとはこれをUMGのImageパーツにでも貼り付ければ出来上がり。

スカラーパラメータをつないであるので、Widgetブループリントからいじってやればゲージらしく色の割合が左右に変化します。

f:id:hiyokosabrey:20160724211426j:plain

Photoshopのグラデーションのきめ細やかさと、サインカーブの具合で滑らかになったり雑になったりするので、調整次第ですがこういった見た目にちょっとひと工夫入れるだけでUIもゴージャスになります。